服务顶级元素
服务是应用程序中计算资源的抽象定义,可以独立于其他组件进行扩展或替换。服务由一组容器支持,由平台根据复制要求和放置约束运行。由于服务由容器支持,因此它们由 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
附
当attach
定义并设置为false
Compose 时,不会收集服务日志,除非您明确请求。
默认服务配置是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
组组
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_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
:要在服务的任务容器中安装的文件的路径和名称。/<source>
如果未指定则默认为。uid
和gid
:拥有服务任务容器内已安装配置文件的数字 UID 或 GID。未指定时的默认值为 USER 运行容器。mode
: 在服务的任务容器中安装的文件的权限(以八进制表示法)。默认值是世界可读的 (0444
)。可写位必须被忽略。可以设置可执行位。
以下示例将容器内的名称设置为my_config
to 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 按依赖顺序创建服务。在以下示例中,
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 时,会在更新依赖项服务后重新启动该服务。这适用于由 Compose 操作控制的显式重新启动,并且不包括在容器终止后由容器运行时自动重新启动。在 Docker Compose 版本 2.17.0中引入。condition
:设置认为满足依赖关系的条件service_started
:与上述短语法等效service_healthy
:指定在启动依赖服务之前,依赖项预计“健康”(如 healthcheck所示)。service_completed_successfully
:指定依赖项预计在启动依赖服务之前成功完成。
required
:设置为false
Compose 时,仅在依赖项服务未启动或不可用时向您发出警告。如果未定义,则默认required
值为true
。在 Docker Compose 版本 2.20.0中引入。
服务依赖性会导致以下行为:
Compose 按依赖顺序创建服务。在以下示例中,
db
和redis
是在 之前创建的web
。Compose 等待运行状况检查传递标有 的依赖项
service_healthy
。在下面的示例中,预计在创建db
之前是“健康”的。web
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 确保依赖服务在启动依赖服务之前启动。service_healthy
在启动依赖服务之前,Compose 保证标记为“健康”的依赖服务
。
部署
deploy
指定服务的部署和生命周期的配置,如
Compose 部署规范 中所定义。
发展
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.conf
Linux 上的文件)。
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
和时,设置的值优先。environment
environment
暴露
expose
定义 Compose 从容器公开的(传入)端口或端口范围。这些端口必须可供链接服务访问,并且不应发布到主机。只能指定内部容器端口。
语法为<portnum>/[<proto>]
or<startport-endport>/[<proto>]
表示端口范围。如果未明确设置,则tcp
使用协议。
expose:
- "3000"
- "8000"
- "8080-8085/tcp"
笔记
expose
如果映像的 Dockerfile 已公开端口,则即使未在 Compose 文件中设置,网络上的其他容器也可以看到该端口。
延伸
extends
允许您在不同文件甚至完全不同的项目之间共享通用配置。您extends
可以在一个地方定义一组通用的服务选项,并从任何地方引用它。您可以参考另一个 Compose 文件并选择您想要在自己的应用程序中使用的服务,并且能够根据自己的需要覆盖某些属性。
您可以extends
与其他配置密钥一起在任何服务上使用。该值必须是使用必需键和可选键extends
定义的映射。service
file
extends:
file: common.yml
service: webapp
service
:定义被引用为基础的服务的名称,例如web
或database
。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: true
disable: 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_bps
、blkio_config.device_read_iops
、
blkio_config.device_write_bps
、blkio_config.device_write_iops
和下的项目也被视为映射devices
,
volumes
其中 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
, 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
。与上面提到的序列字段不同,合并产生的重复项不会被删除。
标量
服务定义中任何其他允许的键都应被视为标量。
外部链接
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
interval
、timeout
、start_period
和start_interval
被
指定为持续时间。 Docker Compose
2.20.2版本中引入
test
定义 Compose 运行以检查容器运行状况的命令。它可以是字符串或列表。如果它是一个列表,第一项必须是NONE
,CMD
或CMD-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 构建规范,则image
Compose 文件中缺少 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
定义服务容器附加到的网络,引用
顶级networks
key下的条目。
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
服务。backend
mysql
admin
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"
链接本地ip
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地址
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]]
语法。
os
、arch
和的值variant
必须符合
OCI 图像规范使用的约定。
Compose 使用此属性来确定提取哪个版本的映像和/或在哪个平台上执行服务的构建。
platform: darwin
platform: windows/amd64
platform: linux/arm64/v8
港口
暴露集装箱港口。
笔记
不得使用端口映射,
network_mode: host
否则会发生运行时错误。
简短语法
简短语法是一个以冒号分隔的字符串,用于设置主机 IP、主机端口和容器端口,格式如下:
[HOST:]CONTAINER[/PROTOCOL]
在哪里:
HOST
是[IP:](port | range)
CONTAINER
是port | range
PROTOCOL
将端口限制为指定协议。tcp
和udp
值由规范定义,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
:端口协议(tcp
或udp
)。默认为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
授予对每个服务的秘密定义的敏感数据的访问权限
。支持两种不同的语法变体;短语法和长语法。
如果平台上不存在该密钥或未在
secrets
Compose 文件的部分中定义该密钥,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/
,以八进制表示法。默认值是世界可读的权限(mode0444
)。如果设置了可写位,则必须忽略该位。可以设置可执行位。
以下示例将机密文件的名称设置server-certificate
为server.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_period
stop_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
uts
配置服务容器的 UTS 命名空间模式集。如果未指定,则由运行时决定分配 UTS 命名空间(如果支持)。可用值为:
'host'
:导致容器使用与主机相同的 UTS 命名空间。
uts: "host"
卷
volumes
定义服务容器可访问的挂载主机路径或命名卷。您可以用来volumes
定义多种类型的安装;volume
,bind
,tmpfs
, 或者npipe
。
如果挂载是主机路径并且仅由单个服务使用,则可以将其声明为服务定义的一部分。要跨多个服务重用卷,必须在
顶级volumes
key中声明命名卷。
以下示例显示了服务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
:安装类型。两者volume
任bind
一tmpfs
npipe
cluster
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
.