创建docker-compose.yml或者docker-compose.yaml,使用yaml进行编写

version

用于指定当前compose文件语法遵循哪个版本,Compose文件版本支持特定的Docker版本列表如下:

Compose文件格式

Docker Engine版本

3.7

18.06.0+

3.6

18.02.0+

3.5

17.12.0+

3.4

17.09.0+

3.3

17.06.0+

3.2

17.04.0+

3.1

1.13.1+

3.0

1.13.0+

2.4

17.12.0+

2.3

17.06.0+

2.2

1.13.0+

2.1

1.12.0+

2.0

1.10.0+

1.0

1.9.1.+

示例:
version: "3"
version: "3.7"

services区域

所有服务的定义都是定义在services区域中,services常用的配置项如下

image

指定要启动容器的映像。可以是一个repository/tag或镜像ID来表明

# 示例:
	image: redis
	image: a4bc65fd
提示:image可以是本地也可以是远程的,如果本地不存在,compose会尝试pull下来,肉使用了build手动构建镜像,则使用指定的选项构建它,并使用指定的标签标记它。
build

该参数指定Dockerfile文件的路径,compose会通过Dockerfile构建并生成镜像,然后使用该镜像。

如果在构建镜像的时候你指定相关名字和tag,则生成指定的镜像和tag

例:
version: "3.7"   # 指定本yml依从的compose哪个版本制定的。
services:
  webapp:
    build: ./dir # 指定为从上下文路径./dir/Dockerfile所构建的镜像
    image: imagename:tag
command

重写容器启动的默认命令,即指定启动容器的命令。

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

链接到其他服务中的容器,可以指定服务名称和这个链接的别名,或者只指定服务名称

web:
   links:
    - db
    - db:database
    - redis

此时,在容器内部,会在/etc/hosts文件中用别名创建几个条目,如下:
172.17.2.100 db
172.17.2.100 database
172.17.2.100 redis
external_links

链接到compose外部启动的容器,特别是对于提供共享和公共服务的容器。在指定容器名称和别名时,external_links遵循着和links相同的语义用法。

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql
ports

暴露端口,指定宿主机到容器的端口映射,或者只指定容器的端口,则表示映射到主机上的随机端口。

注意:以HOST:CONTAINER格式映射端口时,使用低于60的容器端口时可能会遇到错误的结果,因为YAML会将格式xx:yy中的数字解析为base-60值。因此,我们建议始终将端口映射明确指定为字符串。

例:[短格式]
ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"
例:[长格式]
ports:
  - target: 80
    published: 8080
    protocol: tcp
    mode: host

# 解释:长格式语法允许配置无法以简短形式表示的其他字段。
target:容器内的端口
published:公开暴露的港口
protocol:端口协议(tcp或udp)
mode:host用于在每个节点上发布主机端口,或者ingress用于负载平衡的群集模式端口。
expose

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

只能指定内部端口

expose:
 - "3000"
 - "8000"
environment

加入环境变量,可以使用数组或者字典,只有一个key的环境变量可以在运行compose的机器上找到对应的值。

提示:任何布尔值; true,false,yes no,需要用引号括起来,以确保YML解析器不会将它们转换为True或False。

例:
environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:
environment:
  - RACK_ENV=development
  - SHOW=true
  - SESSION_SECRET
env_file

从一个文件中引入环境变量,该文件可以是一个单独的值或者一个列表,如果同时定义了environment,则environment中的环境变量会重写这些值。

env_file: .env

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

提示:列表中文件的顺序对于确定分配给多次显示的变量的值非常重要。列表中的文件从上到下进行处理。如果有重复的环境变量,则使用最后的

depends_on

指定与部署和运行服务相关的配置。

version: '3'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres


服务依赖关系之间的Express依赖关系会导致以下行为:
docker-compose up:以依赖顺序启动服务,在以上示例中,db和redis之在web之前启动。
docker-compose up SERVICE:自动包含SERVICE依赖项。在以上示例中,docker-compose up web还创建并启动db和redis。
deploy

指定与部署和运行服务相关的配置。

例:
version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      labels:
 com.example.description: "This label will appear on all containers for the web service"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      replicas: 6
      update_config:
        parallelism: 2
        delay: 10s
      update_config:
        parallelism: 2
        delay: 10s
        order: stop-first
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
子选项说明:
labels:指定服务的标签。这些标签仅在服务上设置,而不是在服务的任何容器上设置。
mode:global:每个集群节点只有一个容器,默认为replicated。
resources:资源限制,如上所示:redis服务被限制为使用不超过50M的内存和0.50(50%)的CPU时间,并且保留20M了内存和0.25CPU时间(始终可用)。
replicas:指定replicated后,或默认情况下课使用replicas指定副本数,
restart_policy:配置是否以及如何在容器退出时重新启动容器,包括:
condition:其中之一none,on-failure或any(默认:) any。
delay:重新启动尝试之间等待的时间,指定为持续时间(默认值:0)。
max_attempts:在放弃之前尝试重新启动容器的次数(默认值:永不放弃)。如果在配置中未成功重新启动 window,则此尝试不会计入配置的max_attempts值。例如,如果max_attempts设置为“2”,并且第一次尝试时重新启动失败,则可能会尝试重新启动两次以上。
window:在决定重启是否成功之前等待多长时间,指定为持续时间(默认值:立即决定)。
rollback_config:配置在更新失败的情况下应如何回滚服务。
parallelism:一次回滚的容器数。如果设置为0,则所有容器同时回滚。
delay:每个容器组的回滚之间等待的时间(默认为0)。
failure_action:如果回滚失败该怎么办。一个continue或pause(默认pause)
monitor:每次更新任务后的持续时间以监视失败(ns|us|ms|s|m|h)(默认为0)。
max_failure_ratio:回滚期间容忍的失败率(默认值为0)。
order:回滚期间的操作顺序。其中之一stop-first(旧任务在启动新任务之前停止),或者start-first(首先启动新任务,并且正在运行的任务暂时重叠)(默认stop-first)。
update_config:配置服务应如何更新,用于配置滚动更新。
parallelism:一次更新的容器数。
delay:更新一组容器之间的等待时间。
failure_action:更新失败时的行为。其中一个continue,rollback或者pause (默认:pause)。
monitor:每次更新任务后的持续时间以监视失败(ns|us|ms|s|m|h)(默认为0)。
max_failure_ratio:更新期间容忍的故障率。
order:更新期间的操作顺序。其中一个stop-first(旧任务在启动新任务之前停止),或者start-first(首先启动新任务,并且正在运行的任务暂时重叠)(默认stop-first)注意:仅支持v3.4及更高版本。
# 注意:order仅支持v3.4及更高版本的撰写文件格式。
healthcheck

配置运行的检查以确定此服务的容器是否“健康”

例:
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s

提示:healthcheck可参考:https://docs.docker.com/engine/reference/builder/#healthcheck

network_mode

网络类型,可指定容器运行的网络类型

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
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
dns

自定义 DNS 服务器,可以是单个值或列表的多个值。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

networks区域

网络决定了服务之间以及服务和外界之间如何去通信,在执行docker-compose up的时候,docker会默认创建一个默认网络,创建的服务也会默认的使用这个默认网络。服务和服务之间,可以使用服务的名字进行通信,也可以自己创建网络,并将服务加入到这个网络之中,这样服务之间可以相互通信,而外界不能够与这个网络中的服务通信,可以保持隔离性。

注意:您的应用程序网络的名称基于“项目名称”,该名称基于其所在目录的名称。您可以使用–project-name参数或COMPOSE_PROJECT_NAME环境变量覆盖项目名称,

version: '2'

services:
  app:
    image: busybox
    command: ifconfig
    networks:
      app_net:
        ipv4_address: 172.16.238.10

networks:
  app_net:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
      - subnet: 172.16.238.0/24
        gateway: 172.168.238.254

例2:

定义网络信息

networks:
  dev:
    driver: bridge


bridge                # Docker 默认使用 bridge 连接单个主机上的网络
overlay               # overlay 驱动程序创建一个跨多个节点命名的网络
host                  # 共享主机网络名称空间(等同于 docker run --net=host)
none                  # 等同于 docker run --net=none

示例

version: "3.7"
services:
  webserver01:
    image: nginx
    ports:
      - "6060:80"
    container_name: "web1"
    networks:
      - dev
networks:
  dev:
    driver: bridge

volumes区域

可以在Compose file文件上声明卷,同时也可以在本区域创建volumes_from,以便在多个服务中重用卷。

version: "3"
services:
  db:
    image: db
    volumes:
      - data-volume:/var/lib/db
  backup:
    image: backup-service
    volumes:
      - data-volume:/var/lib/backup/data
volumes:
  data-volume:

提示:volumes可参考:https://docs.docker.com/compose/compose-file/#specifying-byte-values

例2:

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

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