2.1、在Docker Compose中定义服务

单个service是对应用程序中计算资源的一种抽象定义,其可以独立于其他组件进行扩展或替换。多个Services由一组容器提供支持,这些容器由平台根据复制要求和位置限制进行运行。由于服务是基于容器来运行的,因此它们是由一个 Docker 镜像以及一组运行时参数来定义的。服务内的所有容器都会使用这些参数进行完全相同的创建。

一个 Compose 文件必须将服务的顶层元素声明为一个映射结构,其中键为服务名称的字符串表示形式,而值则为服务定义。服务定义包含了应用于每个服务容器的配置信息。

每个服务还可能包含一个构建部分,该部分定义了如何为该服务创建 Docker 镜像。Compose 支持使用此服务定义来构建 Docker 镜像。如果不使用该部分,则该部分将被忽略,但 Compose 文件仍被视为有效。构建支持是 Compose 规范中的一个可选部分,详细内容请参阅 Compose 构建规范文档。

每个服务都会定义其容器运行时的约束条件和要求。部署部分会将这些约束条件进行分类,并让平台根据可用资源来调整部署策略,以最大程度地满足容器的需求。部署支持是 Compose 规范中的一个可选部分,详细内容在 Compose 部署规范文档中有描述。如果未实现部署部分,则该部分将被忽略,而 Compose 文件仍被视为有效。

服务简单示例:该实例展示了如何定义两个简单的服务,设置服务的镜像、映射端口、配置基础的环境变量

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"

  db:
    image: postgres:13
    environment:
      POSTGRES_USER: example
      POSTGRES_DB: exampledb

服务高级示例

该示例中,proxy 服务使用nginx镜像,挂载了一个本地nginx配置文件到容器中,暴露了80端口,并依赖backend服务。

backend 服务根据backend 目录中的Dockerfile 构建了一个镜像,该镜像的构建阶段被设定为 builder 阶段。

services:
  proxy:
    image: nginx
    volumes:
      - type: bind
        source: ./proxy/nginx.conf
        target: /etc/nginx/conf.d/default.conf
        read_only: true
    ports:
      - 80:80
    depends_on:
      - backend

  backend:
    build:
      context: backend
      target: builder

2.2、服务属性

1、annotations :为容器定义注释。这些注释可以使用数组或者映射的形式。

# map形式
annotations:
  com.example.foo: bar
  
#数组形式
annotations:
  - com.example.foo=bar

2、attach:需要Docker Compose版本是2.20.0或者更高的版本

当“attach”属性被定义并设置为“false”时,Compose 将不会收集服务日志,除非明确要求其进行收集。默认的服务配置为“attach: true”。

3、build:“build”指定了从源代码创建容器镜像的构建配置,该配置是根据“Compose 构建规范”所定义的。

4、blkio_config :“blkio_config”定义了一组配置选项,用于为服务设定块 I/O 限制。

services:
  foo:
    image: busybox
    blkio_config:
       weight: 300
       weight_device:
         - path: /dev/sda
           weight: 400
       device_read_bps:
         - path: /dev/sdb
           rate: '12mb'
       device_read_iops:
         - path: /dev/sdb
           rate: 120
       device_write_bps:
         - path: /dev/sdb
           rate: '1024k'
       device_write_iops:
         - path: /dev/sdb
           rate: 30
           
##
device_read_bps, device_write_bps
为给定设备上的读/写操作设定每秒的字节数限制。列表中的每个项必须包含两个键:
path:定义了受影响设备的符号路径。
rate:既可以以整数值(表示字节数)的形式给出,也可以以表示字节数的字符串形式给出。

device_read_iops, device_write_iops
为给定设备上的读/写操作设定每秒的执行次数限制。列表中的每一项必须包含两个键:
path:定义了受影响设备的符号路径。
rate:作为一个整数值,表示每秒允许进行的操作次数。

weight
调整分配给某一服务的带宽比例与其他服务的带宽比例之间的关系。该值为介于 10 到 1000 之间的整数,默认值为 500。

weight_device
根据设备对带宽分配进行微调。列表中的每一项都必须包含两个键值:
path:定义了受影响设备的符号路径。
weight:一个介于 10 到 1000 之间的整数值。

在 /dev/sda 设备上:使用权重 400
在其他所有设备上(如 /dev/sdb):使用权重 300

weight:设置容器的 全局默认权重(100-1000),影响容器在所有块设备上的 I/O 优先级
weight_device:针对 特定设备 设置权重,只影响在该指定设备上的 I/O 优先级
当两者同时配置时,weight_device 的优先级高于 weight
对于特定设备,使用 weight_device 的设置
对于其他未在 weight_device 中指定的设备,使用 weight 的设置

5、cpu_count:定义了服务容器可使用的 CPU 数量。

6、cpu_percent:定义了可用 CPU 的可使用百分比。

7、cpu_shares:“cpu_shares”这一参数以整数值的形式定义了服务容器相对于其他容器的相对 CPU 权重。

8、cpu_period:“cpu_period”用于配置当平台基于 Linux 内核时的 CPU CFS(完全公平调度器)周期。

9、cpu_quota:“cpu_quota”用于在基于 Linux 内核的平台上配置 CPU 的 CFS(完全公平调度器)配额。

10、cpu_rt_runtime:“cpu_rt_runtime”用于配置支持实时调度器的平台上的 CPU 分配参数。它可以是使用微秒为单位的整数值,也可以是持续时间。

 cpu_rt_runtime: '400ms'
 cpu_rt_runtime: '95000'

数值以 {value}{unit} 的形式将时长表示为字符串。支持的单位包括 us(微秒)、ms(毫秒)、s(秒)、m(分钟)和 h(小时)。数值可以组合多个值,且无需分隔符。

  10ms
  40s
  1m30s
  1h5m30s20ms

11、cpu_rt_period:“cpu_rt_period”用于配置支持实时调度器的平台上的 CPU 分配参数。它可以是使用微秒为单位的整数值,也可以是持续时间。

 cpu_rt_period: '1400us'
 cpu_rt_period: '11000'

12、cpus:决定了要分配给服务容器的(可能为虚拟的)CPU 的数量。这个数量是小数形式。0.000 表示没有限制。设置完成后,所选的 cpus 必须与部署规范中的 cpus 属性保持一致。

13、cpuset:用于定义允许执行的明确的 CPU 范围。它可以是 0 到 3 的一个范围,也可以是 0 和 1 这样的一个列表。

14、cap_add:以字符串的形式指定了额外的容器功能。(Linux功能点参考:capabilities(7) - Linux manual page

cap_add:
  - ALL

15、cap_drop:以字符串形式指定要删除的容器功能。

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN
16、cgroup:需要2.15.0及以上版本的Docker Compose
指定了要加入的 cgroup 命名空间。若未设置,则由容器运行时自行决定使用哪个 cgroup 命名空间(如果该功能支持的话)。
  • host:在容器运行时的 cgroup 命名空间中运行容器。
  • private:在容器自身的私有 cgroup 命名空间中运行容器。
17、cgroup_parent :为容器指定一个可选的父控制组。
cgroup_parent: m-executor-abcd

18、command :覆盖由容器镜像(例如通过 Dockerfile 的 CMD 命令)所声明的默认命令。

command: bundle exec thin -p 3000

如果该值为空,则会使用镜像中的默认命令。

如果值为 [](空列表)或 ''(空字符串),则由镜像声明的默认命令将被忽略,或者换句话说,会被设置为空。

该值也可以是一个列表,类似于 Dockerfile 中使用的exec形式语法。

注意:与 Dockerfile 中的 CMD 指令不同,command字段不会自动在镜像中定义的 SHELL 指令的上下文中运行。如果您的命令依赖于特定 shell 的功能,例如环境变量扩展,您需要在 shell 中显式地运行该命令。例如:

command: /bin/sh -c 'echo "hello $$HOSTNAME"'
19、configs:让服务能够自行调整其行为,而无需重新构建 Docker 镜像。服务只有在明确获得“配置”属性的授权后才能访问配置信息。支持两种不同的语法变体。
如果配置项在平台上不存在,或者未在“Compose”文件的“configs”顶级元素中进行定义,那么该操作将会报告错误。
对于configs属性,定义了两种语法:一种是简短语法,另一种是详细语法。
  • 短格式语法:
这种短格式的语法格式仅指定配置名称。这使得容器能够访问该配置,并将其作为文件挂载到服务容器的文件系统中。在 Linux 容器中,挂载点的位置默认为 /,而在 Windows 容器中则为 C:\。
以下示例使用了短格式的语法来授予 Redis 服务对“my_config”和“my_other_config”配置文件的访问权限。my_config 的值被设置为文件“./my_config.txt”中的内容,而 my_other_config 被定义为外部资源,这意味着它已经在平台上进行了定义。如果外部配置不存在,部署将会失败。
services:
  redis:
    image: redis:latest
    configs:
      - my_config
      - my_other_config
configs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true
  • 长格式语法:
这种长格式的语法在服务的任务容器中配置的创建方式上提供了更高的精细度。
source:平台中配置的名称
target:要在服务任务容器中挂载的文件路径和名称。如果未指定则默认值为/
uid和gid:在服务的任务容器中拥有挂载的配置文件的数字 uid 或 gid。
mode:在服务的任务容器中挂载的文件的权限,以八进制表示法表示。默认值为世界可读(0444)。写入位必须忽略。可执行位可以设置。
以下示例在容器内将“my_config”的名称设置为“redis_config”,将模式设置为 0440(组可读),并将用户和组设置为 103。而 Redis 服务无法访问“my_other_config”这个配置。
services:
  redis:
    image: redis:latest
    configs:
      - source: my_config
        target: /redis_config
        uid: "103"
        gid: "103"
        mode: 0440
configs:
  my_config:
    external: true
  my_other_config:
    external: true

20、container_name:一个字符串,用于指定自定义容器的名称,而非默认生成的名称。

container_name: my-web-container

如果 Compose 文件中指定了容器名称,那么 Compose 不会将服务扩展到超过一个容器的规模。若尝试这样做,则会引发错误。容器名称遵循的正则表达式格式为:[a-zA-Z0-9][a-zA-Z0-9_.-]+

21、credential_spec:用于配置托管服务账号的凭证规格。如果使用 Windows 容器的服务,那么可以使用“file:”和“registry:”协议来设置凭证规范。Compose 还支持针对特定用例的其他协议。

credential_spec必须采用 file:// 或者 registry:// 格式

credential_spec:
  file: my-credential-spec.json

当使用 "registry:" 时,凭证信息会从守护进程所在主机的 Windows 注册表中读取,具有指定名称的注册表项必须位于:HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs

以下示例是从注册表中名为“my-credential-spec”的值中加载凭证规范:

credential_spec:
  registry: my-credential-spec

在为服务配置 gMSA 凭证规范时,只需指定包含配置信息的凭证规范,如以下示例所示:

services:
  myservice:
    image: myimage:latest
    credential_spec:
      config: my_credential_spec

configs:
  my_credentials_spec:
    file: ./my-credential-spec.json
22、depends_on:通过“depends_on”属性,可以控制服务启动和关闭的顺序。如果服务之间紧密关联,且启动顺序会影响应用程序的功能,那么使用该属性会非常有用。
  • 短格式语法:
这种简短的语法形式仅指定了依赖项的服务名称。服务依赖关系会导致以下行为:
Compose 是按照依赖关系顺序来创建服务的。在以下示例中,先创建了“db”和“redis”,然后再创建“web”。
Compose 按依赖关系顺序来移除服务。在以下示例中,web 会先被移除,然后是 db 和 redis。
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
Compose 确保在启动依赖服务之前,其相关依赖服务已先启动。Compose 在启动依赖服务之前会等待其相关服务“就绪”。
  • 长格式语法:
这种长格式语法允许配置一些在短格式中无法表达的额外字段。
restart:当设置为 true 时,Compose 在更新依赖服务后会重新启动此服务。而不包括容器运行时在容器死亡后自动进行的重启操作。此功能在 Docker Compose 版本 2.17.0 中引入。
condition:设定依赖关系被视为已满足的条件标准, 项值如下所示
service_started:与之前短格式语法所描述的具有同等作用
service_healthy:在启动从属服务之前,依赖项必须处于“健康”状态(可通过健康检查来确认)。
service_completed_successfully:表示在启动从属服务之前,依赖项必须成功完成运行。
required:当设置为“false”时,Compose 只会在依赖服务未启动或不可用的情况下向您发出警告。如果未定义,则默认值为“required”为“true”。此功能在 Docker Compose 版本 2.20.0 中引入。
服务依赖关系会导致以下情况:
  • 服务依赖关系会导致以下行为:Compose 按依赖顺序创建服务。在以下示例中,先创建了“db”和“redis”,然后再创建“web”。
  • Compose 会等待标记为“service_healthy”的依赖项的健康检查结果。在以下示例中,预期在创建 web 之前,db 必须处于“健康”状态。
  • Compose 按依赖关系顺序来移除服务。在以下示例中,web 会先被移除,然后是 db 和 redis。
services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
        restart: true
      redis:
        condition: service_started
  redis:
    image: redis
  db:
    image: postgres

Compose 确保在启动依赖服务之前先启动其依赖服务。Compose 还确保标记为 service_healthy 的依赖服务在启动相关服务之前已处于“健康”状态。

23、deploy:“deploy”指定了服务的部署及生命周期的配置,该配置依据“组合部署规范”中所定义的内容进行设定。

24、develop:要求使用Docker Compose 2.22.0及以上版本。“develop”指定了用于使容器与源代码保持同步的开发配置,该配置在“开发”部分中已有明确说明。

25、device_cgroup_rules:为该容器定义了一组设备 cgroup 规则。其格式与 Linux 内核在“控制组设备白名单控制器”中所指定的格式完全相同。Device Whitelist Controller — The Linux Kernel documentation

device_cgroup_rules:
  - 'c 1:3 mr'
  - 'a 7:* rmw'

语法格式:

<type> <major>:<minor> <permissions>

设备类型

类型

含义

示例

a

所有类型

a *:* rwm

b

块设备

b 8:* rwm

 (磁盘)

c

字符设备

c 1:3 rwm

 (/dev/null)

p

伪设备

很少使用

设备号

格式

含义

示例

*

所有设备

b *:*

 (所有块设备)

M

主设备号

b 8:*

 (主设备号8的所有设备)

M:N

主设备号:次设备号

c 4:1

 (具体设备)

权限

权限

含义

说明

r

读取设备

w

写入设备

m

创建设备节点

非常重要!

a

附加

某些设备的附加权限

组合

如 

rw

读+写

实际应用场景

#场景 1:安全加固 - 限制设备访问
services:
  webapp:
    device_cgroup_rules:
      # 允许标准设备
      - 'c 1:3 rwm'    # /dev/null
      - 'c 1:5 rwm'    # /dev/zero
      - 'c 1:7 rwm'    # /dev/full
      - 'c 1:8 rwm'    # /dev/random
      - 'c 1:9 rwm'    # /dev/urandom
      - 'c 5:0 rwm'    # /dev/tty
      - 'c 5:1 rwm'    # /dev/console
      
      # 明确拒绝磁盘访问(安全加固)
      - 'b *:* rm'     # 只允许读和创建设备,不允许写
      # 或完全拒绝
      # - 'b *:* -'    # 拒绝所有块设备访问
      
#场景 2:特定设备访问
services:
  database:
    # 只允许访问特定磁盘
    device_cgroup_rules:
      - 'b 8:0 rwm'    # /dev/sda
      - 'b 8:16 rwm'   # /dev/sdb
      - 'b 259:* rm'   # NVMe 设备(主设备号259)
      # 拒绝其他所有块设备
      - 'b *:* -'
      
#场景 3:GPU 访问控制
services:
  ai-training:
    # 允许访问 NVIDIA GPU
    device_cgroup_rules:
      - 'c 195:* rwm'    # NVIDIA 控制设备
      - 'c 243:* rwm'    # NVIDIA UVM 设备
      - 'c 508:* rwm'    # NVIDIA 计算设备
    devices:
      - /dev/nvidia0:/dev/nvidia0
      - /dev/nvidiactl:/dev/nvidiactl
      - /dev/nvidia-uvm:/dev/nvidia-uvm
      
#场景 4:USB 设备管理
services:
  usb-app:
    device_cgroup_rules:
      # 允许访问特定 USB 设备
      - 'c 180:* rm'     # USB 字符设备(读+创建设备)
      - 'b 8:32 rwm'     # 特定 USB 存储设备
      
      # 或允许所有 USB
      # - 'c 180:* rwm'  # 所有 USB 字符设备
      # - 'b 8:* rwm'    # 所有 USB 块设备
      

常见设备号参考

设备

类型

主设备号

示例

SCSI/SATA 磁盘

块设备

8

b 8:*

NVMe 磁盘

块设备

259

b 259:*

终端设备

字符设备

4,5

c 4:*

c 5:*

循环设备

块设备

7

b 7:*

内存设备

字符设备

1

c 1:*

杂项设备

字符设备

10

c 10:*

USB 设备

字符设备

180

c 180:*

GPU (NVIDIA)

字符设备

195,243

c 195:*

devices属性的区别

devices 属性将主机设备挂载到容器,一对一设备映射,自动授予指定权限,设备在容器中可见
device_cgroup_rules 属性 控制整个设备类别的访问规则,基于设备号规则,可以批量控制,更细粒度的权限控制

26、devices:定义了针对所创建容器的设备映射列表,其格式为“HOST_PATH:CONTAINER_PATH[:CGROUP_PERMISSIONS]”。

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"
  - "/dev/sda:/dev/xvda:rwm"

设备还可以利用 CDI 语法来让容器运行时自动选择设备:

devices:
  - "vendor1.com/device=gpu"

27、dns:用于定义在容器网络接口配置中要设置的自定义 DNS 服务器。它可以是一个单一的值,也可以是一个列表。

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9

28、dns_opt:dns_opt 列出要传递给容器的 DNS 解析器的自定义 DNS 选项(在 Linux 系统中,这些选项会保存在 /etc/resolv.conf 文件中)。

dns_opt:
  - use-vc
  - no-tld-query

29、dns_search:用于定义自定义的 DNS 搜索域名,以便在容器网络接口配置中进行设置。它可以是一个单一的值,也可以是一个列表。

dns_search: example.com

dns_search:
  - dc1.example.com
  - dc2.example.com
  
#当使用短主机名时,自动尝试添加的域名后缀
# 当 ping web 时,实际尝试:
# 1. web.dc1.example.com
# 2. web.dc2.example.com  
# 3. web(最后尝试无后缀)

30、domainname:声明用于服务容器的自定义域名。该域名必须符合 RFC 1123 标准的合法主机名格式。

services:
  app:
    hostname: "webapp"
    domainname: "prod.company.com"
    # 结果:完整域名为 webapp.prod.company.com

设置容器的 NIS 域名(不是 DNS 搜索域!),这是系统的 domainname 命令,不是 DNS 搜索域

31、driver_opts:需要Docker Compose 2.27.1及以上版本。用于指定一系列以键值对形式呈现的选项,这些选项将传递给网络驱动程序。这些选项是与网络驱动程序相关的。查阅Networking | Docker Docs 获取更详细信息

services:
  app:
    networks:
      app_net:
        driver_opts:
          com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"

32、entrypoint:定义了服务容器的默认入口点。这会覆盖来自服务的 Dockerfile 中的“ENTRYPOINT”指令。如果entrypoint不为空,则 Compose 会忽略镜像中的任何默认命令,例如 Dockerfile 中的 CMD 指令。

就短格式而言,该值可以表示为一个字符串:

entrypoint: /code/entrypoint.sh

或者,该值也可以是一个列表,其形式与 Dockerfile 中的格式类似:

entrypoint:
  - php
  - -d
  - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
  - -d
  - memory_limit=-1
  - vendor/bin/phpunit

如果该值为null,则会使用镜像中的默认入口点。

如果值为 [](空列表)或 ''(空字符串),则会忽略由镜像所声明的默认入口点,换句话说,该入口点会被设置为空。

33、env_file:用于指定一个或多个包含要传递给容器的环境变量的文件。

#单个文件
env_file: .env

#列表形式
env_file:
  - ./a.env
  - ./b.env
相对路径是从 Compose 文件的父文件夹解析的。由于绝对路径会使配置文件无法实现跨平台使用,因此当使用这样的路径来设置 env_file 时,Compose 会向您发出警告。
在 environment 部分声明的环境变量会覆盖这些值。即便这些值为空或未定义,这一规则依然适用。
环境变量文件也可以是一个列表。列表中的文件会从上到下依次处理。对于在两个环境文件中指定的相同变量,其值将以列表中最后一个文件中的值为准。
列表中的元素也可以被声明为一种映射结构,这样一来就能设置更多的属性了。
  • reuqired:需要Docker Compose2.24.0及以上版本。属性默认值为true。当 required 被设置为false且 .env 文件缺失时,Compose 会默默地忽略该条目。
env_file:
  - path: ./default.env
    required: true # default
  - path: ./override.env
    required: false
  • format:需要 Docker Compose 2.30.0及以上版本。该属性允许您为 env_file 指定一种不同的文件格式。若未进行设置,则会按照如下 Env_file 格式中所描述的规则来解析环境文件。
raw 格式允许使用包含 key=value 项的环境文件,但 Compose 不会尝试解析这些值以进行插值处理。这样您就可以直接传递这些值,包括引号和 $ 符号。
env_file:
  - path: ./default.env
    format: raw
Env_file格式:“.env”文件中的每一行都必须采用“VAR[=[VAL]]”的格式。以下为适用的语法规则:
  • 以“#”开头的行将被当作注释处理并被忽略。
  • 空行将被忽略。
  • 未加引号和使用双引号(“”)的值会应用插值处理。
  • 每行代表一个键值对。值可以选性地加上引号。
  • 分隔键和值的分隔符可以是“=”或者“:”。
  • 值前后空格均不被考虑
  • VAR=VAL -> VAL
  • VAR="VAL" -> VAL
  • VAR='VAL' -> VAL
  • VAR: VAL -> VAL
  • VAR = VAL -> VAL
  • 对于未加引号的值,其对应的内联注释必须以一个空格作为开头。
  • VAR=VAL # comment -> VAL
  • VAR=VAL# not a comment -> VAL# not a comment
  • 对于引用的值,内联注释必须紧跟在该结束引号之后。
  • VAR="VAL # not a comment" -> VAL # not a comment
  • VAR="VAL" # comment -> VAL
  • 单引号(')括起来的值会被原样使用
  • VAR='$OTHER' -> $OTHER
  • VAR='${OTHER}' -> ${OTHER}
  • 引号可以用“\”进行转义。
  • VAR='Let\'s go!' -> Let's go!
  • VAR="{\"hello\": \"json\"}" -> {"hello": "json"}
  • 在双引号括起来的值中,支持常见的 shell 转义序列,如 \n、\r、\t 和 \\ 。
  • VAR="some\tvalue" -> some value
  • VAR='some\tvalue' -> some\tvalue
  • VAR=some\tvalue -> some\tvalue
VAL 可以省略,此时变量的值为一个空字符串。=VAL 也可以省略,此时该变量将被取消设置。
# Set Rails/Rack environment
RACK_ENV=development
VAR="quoted"

34、environment:该属性定义了容器中设置的环境变量。environment 可以使用数组或映射的形式。任何布尔值(如 true、false、yes、no)都应使用引号括起来,以确保不会被 YAML 解析器转换为 True 或 False 。

环境变量可以通过一个单一的键来声明(等号后没有值),在这种情况下,Compose 会依赖于您来确定值。如果该值未被解析,该变量将被取消设置,并从服务容器的环境变量中移除。

#Map语法
environment:
  RACK_ENV: development
  SHOW: "true"
  USER_INPUT:
      
#Array语法
environment:
  - RACK_ENV=development
  - SHOW=true
  - USER_INPUT

如果为某个服务同时设置了 env_file 和 environment ,那么由 environment 设置的值将具有优先级。

35、expose:“expose”用于定义(传入的)端口或容器所暴露的端口范围。这些端口必须对关联的服务开放访问,并且不应发布到主机机器上。只能指定容器内部的端口。

语法为:/[] 或 /[] 用于表示端口范围)。若未明确指定,则默认使用 TCP 协议。

expose:
  - "3000"
  - "8000"
  - "8080-8085/tcp"

如果镜像的 Dockerfile 已经开放了端口,那么即使在 Compose 文件中未设置 expose 选项,该端口也会对网络中的其他容器可见。

36、extends:允许在不同的文件之间,甚至在完全不同的项目之间共享通用配置。通过 extends,可以在一处定义一组通用的服务选项,并从任何地方引用它。可以引用另一个 Compose 文件,并选择您希望在自己的应用程序中使用的服务,同时还可以根据自身需求覆盖某些属性。

可以在任何服务上使用 extends 关键字,并结合其他配置键一起使用。extends 值必须是一个映射,通过指定必需的 service 以及可选的 file 键来定义。

extends:
  file: common.yml
  service: webapp
service:指定被继承的服务名称,例如“网络”或“数据库”。指定的服务名称在识别的Compose文件中必须存在,在下面的情况下Compose会返回错误
  • 指定的服务未找到。
  • 指定的Compose文件未找到
file:定义该服务的 Compose 配置文件的所在位置。
  • 未定义该属性时说明继承的服务在当前Compose文件中定义
  • 当属性值为文件路径时,可以是相对路径(相对于Compose文件所在的路径)也可以是绝对路径
限制条件:当使用 extends 关键字引用一个服务时,这个服务可以声明对其他资源的依赖关系。这些依赖关系可以通过诸如volumes, networks, configs, secrets, links, volumes_from, 或者 depends_on等属性进行明确定义。 此外,依赖关系也可以在命名空间声明(如 ipc、pid 或 network_mode)中使用“service:{name}”的语法来引用另一个服务。
当你使用 extends 来继承另一个 Compose 文件的配置时,Docker Compose 不会自动导入被继承文件中依赖的其他资源(比如 networks、volumes、其他 services 等)。
使用“extends”进行循环引用是不被支持的。一旦检测到这种循环引用,Compose 就会返回错误信息。
合并服务定义:两个服务定义(当前 Compose 文件中的主定义以及通过“extends”指定的被引用定义)将以如下方式合并:
  • 映射:主服务定义中的键会覆盖引用服务定义中的键。未被覆盖的键将保持原样。
以下这些键应被视为映射关系:annotations,build.args, build.labels, build.extra_hosts,
deploy.labels, deploy.update_config, deploy.rollback_config, deploy.restart_policy, deploy.resources.limits,environment, healthcheck, labels, logging.options, sysctls, storage_opt, extra_hosts, ulimits
对于 healthcheck 而言,有一个例外情况是:主映射不能指定 disable: true,除非所引用的映射也指定了 disable:true。在这种情况下,Compose 会返回错误。
services:
  common:
    image: busybox
    environment:
      TZ: utc
      PORT: 80
  cli:
    extends:
      service: common
    environment:
      PORT: 8080

cli服务的实际配置如下:

environment:
  PORT: 8080
  TZ: utc
image: busybox

在 blkio_config.device_read_bps、blkio_config.device_read_iops、blkio_config.device_write_bps、blkio_config.device_write_iops 以及 devices 和 volumes 中的项目也被视为映射关系,其中键是容器内部的目标路径。例如:

services:
  common:
    image: busybox
    volumes:
      - common-volume:/var/lib/backup/data:rw
  cli:
    extends:
      service: common
    volumes:
      - cli-volume:/var/lib/backup/data:ro

cli服务的实际配置如下所示,注意,已挂载的路径现在已指向新的卷名,并且已应用了“只读”标志。

image: busybox
volumes:
- cli-volume:/var/lib/backup/data:ro

如果所引用的服务定义中包含 extends 映射,则其下的各项将直接复制到新的合并定义中。然后再次启动合并过程,直至不再有 extends 键存在为止。例如:

services:
  base:
    image: busybox
    user: root
  common:
    image: busybox
    extends:
      service: base
  cli:
    extends:
      service: common

在此配置中,CLI 服务从 common 服务获取用户密钥,而 common 服务则从 base 服务获取该密钥。

image: busybox
user: root
  • 序列:各项会组合成一个新的序列。元素的顺序会保持不变,引用的项排在前面,主项排在其后。
以下这些键应被视为序列:cap_add, cap_drop, configs, deploy.placement.constraints, deploy.placement.preferences, deploy.reservations.generic_resources, device_cgroup_rules, expose, external_links, ports, secrets, security_opt
合并操作所产生的任何重复项都会被删除,以确保序列中仅包含唯一的元素。
services:
  common:
    image: busybox
    security_opt:
      - label=role:ROLE
  cli:
    extends:
      service: common
    security_opt:
      - label=user:USER

cli服务的实际配置如下

image: busybox
security_opt:
- label=role:ROLE
- label=user:USER
如果使用列表语法,则以下键也应被视为序列:dns、dns_search、env_file、tmpfs。与之前提到的序列字段不同,合并操作产生的重复项不会被删除。
  • 标量:主服务定义中的键优先于引用服务定义中的键。服务定义中的任何其他允许使用的键都应被视为标量类型。
37、external_links:将服务容器与 Compose 应用程序之外管理的服务相连接。external_links 定义要通过平台查找机制获取的现有服务的名称。可以指定形式为 SERVICE:ALIAS 的别名。
external_links:
  - redis
  - database:mysql
  - database:postgresql
38、extra_hosts:向容器网络接口配置文件(对于 Linux 系统而言为 /etc/hosts)中添加主机名映射。
  • 短格式语法:将纯字符串以列表形式进行使用。对于其他主机,必须以“主机名=IP 地址”的形式设置主机名和 IP 地址。
extra_hosts:
  - "somehost=162.242.195.82"
  - "otherhost=50.31.209.229"
  - "myhostv6=::1"

IPv6 地址可以用方括号括起来,例如:

extra_hosts:
  - "myhostv6=[::1]"

分隔符推荐使用“=”,但“:”也可使用。此功能自 Docker Compose 2.24.1 版本起引入。例如:

extra_hosts:
  - "somehost:162.242.195.82"
  - "myhostv6:::1"
  • 长格式语法:可以将 extra_hosts 设置为一个包含主机名与 IP 地址之间映射关系的字典。
extra_hosts:
  somehost: "162.242.195.82"
  otherhost: "50.31.209.229"
  myhostv6: "::1"

Compose 会在容器的网络配置中创建一个与 IP 地址和主机名相匹配的条目,这意味着对于 Linux 系统的 /etc/hosts 文件会新增一些行:

162.242.195.82  somehost
50.31.209.229   otherhost
::1             myhostv6

39、gpus:需要Docker Compose 2.30.0及以上版本。指定了将用于容器运行的 GPU 设备。这相当于一个带有隐式 GPU 特性的设备请求。

services:
  model:
    gpus:
      - driver: 3dfx
        count: 2

此外,还可以将“gpus”设置为字符串 all ,以将所有可用的 GPU 设备分配给容器。

services:
  model:
    gpus: all

40、group_add:用于指定容器内的用户需要具备成员资格的其他组(可通过组名或组编号指定)。

这种情况的一个实际应用场景是:当多个容器(以不同用户身份运行)需要共同读取或写入同一个共享卷中的文件时。该文件可以由所有容器共用的一个组来拥有,并在“group_add”中进行指定。

services:
  myservice:
    image: alpine
    group_add:
      - mail

在创建的容器内部运行时,必须显示该用户属于 mail 组,如果未声明 group_add 则这种情况就不会出现。

41、healthcheck:“healthcheck”属性用于声明一个检查项,用于确定服务容器是否“健康”。其工作方式与服务的 Docker 镜像中设置的“HEALTHCHECK”Dockerfile 指令相同,并且具有相同的默认值。Compose 文件可以覆盖 Dockerfile 中设置的值。

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

interval, timeout, start_period, and start_interval 均被设定为持续时间单位。此功能自 Docker Compose 2.20.2 版本起引入。

test 定义了用于检查容器健康状况的命令 Compose。该命令可以是字符串形式,也可以是列表形式。如果它是列表形式,则第一个元素必须是 NONE、CMD 或 CMD-SHELL。如果它是字符串形式,则相当于先指定 CMD-SHELL,然后再添加该字符串。

使用“CMD-SHELL”会以容器的默认 shell(对于 Linux 系统为 /bin/sh)来运行配置为字符串形式的命令。以下两种形式是等效的:

test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]

test: curl -f https://localhost || exit 1

“NONE”选项会禁用健康检查功能,其主要用途是通过服务的 Docker 镜像来禁用 Dockerfile 指令集Healthcheck。或者也可以通过设置“disable: true”来禁用由镜像设置的健康检查功能。

healthcheck:
  disable: true

42、hostname:声明服务容器使用的自定义主机名。该主机名必须符合 RFC 1123 标准的规定。

43、image:指定了容器启动时所依据的镜像。镜像必须遵循开放容器规范可寻址镜像格式,

即 [<registry>/][<project>/]<image>[:<tag>|@<digest>]

    image: redis
    image: redis:5
    image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7
    image: library/redis
    image: docker.io/library/redis
    image: my_private.registry:5000/redis

如果该镜像不在该平台上,Compose 将会根据拉取策略尝试去获取它。如果您同时使用了“Compose 构建规范”,则还有其他方法可以控制从源代码构建镜像与先进行拉取操作之间的优先级关系,不过拉取镜像始终是默认操作方式。

只要在配置文件中声明了构建部分,就可以省略image属性,如果您未使用 Compose 构建规范,那么如果配置文件中缺少镜像,Compose 将无法正常工作。

44、init:init 会在容器内部运行一个初始化进程(进程 ID 为 1),该进程负责转发信号并回收进程。将此选项设置为“true”可为服务启用此功能。

services:
  web:
    image: alpine:latest
    init: true

所使用的初始化二进制文件是针对特定平台的。

54、ipc:配置由服务容器设定的进程间通信隔离模式。

shareable:为容器分配其自身的私有 IPC 命名空间,并且可以与其他容器共享该命名空间。

service:{name} 使容器加入另一个容器的(可共享的)IPC 命名空间。

    ipc: "shareable"
    ipc: "service:[service name]"

55、isolation:指定了容器的隔离技术。支持的值因平台而异。

56、labels 为容器添加元数据。您可以使用数组或者映射来实现。建议使用反向 DNS 标记法,以避免您的标签与其他软件所使用的标签发生冲突。

labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"
  com.example.label-with-empty-value: ""
labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  - "com.example.label-with-empty-value"

Compose 会创建带有标准标签的容器:这些标签是 Docker Compose 自动添加的,不需要手动设置

com.docker.compose.project:将由 Compose 创建的所有资源设置为用户项目名称的形式。

com.docker.compose.service:将服务容器设置为与“Compose”文件中定义的服务名称相匹配的项。

com.docker.compose 标签前缀是保留的。在Compose文件中指定带有此前缀的标签会导致运行时错误。

57、label_file:需要Docker Compose 2.32.2及以上版本。该属性允许你从外部文件或一系列文件中为服务加载标签。这为管理多个标签提供了一种便捷的方式,避免了在“Compose”文件中造成混乱。该文件采用 key-value 格式,与环境文件(env_file)类似。你可以将多个文件以列表形式指定。使用多个文件时,将按照它们在列表中出现的顺序进行处理。如果同一标签在多个文件中均有定义,则列表中最后一个文件中的值将覆盖之前文件中的值。

services:
  one:
    label_file: ./app.labels

  two:
    label_file:
      - ./app.labels
      - ./additional.labels

如果一个标签在 label_file 指定的文件 和 labels 属性中都定义了,则以 labels 属性中的值为准。

58、links:用于定义指向另一个服务中容器的网络链接,可以同时指定服务名称和链接别名(SERVICE:ALIAS),或者仅指定服务名称。

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

链接服务的容器可通过与别名相同的主机名访问,或者如果未指定别名则可通过服务名称访问。

链接并非服务进行通信所必需的条件。若未设置特定的网络配置,任何服务都能通过其名称在 default 网络中访问到任何其他服务。如果服务指定了其所连接的网络,链接不会覆盖网络配置。未连接到共享网络的服务无法相互进行通信。Compose 不会提醒您有关配置不匹配的问题。

链接同样能够以与“depends_on”相同的方式隐性地表示服务之间的依赖关系,因此它们能够决定服务启动的顺序。

58、logging:定义服务的日志配置

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"
driver 指定了服务容器所使用的日志驱动程序。默认值和可用值会因平台而异。可以使用键值对的形式设置驱动程序特定的选项。
59、mac_address:需要 Docker Compose 2.24.0及以上版本。为服务容器设置Mac地址。
注意:容器运行时可能会拒绝此值,例如 Docker Engine 版本大于等于 25.0. 在这种情况下,您应该使用 networks.mac_address 代替。
60、mem_limit:为容器的内存分配量设置了一个限制,该限制以字符串形式表示,其中包含以字节为单位的数值。一旦设定,内存限制值必须与部署规范中的“limits.memory”属性保持一致。
61、mem_reservation:为容器可分配的内存量设置一个预留值,该值以表示字节值的字符串形式进行设置。一旦设定,内存预留值必须与部署规范中的“reservations.memory”属性保持一致。
62、mem_swappiness:以百分比的形式定义,其值介于 0 到 100 之间,用于指示主机内核将容器所使用的匿名内存页面进行交换的比率。
  • 0:关闭匿名页面交换功能。
  • 100:将所有匿名页面设置为可交换页面。
默认值因平台而异。
63、memswap_limit:定义了容器允许交换到磁盘的内存量。这是一个修饰属性,只有在 deploy 的 memory 属性已设置的情况下才有意义。使用交换功能可以让容器在内存用尽而自身又无法获取更多可用内存时,将多余的内存需求写入磁盘。频繁将内存交换到磁盘的应用程序会带来性能损失。
  • 如果将 memswap_limit 设置为一个正整数,那么必须同时设置 memory 和 memswap_limit。memswap_limit 表示可以使用的内存和交换空间的总量,而 memory 则控制非交换内存的使用量。因此,如果 memory="300m" 且 memswap_limit="1g",则容器可以使用 300m 的内存和 700m(1g - 300m)的交换空间。
  • 如果 memswap_limit 被设置为 0,则该设置将被忽略,其值将被视为未设置。
  • 如果 memswap_limit 的值与 memory 相同,并且 memory 被设置为一个正整数,那么容器将无法使用交换空间。
  • 如果“memswap_limit”未被设置,而“memory”已设定,那么只要主机容器配置了交换内存,该容器就可以使用与“memory”设定值相同的交换空间容量。例如,如果“memory”设置为“300m”,而“memswap_limit”未被设定,那么该容器总共可以使用 600m 的内存和交换空间。
  • 如果将 memswap_limit 明确设置为 -1,则容器可以使用无限量的交换空间,但上限为主机系统中的可用空间量。
64、models:需要Docker Compose 2.38.0及以上版本。定义服务在运行时使用的AI模型。每一个引用的模型必须在顶级属性 models中定义
 services:
  short_syntax:
    image: app
    models:
      - my_model
  long_syntax:
    image: app
    models:
      my_model:
        endpoint_var: MODEL_URL
        model_var: MODEL
当一项服务与一个模型关联时,Docker Compose 会注入环境变量,以便将 连接详情和模型标识传递给容器。这使得应用程序能够在运行时动态地定位并与模型进行通信,而无需硬编码相关值。
长格式语法:这种语法方式能让你更好地掌控环境变量的名称。
  • endpoint_var 用于设置存储模型运行器 URL 的环境变量的名称。
  • model_var 用于设置存储模型标识符的环境变量的名称。
如果其中任何一个项被省略,Compose 将会根据模型键自动生成环境变量的名称,并按照以下规则进行生成:
  • 将模型键转换为大写
  • 将任何“-”字符替换为“_”
  • 为端点变量添加“_URL”后缀
65、network_mode:设置服务容器的网络模式。
  • none:关闭所有容器网络连接。
  • host:让容器获得对主机网络接口的完全访问权限。
  • service:{名称}:通过引用指定容器的服务名称,让容器获得对指定容器的访问权限。
  • container:{名称}:通过引用指定容器的容器ID,让容器获得对指定容器的访问权限。
    network_mode: "host"
    network_mode: "none"
    network_mode: "service:[service name]"

一旦设置,不允许使用 networks 属性,并且 Compose 拒绝任何同时包含这两个属性的 Compose 文件。

66、networks:定义了容器所连接的网络,它通过引用 networks 这一顶级元素下的各项条目来实现。该属性有助于管理容器的网络相关方面,能够控制服务在 Docker 环境中的分段方式及相互之间的交互。此属性用于指定该服务的容器应连接到哪些网络。这对于定义容器之间以及与外部的通信方式至关重要。

services:
  some-service:
    networks:
      - some-network
      - other-network

隐式默认网络:如果在 Compose 文件中未指定networks 或者networks的值是空的,那么 Compose 将假定该服务会连接到 default 网络:

services:
  some-service:
    image: foo

实际上该示例等同于:

services:
  some-service:
    image: foo
    networks:
      default: {}

如果你希望该服务不连接网络,那么必须将“network_mode”设置为“none”。

以下是具体网络的子属性:aliases、interface_name 、ipv4_address, ipv6_address、link_local_ips 、mac_address 、driver_opts 、gw_priority 、priority。

aliases :为网络中的服务声明了备用主机名。同一网络中的其他容器可以使用服务名称或别名来连接到该服务的任意一个容器。由于别名是网络范围内的,所以同一项服务在不同的网络中可以有不同的别名。网络范围内的别名可以被多个容器以及多个服务共享。如果存在这种情况,那么该名称所指向的确切容器是无法保证的。

services:
  some-service:
    networks:
      some-network:
        aliases:
          - alias1
          - alias3
      other-network:
        aliases:
          - alias2

在以下示例中,服务 frontend 能够通过主机名 backend 或 “back-tier 网络别名 database 访问 backend 服务。服务 monitoring 则能够通过admin 网络中的 backend 或 mysql 访问同一 backend 服务。

services:
  frontend:
    image: example/webapp
    networks:
      - front-tier
      - back-tier

  monitoring:
    image: example/monitoring
    networks:
      - admin

  backend:
    image: example/backend
    networks:
      back-tier:
        aliases:
          - database
      admin:
        aliases:
          - mysql

networks:
  front-tier: {}
  back-tier: {}
  admin: {}

interface_name:需要Docker Compose 2.36.0及以上版本。允许你指定用于将服务连接到特定网络的网络接口的名称。这确保了在不同服务和网络之间具有一致且可预测的接口名称。

services:
  backend:
    image: alpine
    command: ip link show
    networks:
      back-tier:
        interface_name: eth0

ipv4_address, ipv6_address:在加入网络时,为服务容器指定一个静态 IP 地址。在顶级 networks 属性中,相应的网络配置必须具有一个“ipam”属性,该属性下的子网配置需涵盖每个静态地址。

services:
  frontend:
    image: example/webapp
    networks:
      front-tier:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10

networks:
  front-tier:
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/24"
        - subnet: "2001:3984:3989::/64"

link_local_ips:指定了一个链路本地 IP 地址列表。链路本地 IP 是一种特殊的 IP 地址,属于一个众所周知的子网,并且完全由运营商管理,通常取决于其部署的架构。

services:
  app:
    image: busybox
    command: top
    networks:
      app_net:
        link_local_ips:
          - 57.123.22.11
          - 57.123.22.13
networks:
  app_net:
    driver: bridge

mac_address :需要Docker Compose 2.23.2及以上版本。设置服务容器在连接到此特定网络时所使用的 MAC 地址。

driver_opts :用于指定一系列以键值对形式呈现的选项,以传递给驱动程序。这些选项取决于具体的驱动程序。如需了解更多信息,请查阅该驱动程序的文档。

services:
  app:
    networks:
      app_net:
        driver_opts:
          foo: "bar"
          baz: 1

gw_priority:需要Docker Compose 2.33.1及以上版本。具有最高 gw_priority 值的网络将被选为服务容器的默认网关。若未指定,则默认值为 0 。在以下示例中,app_net_2 将被选为默认网关。

services:
  app:
    image: busybox
    command: top
    networks:
      app_net_1:
      app_net_2:
        gw_priority: 1
      app_net_3:
networks:
  app_net_1:
  app_net_2:
  app_net_3:

priority :指定了 Compose 将服务的容器连接到其网络的顺序。若未指定,默认值为 0。

如果容器运行时在服务级别接受“mac_address”属性,那么该属性将被应用于具有最高优先级的网络。在其他情况下,请使用“networks.mac_address”属性。

优先级不会影响默认网关所选的网络。请使用“gw_priority”属性来实现这一目的。

优先级并不能控制网络连接在容器中的添加顺序,也不能用于确定容器内的设备名称(如 eth0 等)。

services:
  app:
    image: busybox
    command: top
    networks:
      app_net_1:
        priority: 1000
      app_net_2:

      app_net_3:
        priority: 100
networks:
  app_net_1:
  app_net_2:
  app_net_3:

67、oom_kill_disable:如果“oom_kill_disable”被设置为“是”,则 Compose 会将平台配置为在出现内存耗尽的情况时不会终止容器。

68、oom_score_adj:用于调整容器被平台强制终止的偏好设置,以应对内存耗尽的情况。其值必须在 -1000 到 1000 的范围内。值为被终止的优先级,值越高越容易被杀死。越低越不容易被杀死。

69、pid:用于设置由 Compose 创建的容器的 PID 模式。其支持的值因平台而异。

70、pids_limit:用于调整容器的进程标识符(PID)限制。将其设置为 -1 即表示无限制的 PID 数量。

pids_limit: 10

一旦设定,pid_limit 的值必须与部署规范中的 pid 属性保持一致。

71、platform:平台定义了服务容器运行所依赖的目标平台。其采用“os[/arch[/variant]]”的语法格式。os、arch 和 variant 的值必须符合 OCI 镜像规范所采用的约定。

Compose 利用此属性来决定要拉取的镜像版本以及服务构建将在哪个平台上进行。

platform: darwin
platform: windows/amd64
platform: linux/arm64/v8
72、ports:该端口用于定义主机机器与容器之间的端口映射关系。这对于实现容器内部服务的对外访问至关重要。可以通过短格式的语法进行简单端口映射的定义,也可以使用长格式语法,其中包含诸如协议类型和网络模式等额外选项。
注意:在“network_mode: host”模式下,不能使用端口映射功能。这样做会导致运行时错误,因为“network_mode: host”已经将容器端口直接暴露到了主机网络中,所以无需进行端口映射操作。
短格式语法:是一个以冒号分隔的字符串,用于设置主机 IP、主机端口和容器端口,其格式为:[HOST:]CONTAINER[/PROTOCOL]
  • HOST 的设置为 [IP:](端口 | 范围)(可选)。若未进行设置,则会绑定到所有网络接口(0.0.0.0)。
  • CONTAINER的设置为 端口 | 范围。
  • PROTOCOL 将端口限制为指定的协议,即 TCP 或 UDP(可选)。默认协议为 TCP。
端口可以是单一的值,也可以是范围。主机和容器必须使用相同的范围。
既可以指定主机端口和容器端口(格式为“HOST:CONTAINER”),也可以只指定容器端口。在后一种情况下,容器运行时会自动分配主机上未被使用的任何端口。
HOST:CONTAINER 应始终以(带引号的)字符串形式进行指定,以避免与 YAML 的基于 60 的浮点数格式产生冲突。
IPv6 地址可以用方括号括起来。
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"
  - "::1:6000:6000"
  - "[::1]:6001:6001"
  - "6060:6060/udp"

注意:如果容器引擎不支持主机 IP 映射功能,那么 Compose 将会拒绝该 Compose 文件,并忽略所指定的主机 IP 。

长格式语法:这种长格式语法允许您配置一些在短格式中无法表达的额外字段。

target:容器端口。

published:公开暴露的端口。它被定义为一个字符串,并可以使用语法 start-end 的方式设置为一个范围。这意味着实际的端口会被分配一个在设定范围内的可用端口。

host_ip:主机 IP 映射。如果未设置,它会绑定到所有网络接口(0.0.0.0)。

protocol:端口协议(tcp 或 udp)。默认为 tcp。

app_protocol:此端口用于的应用协议(TCP/IP 级别4 / OSI 级别7)。这是可选的,并且可以作为 Compose 提供对它理解的协议更丰富行为的提示。在 Docker Compose 版本 2.26.0 中引入。

mode:在 Swarm 设置中指定端口的发布方式。如果设置为 host,它会在 Swarm 的每个节点上发布端口。如果设置为 ingress,它会在 Swarm 的节点之间允许负载均衡。默认为 ingress。

name:端口的人类可读名称,用于在服务中记录其使用情况。

ports:
  - name: web
    target: 80
    host_ip: 127.0.0.1
    published: "8080"
    protocol: tcp
    app_protocol: http
    mode: host

  - name: web-secured
    target: 443
    host_ip: 127.0.0.1
    published: "8083-9000"
    protocol: tcp
    app_protocol: https
    mode: host
73、post_start:需要Docker Compose 2.30.0及以上版本。定义了一组在容器启动后运行的生命周期钩子。该指令的具体执行时间无法保证。
  • command:指定了容器启动后要运行的命令。此属性是必需的,并且您可以选择使用 shell 形式或 exec 形式。
  • user:运行该命令的用户。如果未设置,则该命令将以与主服务命令相同的用户身份运行。
  • privileged:允许 post_start 命令以具有特权访问权限的方式运行。
  • working_dir:运行该命令的工作目录。如果未设置,则在与主服务命令相同的工作目录中运行。
  • environment:为 post_start 命令专门设置环境变量。虽然该命令继承了为服务主命令定义的环境变量,但此部分允许您添加新变量或覆盖现有变量。
services:
  test:
    post_start:
      - command: ./do_something_on_startup.sh
        user: root
        privileged: true
        environment:
          - FOO=BAR

欲了解更多信息,请参阅“使用生命周期钩子(Use lifecycle hooks.)”部分。

74、pre_stop:需要Docker Compose 2.30.0及以上版本。该属性定义了一组在容器停止之前运行的生命周期钩子。如果容器是自行停止或突然被终止的,那么这些钩子将不会运行。配置与 post_start相同。

75、privileged:配置服务容器以使用提升权限的方式运行。支持情况和实际影响因平台而异。

76、profiles:定义了服务在启用时所依据的命名配置文件列表。如果未进行指定,则服务将始终启动;但如果进行了指定,则只有在激活了相应的配置文件时,服务才会启动。如果存在的话,这些 profiles 将遵循 [a-zA-Z0-9][a-zA-Z0-9_.-]+ 这样的正则表达式格式。

services:
  frontend:
    image: frontend
    profiles: ["frontend"]

  phpmyadmin:
    image: phpmyadmin
    depends_on:
      - db
    profiles:
      - debug
version: '3.9'
services:
  # 基础服务 - 所有环境都需要
  postgres:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine

  # 生产环境应用
  app:
    image: myapp:prod
    environment:
      - APP_ENV=production
      - DB_HOST=postgres
    depends_on:
      - postgres
      - redis
    profiles: ["prod"]
    ports:
      - "8080:8080"

  # 开发环境应用(带热重载)
  app-dev:
    image: myapp:dev
    environment:
      - APP_ENV=development
      - DB_HOST=postgres
    profiles: ["dev"]
    volumes:
      - ./app:/app
      - /app/node_modules
    ports:
      - "3000:3000"
    command: npm run dev

  # 测试环境额外服务
  selenium:
    image: selenium/standalone-chrome
    profiles: ["test", "integration"]
    shm_size: 2gb

  # 监控工具
  prometheus:
    image: prom/prometheus
    profiles: ["monitoring"]
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  grafana:
    image: grafana/grafana
    profiles: ["monitoring"]
    ports:
      - "3001:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    depends_on:
      - prometheus

volumes:
  postgres_data:

docker compose up 启动容器服务不带profiles标记的

docker compose --profile dev up 启动开发环境

docker compose --profile dev --profile monitoring up

docker compose --profile "*" up 启动所有服务,包括带prifiles的。

docker compose --profile dev config 查看不同profile的配置

77、provider:需要Docker Compose 2.36.0 及以上版本。该属性用于定义那些 Compose 无法直接管理的服务。Compose 将服务的生命周期交由专门的或第三方组件来负责管理。

  database:
    provider:
      type: awesomecloud
      options:
        type: mysql
        foo: bar
  app:
    image: myapp
    depends_on:
       - database
在 Compose 运行应用程序时,会使用 awesomecloud 二进制文件来管理数据库服务的设置。依赖服务应用程序会接收到以服务名称为前缀的额外环境变量,以便能够访问资源。
举例来说,假设 awesomecloud 执行过程产生了变量 URL 和 API_KEY,那么应用程序服务则会使用环境变量 DATABASE_URL 和 DATABASE_API_KEY 进行运行。
当 Compose 停止应用程序时,会使用 awesomecloud 这个二进制文件来管理数据库服务的关闭操作。
Compose 用于将服务生命周期委托给外部二进制文件的机制在 Compose 可扩展性文档( Compose extensibility documentation .)中有详细说明。
如需了解有关使用“提供者”属性的更多信息,请参阅“使用提供者服务( Use provider services .)”。
  • type:属性是必需的。它定义了由 Compose 用于管理设置和拆除生命周期事件的外部组件。
  • options:选项特定于所选的提供程序,且不由Compose规范进行验证。
78、pull_policy:定义了 Compose 在开始拉取镜像时所做出的决策。可能的值有:
  • always:Compose 始终从镜像仓库拉取镜像。
  • never:Compose 不会从镜像仓库拉取镜像,而是依赖平台缓存的镜像。如果没有缓存的镜像,则会报告失败。
  • missing:仅当平台缓存中没有该镜像时,Compose 才会拉取镜像。如果未同时使用 Compose 构建规范,这是默认选项。为实现向后兼容,if_not_present 被视为该值的别名。即使使用“缺失时”拉取策略,也始终会拉取最新标签的镜像。
  • build:Compose 构建镜像。如果镜像已存在,Compose 会重新构建该镜像。
  • daily:如果上一次拉取操作发生在 24 小时之前,Compose 会检查镜像仓库以获取镜像更新。
  • weekly:如果上一次拉取操作发生在 7 天之前,Compose 会检查镜像仓库以获取镜像更新。
  • every_<时间段>:如果上一次拉取操作发生在<时间段>之前,Compose 会检查镜像仓库以获取镜像更新。时间段可以用周(w)、天(d)、小时(h)、分钟(m)、秒(s)表示,或使用这些单位的组合。
services:
  test:
    image: nginx
    pull_policy: every_12h
79、read_only:将服务容器配置为使用只读文件系统进行创建。
80、restart:定义了该平台在容器终止时所采用的策略。
  • no:默认的重启策略。在任何情况下都不会重启容器。
  • always:无论何时,只要容器被删除,该策略都会重启容器。
  • on-failure[:max-retries]:如果退出代码表明存在错误,则该策略会重启容器。可选地,还可以限制 Docker 守护进程尝试的重启重试次数。
  • unless-stopped:该策略无论退出代码如何都会重启容器,但在服务停止或被删除时会停止重启操作。
    restart: "no"
    restart: always
    restart: on-failure
    restart: on-failure:3
    restart: unless-stopped

81、runtime:指定用于服务容器的运行时环境。例如,runtime 可以是 OCI 运行时规范的一种实现名称(an implementation of OCI Runtime Spec,),比如“runc”。

web:
  image: busybox:latest
  command: true
  runtime: runc

默认使用的运行环境是“runc”。若要使用其他运行环境,请参阅“替代运行环境( Alternative runtimes)”部分。

82、scale:指定了此服务默认要部署的容器数量。若同时设置了这两个值,则“scale”必须与“Deploy Specification”中的“replicas”属性保持一致。

83、secrets:该属性允许按服务级别访问由“secrets”顶级元素定义的敏感数据。服务可以被授予访问多个 secret 的权限。

支持两种不同的语法形式:短格式语法和长格式语法。在同一个 Compose 文件中,可以同时使用长格式语法和短格式语法来表示密钥信息。

如果密钥不在平台上存在,或者未在“Compose”文件的顶层 secrets 部分中进行定义,那么该操作将会报告错误。

在顶级 secrets 定义的密钥禁止按时授予对该密钥的任何服务访问权限。此类授权必须在服务规范中明确列出,作为密钥服务元素的一部分。

短格式语法:这种段格式的语法变体仅指定了密钥名称。这使得容器能够访问该密钥,并将其以只读方式挂载到容器内的 /run/secrets/ 目录中。源名称和目标挂载点都设置为密钥名称。

以下示例使用了简短的语法来授予 frontend 服务对 server-certificate 密钥的访问权限。服务器证书的值被设置为文件“./server.cert”中的内容。

services:
  frontend:
    image: example/webapp
    secrets:
      - server-certificate
secrets:
  server-certificate:
    file: ./server.cert
长格式语法:这种语法在服务容器内部密钥信息的生成方式上提供了更精细的控制。
  • source:平台中该秘密的名称。
  • target:在服务的任务容器中的 /run/secrets/ 目录中要挂载的文件的名称,或者如果需要使用其他位置,则为文件的绝对路径。如果未指定,则默认值为源。
  • uid 和 gid:在服务的任务容器中的 /run/secrets/ 目录中拥有该文件的数字 uid 或 gid。
  • mode:在服务的任务容器中的 /run/secrets/ 目录中挂载该文件的权限,以八进制表示形式。默认值为世界可读权限(模式 0444)。如果设置了.则可写位必须忽略。可以设置可执行位。
请注意, 当 secret 的来源是文件时,Docker Compose 无法实现对 uid、gid 和 mode 属性的支持。这是因为其内部使用的绑定挂载不支持 uid 重映射。
以下示例将 server-certificate 密钥文件的名称设置为 server.cert (位于容器内),将模式设置为 0440(组可读),并将用户和组设置为 103。server-certificate的值被设置为文件“./server.cert”中的内容。
该实例运行时会提示警告信息 WARN[0000] secrets uid, gid and mode are not supported, they will be ignored,因为secret的来源是文件。如果server-certificate改为外部就可以了。
services:
  frontend:
    image: example/webapp
    secrets:
      - source: server-certificate
        target: server.cert
        uid: "103"
        gid: "103"
        mode: 0o440
secrets:
  server-certificate:
    file: ./server.cert

84、security_opt :改变了每个容器的默认标注方案。

security_opt:
  - label=user:USER
  - label=role:ROLE

如需更改默认的标签设置方案,请参阅“安全配置(Security configuration).”部分。

85、shm_size:配置了服务容器所允许使用的共享内存的大小(在 Linux 系统中为 /dev/shm 分区)。其值以字节为单位进行指定。

86、stdin_open:将服务的容器配置为使用已分配的输入标准流来运行。这与使用“-i”标志运行容器的效果相同。如需了解更多信息,请参阅“保持输入标准流打开(Keep stdin open)”。

支持的值为true 或者 false

87、stop_grace_period:规定了在尝试停止容器时,如果容器未响应 SIGTERM(或者与停止信号相关的任何其他信号)的情况下,Compose 必须等待多长时间,然后才会发送 SIGKILL 信号。该时间是以持续时间的形式来表示的。

默认情况下,容器在接收到 SIGKILL 信号前需等待 10 秒钟才会退出。

    stop_grace_period: 1s
    stop_grace_period: 1m30s

88、stop_signal :定义了 Compose 用于停止服务容器的信号。若未设置,则 Compose 会通过发送 SIGTERM 信号来停止这些容器。

stop_signal: SIGUSR1

89、storage_opt :定义服务存储驱动选项

storage_opt:
  size: '1G'

90、sysctls:用于定义在容器中要设置的内核参数。sysctls 可以采用数组或映射的形式。

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

只能使用在内核中进行命名空间处理的系统控制参数。Docker 不支持在容器内部更改系统控制参数,因为这会同时影响主机系统。有关支持的系统控制参数的概述,请参阅在运行时配置命名空间内核参数(configure namespaced kernel parameters (sysctls) at runtime)。

91、tmpfs:在容器内部挂载一个临时文件系统。该文件系统可以是一个单一的值,也可以是一个列表。

tmpfs:
 - <path>
 - <path>:<options>
  • path:容器内部用于挂载 tmpfs 的路径。
  • options:以逗号分隔的用于 tmpfs 挂载的选项列表。可用的选项如下:
    • mode:设置文件系统的权限。
    • uid:设置拥有已挂载的 tmpfs 文件系统的用户 ID 。
    • gid:设置拥有已挂载的 tmpfs 文件系统的组 ID。
services:
  app:
    tmpfs:
      - /data:mode=755,uid=1009,gid=1009
      - /run

92:tty:将服务的容器配置为以终端仿真器(TTY)的形式运行。这与使用 -t 或 --tty 标志运行容器的效果相同。如需了解更多信息,请参阅“分配伪终端”。

支持的值为 true 或者 false。

93、ulimits :覆盖容器的默认限制设置。其设定方式为:对于单个限制,可指定为一个整数;对于软限制或硬限制,则需以映射形式进行指定。

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

94、use_api_socket :当“use_api_socket”被设置时,容器能够通过 API 通道与底层容器引擎进行交互。凭证会被挂载到容器内部,因此该容器仅作为针对容器引擎相关命令的纯粹执行代理。通常,由容器运行的命令可以将内容推送到您的注册表中,并从您的注册表中拉取内容。

95、user:覆盖用于运行容器进程的用户。默认设置由镜像决定,例如 Dockerfile 中的 USER 指令。如果没有设置,默认则是以 root 身份运行。

96、userns_mode :用于设置服务的用户命名空间。其支持的值因平台而异,并可能取决于平台的配置情况。

userns_mode: "host"
97、uts:需要Docker Compose 2.15.1及以上版本。为服务容器设置 UTS 名称空间模式。若未指定,则由运行时决定是否分配 UTS 名称空间(如果支持该功能的话)。可能的值为:
  • host:使容器使用与主机相同的 UTS 命名空间
uts: "host"

98、volumes:用于定义服务容器可访问的挂载主机路径或命名卷。可以使用 volumes属性定义多种类型的挂载,比如 volume、bind、tmpfs或npipe。

如果挂载的是主机路径,并且只有单个服务使用,可以声明为服务定义的一部分。如果在多个服务之间重复使用一个卷,需要在顶级属性volumes中声明一个命名卷。

以下示例展示了 backend 服务使用了命名卷 db-data,还有一个单个服务的绑定挂载。

services:
  backend:
    image: example/backend
    volumes:
      - type: volume
        source: db-data
        target: /data
        volume:
          nocopy: true
          subpath: sub
      - type: bind
        source: /var/run/postgres/postgres.sock
        target: /var/run/postgres/postgres.sock

volumes:
  db-data:
短格式语法:这种短格式语法使用一个以冒号分隔值的单一字符串来指定卷挂载(VOLUME:CONTAINER_PATH)或访问模式(VOLUME:CONTAINER_PATH:ACCESS_MODE)。
  • VOLUME:可以是托管容器的平台上的主机路径(绑定挂载)或者是一个卷名称。
  • CONTAINER_PATH:卷在容器中的挂载路径。
  • ACCESS_MODE:以逗号分隔的选项列表:
  • rw:读写访问。如果未指定则为默认值。
  • ro:只读访问。
  • z:SELinux 选项,表示绑定挂载的主机内容在多个容器之间共享。
  • Z:SELinux 选项,表示绑定挂载的主机内容是私有且不供其他容器共享。
注意:
  • 在未安装 SELinux 的系统中,SELinux 的重新标签绑定挂载选项将被忽略。
  • 部署到本地容器运行时的时候,Compose只支持相对的主机路径。因为相对路径是从 Compose 文件的父目录中解析出来的,而这种解析方式仅适用于本地环境。当 Compose 部署到非本地平台时,它会拒绝使用相对主机路径的 Compose 文件,并会给出错误提示。为了避免命名卷的歧义,相对路径应始终以 . 或... 开头。
  • 对于绑定挂载,短格式语法会在主机上的源路径处创建一个目录(如果该目录不存在的话)。这是为了与 Docker Compose 的旧版本保持兼容性。可以通过使用长格式语法并设置 create_host_path 为 false 来避免这种情况。
长格式语法:这种语法允许设置一些在短格式中无法表达的额外字段。
  • type:挂载类型。可选值为 volume, bind, tmpfs, image, npipe 或 cluster。
  • source:挂载的来源,绑定挂载为主机上的路径、镜像挂载为 Docker 镜像引用,或者是在顶层“volumes”键中定义的卷的名称。对于 tmpfs 挂载不适用。
  • target:容器中挂载卷的路径。
  • read_only:设置卷为只读的标志。
  • bind:用于配置额外的绑定选项:
  • propagation:用于绑定的传播模式。
  • create_host_path:如果源路径所在的主机目录不存在,则创建该目录。默认值为 true。
  • selinux: 重新标签选项 z(共享)或 Z(私有)
  • volume:配置额外的卷选项:
  • nocopy:创建卷时禁用从容器中复制数据的标志。
  • subpath:在卷内部挂载的路径,而非卷根路径。
  • tmpfs:配置额外的 tmpfs 选项:
  • size:tmpfs 挂载的大小(以字节为单位,可以是数字或以字节单位表示)。
  • mode:tmpfs 挂载的文件模式,以 Unix 权限位(八进制数)表示。在 Docker Compose 版本 2.14.0 中引入。
  • image:配置额外的镜像选项:
    • subpath:在源镜像内部指定用于挂载的路径,而非镜像根目录。在 Docker Compose 版本 2.35.0 中可用。
  • consistency:挂载的一致性要求。可用值取决于平台。
提示:在使用大型存储库或单体仓库,或者使用无法与您的代码库相适应的虚拟文件系统时该怎么办?Compose 现在利用了同步文件共享功能,并会自动为挂载创建文件共享。请确保您使用付费订阅登录到 Docker,并在 Docker Desktop 的设置中启用“访问实验性功能”以及“使用 Compose 管理同步文件共享”。
99、volumes_from:将来自其他服务或容器的所有卷进行挂载。可以选择指定只读访问权限(ro)或读写访问权限(rw)。如果未指定访问级别,则使用读写访问权限。
还可以通过使用 container: 前缀的方式,从非由 Compose 管理的容器中挂载卷。
volumes_from:
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

100、working_dir :覆盖容器所指定的、由镜像定义的工作目录,例如 Dockerfile 中的“WORKDIR”指令所指定的目录。

更多推荐