Docker Compose

2023-05-16

1. 简介

Docker-Compose 项目是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。

Docker-Compose将所管理的容器分为三层:

  • 工程(project)
  • 服务(service
  • 容器(container

Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。

2. 安装

$ curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

$ docker-compose --version
Docker Compose version v2.2.3

3. YAML 模板

默认模板文件为 docker-compose.yml

version:指定版本,不同版本的语法略有差异

build:镜像构建参数

version: "3.7"
services:
  webapp:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        buildno: 1
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label-with-empty-value"
      target: prod
  • context:路径
  • dockerfile:Dockerfile 文件名
  • args:构建参数,即构建过程中的环境变量
  • labels:设置构建镜像的标签
  • target:多层构建,可以指定构建哪一层

cap_add,cap_drop:添加或删除容器拥有的宿主机的内核功能

cap_add:
  - ALL # 开启全部权限

cap_drop:
  - SYS_PTRACE # 关闭 ptrace权限

cgroup_parent:为容器指定父 cgroup 组,意味着将继承该组的资源限制

cgroup_parent: m-executor-abcd

command:覆盖容器启动的默认命令

command: ["bundle", "exec", "thin", "-p", "3000"]

container_name:指定自定义容器名称,而不是自动生成的名称

container_name: mysql-server

depends_on:启动依赖关系

  • docker-compose up :以依赖性顺序启动服务。
  • docker-compose up SERVICE :自动包含 SERVICE 的依赖项。docker-compose up web 还将创建并启动 db 和 redis
  • docker-compose stop :按依赖关系顺序停止服务。先启动的后停止

注意:web 服务不会等待 redis db 完全启动 之后才启动。

version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

devices:指定设备映射列表

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

dns: 自定义 DNS 服务器

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9

dns_search: 自定义 DNS 搜索域。可以是单个值或列表

dns_search: google.com

dns_search:
  - google.com
  - baidu.com

entrypoint: 覆盖容器默认的 entrypoint

entrypoint: /bin/entrypoint.sh

entrypoint:
  - redis-server
  - /etc/redis/redis.conf

env_file: 从文件添加环境变量

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

environment: 添加环境变量

environment:
  RACK_ENV: development
  SHOW: 'true'

expose:暴露端口,但不映射到宿主机,只被连接的服务访问。

expose:
 - "3000"
 - "8000"

extra_hosts: 添加主机名映射。类似 docker client --add-host。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:

162.242.195.82  somehost
50.31.209.229   otherhost

healthcheck: 用于检测 docker 服务是否健康运行。

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"] 
  interval: 1m30s 
  timeout: 10s 
  retries: 3 
  start_period: 40s # 启动后,多少秒开始启动检测程序

image: 指定容器运行的镜像

image: ubuntu:14.04

logging:服务的日志记录配置。

driver:指定服务容器的日志记录驱动程序,默认值为json-file。有以下三个选项

  • json-file
  • syslog
  • none

仅在 驱动程序下,可以使用以下参数,限制日志得数量和大小。当达到文件限制上限,会自动删除旧得文件。

# json-file
logging:
  driver: json-file
  options:
    max-size: "200k"
    max-file: "10"
    
# syslog
logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

network_mode:网络模式

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks:配置容器连接的网络,引用顶级 networks 下的条目

aliases :同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # Use a custom driver
    driver: custom-driver-1
  other-network:
    # Use a custom driver which takes special options
    driver: custom-driver-2

restart:重启策略

  • no:默认不重启
  • always:容器总是重新启动
  • on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
  • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

secrets: 存储敏感数据:

version: "3.1"
services:

mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
  secrets:
    - my_secret

secrets:
  my_secret:
    file: ./my_secret.txt

security_opt: 修改容器默认的 schema 标签

security-opt:
  - label:user:USER   # 设置容器的用户标签
  - label:role:ROLE   # 设置容器的角色标签
  - label:type:TYPE   # 设置容器的安全策略标签
  - label:level:LEVEL  # 设置容器的安全等级标签

stop_grace_period: 指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。默认的等待时间是 10 秒。

stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒 

stop_signal: 设置停止容器的替代信号。默认情况下使用 SIGTERM 。

以下示例,使用 SIGUSR1 替代信号 SIGTERM 来停止容器。

stop_signal: SIGUSR1

sysctls: 设置容器中的内核参数,可以使用数组或字典格式。

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

tmpfs: 在容器内安装一个临时文件系统。可以是单个值或列表的多个值

tmpfs: /run

tmpfs:
  - /run
  - /tmp

ulimits: 覆盖容器默认的 ulimit

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

volumes: 将主机的数据卷或着文件挂载到容器里

version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"

其他:

user: nginx   						# 容器运行用户
working_dir: /opt/mysql             # 工作空间

domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A

privileged: true

read_only: true
stdin_open: true                    # 打开标准输入,可以接受外部输入
tty: true                           # 模拟一个伪终端

4. 示例

4.1 redis-mysql

$ mkdir -p ~/redis-mysql && cd $_
$ mkdir -p conf
$ mkdir -p data/redis
$ mkdir -p data/mysql

$ cat > conf/redis.conf <<EOF
bind 0.0.0.0
protected-mode yes
port 6379

daemonize no
loglevel notice
databases 16

save 3600 1
save 300 100
save 60 10000

dbfilename dump.rdb
dir /data
EOF

$ cat > conf/mysql.cnf <<EOF
[mysql]
default-character-set=utf8mb4

[client]
port=3306
default-character-set=utf8mb4

[mysqld]
port=3306
character-set-server=utf8mb4
default-time-zone='+08:00'
long_query_time=5
EOF

$ cat > docker-compose.yml <<EOF
version: "3"
services:
  mysql:
    image: mysql:8.0.28
    container_name: mysql-server
    ports:
      - 3306:3306
    environment:
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
      MYSQL_ROOT_PASSWORD: "123456"
    depends_on:
      - redis
    volumes:
      - ./conf/mysql.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
      - ./data/mysql:/var/lib/mysql
  redis:
    image: redis:5.0.12
    container_name: redis-server
    ports:
      - 6379:6379
    restart: always
    environment:
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    volumes:
      - ./data/redis:/data
      - ./conf/redis.conf:/etc/redis/redis.conf
    command:
      redis-server /etc/redis/redis.conf
EOF


docker-compose up

5. 管理命令

docker-compose up -d  # 后台方式
docker-compose up --no-recreate -d
docker-compose up -d redis  # 只启动容器 redis

docker-compose stop 
docker-compose start

docker-compose down # 停止并销毁容器

6. 开机自启

# 方法一:跟随系统
crontab -e
@reboot sleep 60 && /usr/local/bin/docker-compose -f /root/redis-mysql/docker-compose.yml up -d

# 方法二:重启策略
restart: always
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker Compose 的相关文章

  • 我无法在 docker 中安装 opencv-contrib-python

    我尝试安装opencv contrib python但我无法让它在 docker 上工作 它说找不到满足 opencv contrib python 要求的版本 I tried pip install opencv contrib pyth
  • 在 Alpine Docker 容器上安装 OpenSSH

    第一次运行 alpine docker 容器并尝试 openssh 安装时 会发生以下情况 ole T docker run it rm alpine bin ash apk add openssh WARNING Ignoring APK
  • 如何基于现有镜像创建新的docker镜像?

    我刚刚开始使用docker 我使用 docker 文件创建图像 如何从现有图像创建新图像 假设你有一个容器bd91ca3ca3c8正在运行 并且您希望在容器中进行更改后创建一个新映像 生成另一个图像将允许您保留您的更改 在这种情况下你可以运
  • 如何通过 docker-php-ext-install 安装 php 扩展?

    为了解决问题 https stackoverflow com questions 37526509 how to install pdo driver in php docker image 我现在尝试通过安装 mysql pdo dock
  • 稍后如何附加到正在运行的 Docker 容器?

    我想简单地启动一个 docker 容器来执行一些 java 代码 最终启动 JBoss 这工作正常 只是我不知道如何再次连接到容器并返回到 bash 提示符 这就是我启动容器的方式 docker run i t p 80 80 v tmp
  • 在 docker build 中缓存“go get”

    我想将 golang 单元测试封装在 docker compose 脚本中 因为它依赖于多个外部服务 我的应用程序有很多依赖项 因此需要一段时间go get 如何以允许构建 docker 容器的方式缓存包 而无需每次要测试时下载所有依赖项
  • Docker:内存文件系统

    我有一个 docker 容器 它对磁盘进行大量读 写操作 我想测试当我的整个 docker 文件系统都在内存中时会发生什么 我在这里看到一些答案说这不会是真正的性能改进 但这是为了测试 我想测试的理想解决方案是共享每个图像的公共部分 并在需
  • java.library.path 中没有字体管理器

    以下代码在我的桌面上运行得很好 BufferedImage image new BufferedImage width height BufferedImage TYPE INT RGB Graphics g image getGraphi
  • 为什么 docker-compose ps 与 docker ps 不同?

    为什么 docker compose 创建的容器只能从 docker compose ps 访问 并且在杀死正在运行的容器后仍然存在 事实并非如此 docker ps只显示正在运行的容器 docker compose ps显示与当前撰写文件
  • Python脚本仅在Docker中产生僵尸进程

    我有相当复杂的设置 Luigi https github com spotify luigi https github com spotify luigi https github com kennethreitz requests htm
  • 使用 docker stack 部署主机环境变量

    我想知道是否有一种方法可以使用从部署容器的主机获取的环境变量 而不是从容器所在的主机获取的环境变量docker stack deploy命令被执行 例如想象以下docker compose yml在三节点 Docker Swarm 集群上启
  • 使用 docker 卷持久化数据库

    我正在尝试将 postgres 数据保存在 docker 容器中 以便您一旦docker compose down and docker compose up d您不会丢失上一次会话的数据 我无法让它做很多事情 将容器拉下来然后再次备份会定
  • Mac上使用docker安装gitlab的权限问题

    我正在尝试让 Gitlab 在本地运行 但遇到了权限问题 cp cannot create regular file etc gitlab gitlab rb Permission denied 我正在运行的命令是 sudo docker
  • 与主机中的容器共享目录或卷

    我有一个目录 可能是后面的卷 我想与所有交互式容器共享 我知道 本机 Docker 卷存储在 var lib docker volumes and docker run v似乎是最简单的方法 但我认为Data Volume Containe
  • 检查 docker 在 Gitlab CICD 管道中运行

    我在用着亚搏体育appGitlab CI CD https docs gitlab com ee ci README html构建 Node 服务器的 Docker 镜像 我想知道是否有办法测试它docker run图像的质量还可以 我们很
  • 服务无法启动虚拟机“DockerDesktopVM”,因为 Hyper-V 组件之一未运行

    我有 Window Server 2016 2019 虚拟机 Openstack 至此Hyper V安装成功 但无法启动 MobyLinuxVM ExposeVirtualizationExtensions 已通过 PowerShell 在
  • 从 Dockerfile 写入 docker 卷不起作用

    请考虑以下 Dockerfile FROM phusion baseimage VOLUME data RUN touch data HELLO RUN ls ls data 问题 data 目录不包含 HELLO 文件 此外 任何其他写入
  • 为多个 python 应用程序重用 Docker 镜像

    我对 Docker 的整个世界都很陌生 实际上 我正在尝试为不同的 python 机器学习应用程序建立一个环境 这些应用程序应该在自己的 docker 容器中相互独立地运行 由于我并不真正理解使用基础映像并尝试扩展这些基础映像的方式 因此我
  • 使用 Fig 时,为什么我的卷有时无法安装到 Docker 容器中?

    我在 Docker Fig 环境中看到一个奇怪的问题 我的假设是 这是由于将卷安装到容器的延迟造成的 但我不确定如何确认这一点 我有一个包含以下内容的容器 Dockerfile FROM busybox MAINTAINER Dan Rum
  • 在容器中运行多个相似的进程有意义吗?

    提供有关该问题的背景的简要背景 目前 我和我的团队正在将微服务迁移到 k8s 以减少维护多个部署工具和管道的工作量 我们计划迁移的微服务之一是 ETL Worker 它监听 SQS 上的消息并执行多阶段处理 它是使用 PHP Laravel

随机推荐

  • S3DIS场景点云数据集

    S3DIS是常用的室内场景分割数据集 xff0c 包含6个Area xff0c 常用的数据格式如下 xff1a Stanford3dDataset v1 2 Aligned Version xff0c 百度网盘下载 xff0c 提取码0ac
  • jupyter远程连接服务器

    服务器终端输入命令 jupyter notebook no browser port 61 8889 本地终端输入命令 ssh N f L localhost 8888 localhost 8889 username 64 ip usern
  • win10远程Linux桌面

    在Linux服务器安装xrdp xff1a sudo apt install xrdp win10远程 xff0c win 43 R xff0c 输入mstsc xff0c 输入linux服务器ip和账户 具体参考 https www ma
  • python控制输出精度

    a span class token operator 61 span span class token number 3 1456 span b span class token operator 61 span span class t
  • 多分类混淆矩阵的理解

    借用其它博客的一张例子示意图 xff0c 该图为一个三分类问题的混淆矩阵 xff0c 对角线的值表示分类器对该类别预测正确的个数 xff0c 每一列纵轴表示这个类别真实的样本数 xff0c 例如从第一列可以得知猫一共有10 43 3 43
  • ERROR: Could not find a version that satisfies the requirement dateutil

    安装dateutil出错 xff0c 提示 ERROR Could not find a version that satisfies the requirement dateutil 解决办法 xff1a pip install pyth
  • RTX3090 + cuda 11.1 + torch1.9.0 安装 MinkowskiEngine

    创建conda环境 conda create n mink span class token assign left variable python span span class token operator 61 span span c
  • pytorch更新tensor中指定index位置的值scatter_add_

    使用scatter add 更新tensor张量中指定index位置的值 例子 span class token keyword import span torch a span class token operator 61 span t
  • Docker 私有仓库

    1 Registry 官方私有仓库 xff0c 优点 xff1a 简单 xff1b 缺点 xff1a 部署无法进行复杂的管理操作 1 1 镜像 docker pull registry 2 7 1 docker pull joxit doc
  • pytorch one-hot编码

    使用scatter 将标签转换为one hot span class token keyword import span torch num class span class token operator 61 span span clas
  • python安装meshplot

    用conda或者pip直接安装如果出问题 xff0c 可以考虑使用以下方法 xff0c 从代码仓库中安装 下载代码库 span class token function git span clone https github com sko
  • python matplotlib quiver

    matplotlib中的 quiver方法可用于绘制箭头 xff08 向量 xff09 xff0c 下面介绍二维和三维中的使用方法 二维箭头向量绘制 一般参数如下 quiver span class token punctuation sp
  • 【链表】剑指offer 22. 链表中倒数最后k个结点

    题目 输入一个长度为 n 的链表 xff0c 设链表中的元素的值为 ai xff0c 输出一个链表 xff0c 该输出链表包含原链表中从倒数第 k 个结点至尾节点的全部节点 如果该链表长度小于k xff0c 请返回一个长度为 0 的链表 数
  • 【二叉树】剑指offer 54 二叉搜索树的第k个结点

    描述 给定一棵结点数为 n 二叉搜索树 xff0c 请找出其中的第 k 小的TreeNode结点 数据范围 xff1a 0 n lt 61 100
  • 【二叉树】剑指offer 77 按之字形顺序打印二叉树

    描述 给定一个二叉树 xff0c 返回该二叉树的之字形层序遍历 xff0c xff08 第一层从左向右 xff0c 下一层从右向左 xff0c 一直这样交替 xff09 输出 1 3 2 4 5 栈解法 用两个栈来存奇数层和偶数层的节点 x
  • 【二叉树】剑指offer 8 二叉树的下一个结点

    描述 给定一个二叉树其中的一个结点 xff0c 请找出中序遍历顺序的下一个结点并且返回 注意 xff0c 树中的结点不仅包含左右子结点 xff0c 同时包含指向父结点的next指针 下图为一棵有9个节点的二叉树 树中从父节点指向子节点的指针
  • 【二叉树】剑指offer 78 把二叉树打印成多行

    描述 给定一个节点数为 n 二叉树 xff0c 要求从上到下按层打印二叉树的 val 值 xff0c 同一层结点从左至右输出 xff0c 每一层输出一行 xff0c 将输出的结果存放到一个二维数组中返回 例如 xff1a 给定的二叉树是 1
  • python判断数组中是否有nan

    span class token keyword import span numpy numpy span class token punctuation span isnan span class token punctuation sp
  • ssh 免密配置

    在本机A上生成RSA密钥 ssh keygen cd ssh xff0c 看到如下文件 xff0c id rsa pub就是rsa加密算法的公钥 将本机的公钥发给对方服务器B xff0c 需要B的密码 xff0c 表示B同意被免密访问 xf
  • Docker Compose

    1 简介 Docker Compose 项目是 Docker 官方的开源项目 xff0c 负责实现对Docker容器集群的快速编排 Docker Compose将所管理的容器分为三层 xff1a 工程 xff08 project xff09