服务顶级元素

服务是应用程序中计算资源的抽象定义,可以独立于其他组件进行扩展或替换。服务由一组容器支持,由平台根据复制要求和放置约束运行。由于服务由容器支持,因此它们由 Docker 映像和一组运行时参数定义。服务中的所有容器都是使用这些参数创建的。

Compose 文件必须将services顶级元素声明为映射,其键是服务名称的字符串表示形式,其值是服务定义。服务定义包含应用于每个服务容器的配置。

每个服务还可能包含一个build部分,该部分定义如何为该服务创建 Docker 映像。 Compose 支持使用此服务定义构建 docker 镜像。如果未使用,该build部分将被忽略,并且 Compose 文件仍被视为有效。构建支持是 Compose 规范的一个可选方面,在Compose 构建规范文档中有详细描述 。

每个服务都定义运行其容器的运行时约束和要求。该deploy部分对这些约束进行分组,并允许平台调整部署策略,以最好地匹配容器的需求与可用资源。部署支持是 Compose 规范的一个可选方面,并在Compose 部署规范文档中详细描述 。如果未实现,该deploy部分将被忽略,并且 Compose 文件仍被视为有效。

注释

annotations定义容器的注释。annotations可以使用数组或映射。

annotations:
  com.example.foo: bar
annotations:
  - com.example.foo=bar

Docker Compose 2.20.0版本中引入

attach定义并设置为falseCompose 时,不会收集服务日志,除非您明确请求。

默认服务配置是attach: true.

建造

build指定用于从源创建容器映像的构建配置,如 Compose 构建规范中所定义。

块配置

blkio_config定义一组配置选项来设置服务的块 IO 限制。

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:作为整数值,表示每秒允许的操作数。

重量

修改分配给某个服务相对于其他服务的带宽比例。采用 10 到 1000 之间的整数值,默认值为 500。

重量设备

按设备微调带宽分配。列表中的每个项目必须有两个键:

  • path:定义受影响设备的符号路径。
  • weight:10 到 1000 之间的整数值。

CPU计数

cpu_count定义服务容器可用的CPU数量。

cpu_百分比

cpu_percent定义可用 CPU 的可用百分比。

cpu共享数

cpu_shares将服务容器相对于其他容器的相对 CPU 权重定义为整数值。

CPU周期

cpu_period当平台基于Linux内核时,配置CPU CFS(Completely Fair Scheduler)周期。

CPU配额

cpu_quota当平台基于Linux内核时,配置CPU CFS(Completely Fair Scheduler)配额。

cpu_rt_运行时

cpu_rt_runtime为支持实时调度程序的平台配置CPU分配参数。它可以是一个以微秒为单位的整数值,也可以是一个 持续时间

 cpu_rt_runtime: '400ms'
 cpu_rt_runtime: 95000`

cpu_rt_period

cpu_rt_period为支持实时调度程序的平台配置CPU分配参数。它可以是一个以微秒为单位的整数值,也可以是一个 持续时间

 cpu_rt_period: '1400us'
 cpu_rt_period: 11000`

中央处理器

cpus定义分配给服务容器的(可能是虚拟的)CPU 数量。这是一个小数。 0.000意味着没有限制。

设置时,必须与部署规范中的属性 cpus一致。cpus

中央处理器组

cpuset定义允许执行的显式 CPU。可以是范围0-3或列表0,1

上限添加

cap_add将附加容器 功能指定 为字符串。

cap_add:
  - ALL

上限下降

cap_drop指定要作为字符串删除的容器 功能。

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

组组

Docker Compose 2.15.0版本中引入

cgroup指定要加入的 cgroup 命名空间。取消设置后,容器运行时将决定选择使用哪个 cgroup 命名空间(如果支持)。

  • host:在容器运行时 cgroup 命名空间中运行容器。
  • private:在自己的私有 cgroup 命名空间中运行容器。

cgroup_父级

cgroup_parent为容器指定一个可选的父 cgroup 。

cgroup_parent: m-executor-abcd

命令

command覆盖容器镜像声明的默认命令,例如 Dockerfile 的CMD.

command: bundle exec thin -p 3000

该值也可以是一个列表,其方式类似于 Dockerfile

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

如果值为null,则使用映像中的默认命令。

如果值为[](空列表)或''(空字符串),则忽略图像声明的默认命令,即覆盖为空。

配置

配置允许服务调整其行为,而无需重建 Docker 镜像。服务仅在configs属性显式授予时才能访问配置。支持两种不同的语法变体。

config如果平台上不存在或者未在 Compose 文件的configs顶级元素中定义, Compose 会报告错误。

为配置定义了两种语法:短语法和长语法。

您可以授予服务访问多个配置的权限,并且可以混合使用长语法和短语法。

简短语法

短语法变体仅指定配置名称。这将授予容器对配置的访问权限,并将其作为文件安装到服务容器的文件系统中。容器内挂载点的位置默认为/<config_name>Linux 容器和C:\<config-name>Windows 容器。

以下示例使用短语法授予redis服务对my_configmy_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:要在服务的任务容器中安装的文件的路径和名称。/<source>如果未指定则默认为。
  • uidgid:拥有服务任务容器内已安装配置文件的数字 UID 或 GID。未指定时的默认值为 USER 运行容器。
  • mode: 在服务的任务容器中安装的文件的权限(以八进制表示法)。默认值是世界可读的 ( 0444)。可写位必须被忽略。可以设置可执行位。

以下示例将容器内的名称设置为my_configto 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

容器名称

container_name是一个字符串,指定自定义容器名称,而不是默认生成的名称。

container_name: my-web-container

如果 Compose 文件指定了 container_name.尝试这样做会导致错误。

container_name遵循正则表达式格式[a-zA-Z0-9][a-zA-Z0-9_.-]+

凭证规范

credential_spec配置托管服务帐户的凭据规范。

file:如果您有使用 Windows 容器的服务,则 可以registry:使用credential_spec. Compose 还支持自定义用例的附加协议。

必须采用或 的credential_spec格式。file://<filename>registry://<value-name>

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 配置示例

为服务配置 gMSA 凭据规范时,只需使用 指定凭据规范config,如以下示例所示:

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

configs:
  my_credentials_spec:
    file: ./my-credential-spec.json|

依赖于取决于

depends_on表达服务之间的启动和关闭依赖关系。

简短语法

短语法变体仅指定依赖项的服务名称。服务依赖性会导致以下行为:

  • Compose 按依赖顺序创建服务。在以下示例中,dbredis是在 之前创建的web

  • Compose 按依赖顺序删除服务。在以下示例中,和web之前被删除。dbredis

简单的例子:

services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

Compose 保证依赖服务在启动依赖服务之前就已启动。在启动依赖服务之前,Compose 会等待依赖服务“准备就绪”。

长语法

长格式语法允许配置无法以短格式表达的附加字段。

  • restart:设置为trueCompose 时,会在更新依赖项服务后重新启动该服务。这适用于由 Compose 操作控制的显式重新启动,并且不包括在容器终止后由容器运行时自动重新启动。在 Docker Compose 版本 2.17.0中引入。

  • condition:设置认为满足依赖关系的条件

    • service_started:与上述短语法等效
    • service_healthy:指定在启动依赖服务之前,依赖项预计“健康”(如 healthcheck所示)。
    • service_completed_successfully:指定依赖项预计在启动依赖服务之前成功完成。
  • required:设置为falseCompose 时,仅在依赖项服务未启动或不可用时向您发出警告。如果未定义,则默认required值为true。在 Docker Compose 版本 2.20.0中引入。

服务依赖性会导致以下行为:

  • Compose 按依赖顺序创建服务。在以下示例中,dbredis是在 之前创建的web

  • Compose 等待运行状况检查传递标有 的依赖项service_healthy。在下面的示例中,预计在创建db之前是“健康”的。web

  • Compose 按依赖顺序删除服务。在以下示例中,和web之前被删除。dbredis

services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
        restart: true
      redis:
        condition: service_started
  redis:
    image: redis
  db:
    image: postgres

Compose 确保依赖服务在启动依赖服务之前启动。service_healthy在启动依赖服务之前,Compose 保证标记为“健康”的依赖服务 。

部署

deploy指定服务的部署和生命周期的配置,如 Compose 部署规范 中所定义。

发展

Docker Compose 2.22.0版本中引入

develop指定用于维护容器与源同步的开发配置,如 开发部分中所定义。

设备_cgroup_规则

device_cgroup_rules定义此容器的设备 cgroup 规则列表。该格式与 Linux 内核在 控制组设备白名单控制器中指定的格式相同。

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

设备

devices以 的形式定义已创建容器的设备映射列表 HOST_PATH:CONTAINER_PATH[:CGROUP_PERMISSIONS]

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

域名系统

dns定义要在容器网络接口配置上设置的自定义 DNS 服务器。它可以是单个值或列表。

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

域名选择

dns_opt列出要传递给容器的 DNS 解析器的自定义 DNS 选项(/etc/resolv.confLinux 上的文件)。

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

dns_search定义要在容器网络接口配置上设置的自定义 DNS 搜索域。它可以是单个值或列表。

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

域名

domainname声明用于服务容器的自定义域名。它必须是有效的 RFC 1123 主机名。

入口点

entrypoint声明服务容器的默认入口点。这会覆盖ENTRYPOINT服务 Dockerfile 中的指令。

如果entrypoint非空,Compose 会忽略镜像中的任何默认命令,例如CMD Dockerfile 中的指令。

另请参阅 command设置或覆盖入口点进程要执行的默认命令。

在其简短形式中,该值可以定义为字符串:

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,则使用图像中的默认入口点。

如果值为[](空列表)或''(空字符串),则忽略图像声明的默认入口点,即覆盖为空。

环境文件

env_file根据文件内容向容器添加环境变量。

env_file: .env

env_file也可以是一个列表。列表中的文件是从上到下处理的。对于两个 env 文件中指定的同一变量,列表中最后一个文件的值有效。

env_file:
  - ./a.env
  - ./b.env

列表元素也可以声明为映射,然后您可以设置附加属性required。这默认为true.当required设置为false并且.env文件丢失时,Compose 会默默地忽略该条目。

env_file:
  - path: ./default.env
    required: true # default
  - path: ./override.env
    required: false

required该属性在 Docker Compose 2.24.0 或更高版本中可用。

相对路径是从 Compose 文件的父文件夹解析的。由于绝对路径会阻止 Compose 文件可移植,因此当使用此类路径设置env_file.

在环境部分中声明的环境变量 会覆盖这些值。即使这些值为空或未定义,这也成立。

环境文件格式

文件中的每一行都.env必须符合VAR[=[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"

环境

environment定义容器中设置的环境变量。environment可以使用数组或映射。任何布尔值; true、false、yes、no 应该用引号引起来,以确保它们不会被 YAML 解析器转换为 True 或 False。

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

地图语法:

environment:
  RACK_ENV: development
  SHOW: "true"
  USER_INPUT:

数组语法:

environment:
  - RACK_ENV=development
  - SHOW=true
  - USER_INPUT

当为服务同时设置env_file和时,设置的值优先。environmentenvironment

暴露

expose定义 Compose 从容器公开的(传入)端口或端口范围。这些端口必须可供链接服务访问,并且不应发布到主机。只能指定内部容器端口。

语法为<portnum>/[<proto>]or<startport-endport>/[<proto>]表示端口范围。如果未明确设置,则tcp使用协议。

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

笔记

expose如果映像的 Dockerfile 已公开端口,则即使未在 Compose 文件中设置,网络上的其他容器也可以看到该端口。

延伸

extends允许您在不同文件甚至完全不同的项目之间共享通用配置。您extends可以在一个地方定义一组通用的服务选项,并从任何地方引用它。您可以参考另一个 Compose 文件并选择您想要在自己的应用程序中使用的服务,并且能够根据自己的需要覆盖某些属性。

您可以extends与其他配置密钥一起在任何服务上使用。该值必须是使用必需键和可选键extends定义的映射。servicefile

extends:
  file: common.yml
  service: webapp
  • service:定义被引用为基础的服务的名称,例如webdatabase
  • file:定义该服务的 Compose 配置文件的位置。

当服务使用 时extends,它还可以指定对其他资源的依赖关系,volumes例如显式声明。但是,请务必注意,extends不会自动将目标卷定义合并到扩展 Compose 文件中。相反,您负责确保所扩展的服务存在等效资源以保持一致性。 Docker Compose 验证 Compose 模型中是否存在具有引用 ID 的资源。

对目标中其他资源的依赖关系extends可以是:

  • volumes通过, networks, configs, secrets, links,volumes_from或显式引用depends_on
  • 使用命名空间声明中的语法对另一个服务的引用service:{name}( ipc, pid, network_mode)

不支持循环引用extends,当检测到循环引用时,Compose 将返回错误。

查找参考服务

file值可以是:

  • 不存在。这表明正在引用同一 Compose 文件中的另一个服务。
  • 文件路径,可以是:
    • 相对路径。该路径被视为相对于主 Compose 文件的位置。
    • 绝对路径。

由 表示的服务service必须存在于已识别的引用 Compose 文件中。如果出现以下情况,Compose 将返回错误:

  • service未找到表示的服务。
  • file未找到表示的 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无法指定 。在这种情况下,Compose 将返回错误。disable: truedisable: true

例如,输入如下:

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_bpsblkio_config.device_read_iopsblkio_config.device_write_bpsblkio_config.device_write_iops和下的项目也被视为映射devicesvolumes其中 key 是容器内的目标路径。

例如,输入如下:

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。请注意,安装的路径现在指向新的卷名称,并且ro应用了标志。

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。在这里,cli服务user从服务获取密钥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, secretssecurity_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。与上面提到的序列字段不同,合并产生的重复项不会被删除。

标量

服务定义中任何其他允许的键都应被视为标量。

external_links将服务容器链接到在 Compose 应用程序外部管理的服务。 external_links定义要使用平台查找机制检索的现有服务的名称。SERVICE:ALIAS可以指定表单的别名。

external_links:
  - redis
  - database:mysql
  - database:postgresql

额外主机

extra_hosts将主机名映射添加到容器网络接口配置(/etc/hosts对于 Linux)。

简短语法

短语法在列表中使用纯字符串。值必须以 的形式设置其他主机的主机名和 IP 地址HOSTNAME=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

添加组

group_add按名称或编号指定容器内的用户必须是其成员的其他组。

一个有用的例子是当多个容器(以不同用户身份运行)需要在共享卷上读取或写入同一文件时。该文件可以由所有容器共享的组拥有,并在 group_add.

services:
  myservice:
    image: alpine
    group_add:
      - mail

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

健康检查

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

intervaltimeoutstart_periodstart_interval指定为持续时间。 Docker Compose 2.20.2版本中引入

test定义 Compose 运行以检查容器运行状况的命令。它可以是字符串或列表。如果它是一个列表,第一项必须是NONE,CMDCMD-SHELL。如果它是一个字符串,则相当于指定CMD-SHELL后跟该字符串。

# Hit the local web app
test: ["CMD", "curl", "-f", "http://localhost"]

使用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 指令最有用。或者,可以通过设置禁用图像设置的运行状况检查disable: true

healthcheck:
  disable: true

主机名

hostname声明用于服务容器的自定义主机名。它必须是有效的 RFC 1123 主机名。

图像

image指定启动容器的镜像。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 会尝试根据pull_policy.如果您还使用 Compose 构建规范,则可以使用其他选项来控制从源构建镜像的拉取优先级,但拉取镜像是默认行为。

image只要build声明了节,就可以从 Compose 文件中省略。如果您不使用 Compose 构建规范,则imageCompose 文件中缺少 Compose 将无法工作。

在里面

init在容器内运行一个 init 进程(PID 1),转发信号并获取进程。将此选项设置为true可为服务启用此功能。

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

使用的 init 二进制文件是特定于平台的。

工控机

ipc配置服务容器设置的IPC隔离模式。

  • shareable:为容器提供自己的私有 IPC 命名空间,并可以与其他容器共享。
  • service:{name}:使容器加入另一个容器的 ( shareable) IPC 命名空间。
    ipc: "shareable"
    ipc: "service:[service name]"

隔离

isolation指定容器的隔离技术。支持的值是特定于平台的。

标签

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 创建带有规范标签的容器:

  • com.docker.compose.project将 Compose 创建的所有资源设置为用户项目名称
  • com.docker.compose.service在具有 Compose 文件中定义的服务名称的服务容器上设置

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

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

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

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

服务之间的通信不需要链接。当未设置特定网络配置时,任何服务都可以通过default网络上该服务的名称访问任何其他服务。如果服务确实声明了它们所连接的网络,links则不会覆盖网络配置,并且未连接到共享网络的服务将无法进行通信。 Compose 不会警告您配置不匹配。

链接还以与depends_on相同的方式表达服务之间的隐式依赖关系 ,因此它们决定服务启动的顺序。

记录

logging定义服务的日志记录配置。

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

driver名称指定服务容器的日志记录驱动程序。默认值和可用值是特定于平台的。驱动程序特定选项可以设置options为键值对。

MAC地址

适用于 Docker Compose 版本 2.24.0 及更高版本。

mac_address设置服务容器的 MAC 地址。

注意 容器运行时可能会拒绝此值(即 Docker Engine >= v25.0)。在这种情况下,您应该使用 networks.mac_address

内存限制

mem_limit配置容器可以分配的内存量的限制,设置为表示 字节值的字符串。

设置时,必须与部署规范中的属性 mem_limit一致。limits.memory

内存保留

mem_reservation配置容器可以分配的内存量的保留,设置为表示 字节值的字符串。

设置时,必须与部署规范中的属性 mem_reservation一致。reservations.memory

内存交换性

mem_swappiness定义为百分比(0 到 100 之间的值),供主机内核交换容器使用的匿名内存页。

  • 0:关闭匿名页面交换。
  • 100:将所有匿名页面设置为可交换。

默认值是特定于平台的。

内存交换限制

memswap_limit定义允许容器交换到磁盘的内存量。这是一个修饰符属性,仅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,则允许容器使用无限制的交换,最多可达主机系统上的可用数量。

网络模式

network_mode设置服务容器的网络模式。

  • none:关闭所有容器网络。
  • host:为容器提供对主机网络接口的原始访问权限。
  • service:{name}:仅允许容器访问指定的服务。有关更多信息,请参阅 容器网络
    network_mode: "host"
    network_mode: "none"
    network_mode: "service:[service name]"

设置后, networks不允许使用该属性,并且 Compose 会拒绝任何包含这两个属性的 Compose 文件。

网络

networks定义服务容器附加到的网络,引用 顶级networkskey下的条目。

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

别名

aliases声明网络上服务的替代主机名。同一网络上的其他容器可以使用服务名称或别名来连接到服务的容器之一。

由于aliases是网络范围的,因此相同的服务在不同的网络上可以有不同的别名。

注意 网络范围的别名可以由多个容器甚至多个服务共享。如果是,则无法保证该名称到底解析为哪个容器。

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

在以下示例中,服务frontend能够访问backend主机名backend或网络database上的服务back-tier。该服务monitoring 能够在网络上获得相同的backend服务。backendmysqladmin

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:

ipv4_地址、ipv6_地址

加入网络时为服务容器指定静态IP地址。

顶级网络部分中的相应网络配置 必须具有 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地址

Docker Compose 版本 2.23.2中引入

mac_address设置服务容器连接到该特定网络时使用的 MAC 地址。

优先事项

priority指示 Compose 将服务的容器连接到其网络的顺序。如果未指定,则默认值为 0。

在以下示例中,应用服务首先连接,app_net_1因为它具有最高优先级。然后它连接到app_net_3, then app_net_2,它使用默认优先级值 0。

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:

oom_kill_disable

如果oom_kill_disable设置了,Compose 会配置平台,以便在内存不足时不会终止容器。

oom_score_adj

oom_score_adj调整容器在内存不足时被平台杀死的偏好。值必须在-1000,1000范围内。

PID

pid设置 Compose 创建的容器的 PID 模式。支持的值是特定于平台的。

pids_限制

pids_limit调整容器的 PID 限制。设置为 -1 以获取无限 PID。

pids_limit: 10

设置时,必须与部署规范中的属性 pids_limit一致。pids

平台

platform定义服务容器运行的目标平台。它使用os[/arch[/variant]]语法。

osarch和的值variant必须符合 OCI 图像规范使用的约定。

Compose 使用此属性来确定提取哪个版本的映像和/或在哪个平台上执行服务的构建。

platform: darwin
platform: windows/amd64
platform: linux/arm64/v8

港口

暴露集装箱港口。

笔记

不得使用端口映射,network_mode: host否则会发生运行时错误。

简短语法

简短语法是一个以冒号分隔的字符串,用于设置主机 IP、主机端口和容器端口,格式如下:

[HOST:]CONTAINER[/PROTOCOL]在哪里:

  • HOST[IP:](port | range)
  • CONTAINERport | range
  • PROTOCOL将端口限制为指定协议。tcpudp值由规范定义,Compose 提供对特定于平台的协议名称的支持。

如果未设置主机 IP,它将绑定到所有网络接口。端口可以​​是单个值或范围。主机和容器必须使用相同的范围。

指定两个端口 ( HOST:CONTAINER),或仅指定容器端口。在后一种情况下,容器运行时会自动分配主机的任何未分配端口。

HOST:CONTAINER应始终指定为(带引号的)字符串,以避免与 yaml base-60 float发生冲突。

例子:

ports:
  - "3000"
  - "3000-3005"
  - "8000:8000"
  - "9090-9091:8080-8081"
  - "49100:22"
  - "8000-9000:80"
  - "127.0.0.1:8001:8001"
  - "127.0.0.1:5000-5010:5000-5010"
  - "6060:6060/udp"

笔记

如果容器引擎不支持主机 IP 映射,Compose 会拒绝 Compose 文件并忽略指定的主机 IP。

长语法

长格式语法允许配置无法以短格式表达的附加字段。

  • target: 集装箱港口
  • published:公开暴露的端口。它被定义为字符串,并且可以使用语法设置为范围start-end。这意味着实际端口被分配了设定范围内剩余的可用端口。
  • host_ip:主机IP映射,未指定表示所有网络接口(0.0.0.0)。
  • protocol:端口协议(tcpudp)。默认为tcp.
  • app_protocol:该端口所使用的应用协议(TCP/IP level 4 / OSI level 7)。这是可选的,可以用作 Compose 的提示,为它理解的协议提供更丰富的行为。在 Docker Compose 版本 2.26.0中引入。
  • mode: host: 用于在每个节点上发布主机端口,或者ingress用于对端口进行负载均衡。默认为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

特权

privileged将服务容器配置为以提升的权限运行。支持和实际影响因平台而异。

简介

profiles定义要在其下启用的服务的命名配置文件列表。如果未分配,则该服务始终启动,但如果已分配,则仅在激活配置文件时才启动。

如果存在,profiles请遵循 的正则表达式格式[a-zA-Z0-9][a-zA-Z0-9_.-]+

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

  phpmyadmin:
    image: phpmyadmin
    depends_on:
      - db
    profiles:
      - debug

拉动政策

pull_policy定义 Compose 在开始拉取图像时做出的决定。可能的值为:

  • always:Compose 始终从注册表中提取映像。
  • never:Compose 不会从注册表中提取映像,而是依赖于平台缓存的映像。如果没有缓存图像,则报告失败。
  • missing:仅当平台缓存中不可用时,Compose 才会提取该图像。如果您没有同时使用 Compose 构建规范,则这是默认选项。 if_not_present为了向后兼容,被视为该值的别名。
  • build:Compose 构建图像。如果镜像已经存在,Compose 会重建该镜像。

只读

read_only配置要使用只读文件系统创建的服务容器。

重新开始

restart定义平台在容器终止时应用的策略。

  • no:默认重启策略。在任何情况下它都不会重新启动容器。
  • always:该策略始终重新启动容器,直到将其删除。
  • on-failure[:max-retries]:如果退出代码指示错误,策略将重新启动容器。 (可选)限制 Docker 守护进程尝试重新启动的次数。
  • unless-stopped:无论退出代码如何,策略都会重新启动容器,但在服务停止或删除时停止重新启动。
    restart: "no"
    restart: always
    restart: on-failure
    restart: on-failure:3
    restart: unless-stopped

您可以在Docker 运行参考页面的重新启动策略 (--restart)部分找到有关重新启动策略的更多详细信息 。

运行

runtime指定服务容器使用哪个运行时。

例如,可以是OCI Runtime Spec 的实现runtime的名称 ,例如“runc”。

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

默认为runc.要使用不同的运行时,请参阅 替代运行时

规模

scale指定为此服务部署的默认容器数量。两者设置时,必须与部署规范中的属性 scale一致。replicas

秘密

secrets授予对每个服务的秘密定义的敏感数据的访问权限 。支持两种不同的语法变体;短语法和长语法。

如果平台上不存在该密钥或未在 secretsCompose 文件的部分中定义该密钥,Compose 会报告错误。

可以授予服务访问多个秘密的权限。秘密的长语法和短语法可以在同一个 Compose 文件中使用。在顶层定义秘密secrets并不意味着授予任何服务访问它的权限。此类授权必须在服务规范中明确作为 秘密服务元素。

简短语法

短语法变体仅指定秘密名称。这将授予容器对机密的访问权限,并将其以只读方式安装到/run/secrets/<secret_name> 容器内。源名称和目标安装点均设置为秘密名称。

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

services:
  frontend:
    image: example/webapp
    secrets:
      - server-certificate
secrets:
  server-certificate:
    file: ./server.cert

长语法

长语法提供了如何在服务容器内创建机密的更细粒度。

  • source:平台上存在的机密名称。
  • target/run/secrets/:要安装到服务任务容器中的文件的名称,或者文件的绝对路径(如果需要备用位置)。source如果未指定则默认为。
  • uid和:拥有服务任务容器中gid的文件的数字 UID 或 GID 。/run/secrets/默认值是运行容器的用户。
  • mode: 要 在服务的任务容器中安装的文件的权限/run/secrets/,以八进制表示法。默认值是世界可读的权限(mode 0444)。如果设置了可写位,则必须忽略该位。可以设置可执行位。

以下示例将机密文件的名称设置server-certificateserver.cert 在容器内,将模式设置为0440(组可读),并将用户和组设置为103。的值server-certificate设置为文件的内容./server.cert

services:
  frontend:
    image: example/webapp
    secrets:
      - source: server-certificate
        target: server.cert
        uid: "103"
        gid: "103"
        mode: 0440
secrets:
  server-certificate:
    file: ./server.cert

安全选项

security_opt覆盖每个容器的默认标签方案。

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

有关您可以覆盖的更多默认标签方案,请参阅 安全配置

shm_大小

shm_size/dev/shm配置服务容器允许的共享内存(Linux 上的分区)的大小。它被指定为 字节值

标准输入打开

stdin_open配置服务容器以使用分配的标准输入运行。

停止宽限期

stop_grace_periodstop_signal指定在发送 SIGKILL 之前,如果容器不处理 SIGTERM(或使用 指定的任何停止信号),则在尝试停止容器时,Compose 必须等待多长时间。 它被指定为 持续时间

    stop_grace_period: 1s
    stop_grace_period: 1m30s

默认值是容器在发送 SIGKILL 之前退出 10 秒。

停止信号

stop_signal定义 Compose 用于停止服务容器的信号。如果 Compose 通过发送SIGTERM.

stop_signal: SIGUSR1

存储选项

storage_opt定义服务的存储驱动程序选项。

storage_opt:
  size: '1G'

系统命令

sysctls定义要在容器中设置的内核参数。sysctls可以使用数组或映射。

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

您只能使用内核中命名空间的 sysctls。 Docker 不支持在容器内更改 sysctls 并同时修改主机系统。有关支持的 sysctls 的概述,请参阅 运行时配置命名空间内核参数 (sysctls)

临时文件系统

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

tmpfs: /run
tmpfs:
  - /run
  - /tmp

终端

tty将服务容器配置为使用 TTY 运行。

极限值

ulimits覆盖容器的默认 ulimit。它被指定为单个限制的整数或软/硬限制的映射。

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

用户

user覆盖用于运行容器进程的用户。默认值由镜像(即 Dockerfile USER)设置。如果没有设置,那么root.

用户模式

userns_mode设置服务的用户命名空间。支持的值是特定于平台的,并且可能取决于平台配置。

userns_mode: "host"

UTS

Docker Compose 2.15.1版本中引入

uts配置服务容器的 UTS 命名空间模式集。如果未指定,则由运行时决定分配 UTS 命名空间(如果支持)。可用值为:

  • 'host':导致容器使用与主机相同的 UTS 命名空间。
    uts: "host"

volumes定义服务容器可访问的挂载主机路径或命名卷。您可以用来volumes定义多种类型的安装;volumebindtmpfs, 或者npipe

如果挂载是主机路径并且仅由单个服务使用,则可以将其声明为服务定义的一部分。要跨多个服务重用卷,必须在 顶级volumeskey中声明命名卷。

以下示例显示了服务db-data正在使用的命名卷 ( )backend以及为单个服务定义的绑定安装。

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 文件并出现错误。为了避免命名卷出现歧义,相对路径应始终以.或开头..

长语法

长格式语法允许配置无法以短格式表达的附加字段。

  • type:安装类型。两者volumebindtmpfsnpipecluster
  • source:挂载的源、主机上用于绑定挂载的路径或 顶级volumes中定义的卷的名称。不适用于 tmpfs 安装。
  • target:卷挂载的容器中的路径。
  • read_only:将卷设置为只读的标志。
  • bind:用于配置附加绑定选项:
    • propagation:用于绑定的传播模式。
    • create_host_path:如果主机上不存在任何内容,则在源路径处创建一个目录。如果路径上有东西,Compose 不会执行任何操作。为了向后兼容旧版本,短语法自动暗示了这一点docker-compose
    • selinux:SELinux 重新标记选项z(共享)或Z(私有)
  • volume:配置附加音量选项:
    • nocopy:创建卷时禁止从容器复制数据的标志。
    • subpath:要安装的卷内的路径,而不是卷根目录。
  • tmpfs:配置额外的 tmpfs 选项:
    • size:tmpfs 安装的大小(以字节为单位)(数字或字节单位)。
    • mode:tmpfs 挂载为 Unix 权限位的文件模式(八进制数)。在 Docker Compose 版本 2.14.0中引入。
  • consistency:贴装的一致性要求。可用值是特定于平台的。

提示

使用大型存储库或单一存储库,或者使用不再随代码库扩展的虚拟文件系统? Compose 现在利用 同步文件共享并自动为绑定安装创建文件共享。确保您已通过付费订阅登录 Docker,并在 Docker Desktop 的设置中启用了Access 实验性功能使用 Compose 管理同步文件共享。

卷_来自

volumes_from从另一个服务或容器安装所有卷。您可以选择指定只读访问权限ro或读写权限rw。如果未指定访问级别,则使用读写访问权限。

您还可以使用前缀从不受 Compose 管理的容器装载卷container:

volumes_from:
  - service_name
  - service_name:ro
  - container:container_name
  - container:container_name:rw

工作目录

working_dir覆盖镜像指定的容器工作目录,例如 Dockerfile 的WORKDIR.