服务顶级元素
服务是应用程序中计算资源的抽象定义,可以扩展或替换 独立于其他组件。服务由一组容器提供支持,这些容器由平台运行 根据复制要求和放置约束。由于服务由容器提供支持,因此它们被定义 通过 Docker 镜像和一组运行时参数。服务中的所有容器都是使用这些容器创建的 参数。
Compose 文件必须声明servicestop-level 元素作为 Map,其键是服务名称的字符串表示形式,
其值为 Service Definitions。服务定义包含应用于每个
服务容器。
每项服务还可能包括build部分,该部分定义如何为服务创建 Docker 镜像。
Compose 支持使用此服务定义构建 Docker 镜像。如果未使用,则build部分将被忽略,并且 Compose 文件仍被视为有效。构建支持是 Compose 规范的一个可选方面,并且是
Compose Build 规范文档中详细介绍了。
每个服务都定义了运行其容器的运行时约束和要求。这deploy分区组
这些约束,并允许平台调整部署策略,以最好地满足容器的需求
可用资源。部署支持是 Compose 规范的一个可选方面,并且是
在 Compose Deploy 规范文档中进行了详细介绍。
如果未实现deploy部分将被忽略,并且 Compose 文件仍被视为有效。
例子
简单示例
以下示例演示了如何使用 Docker Compose 定义两个简单服务、设置其镜像、映射端口和配置基本环境变量。
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: postgres:13
environment:
POSTGRES_USER: example
POSTGRES_DB: exampledb高级示例
在以下示例中,proxyservice 使用 Nginx 镜像,将本地 Nginx 配置文件挂载到容器中,暴露 port80并依赖于backend服务。
这backendservice 从位于backend设置为在阶段生成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如需更多示例 Compose 文件,请浏览 Awesome Compose 示例。
属性
附注
annotations定义容器的注释。annotations可以使用 array 或 map。
annotations:
com.example.foo: barannotations:
- com.example.foo=bar附加
什么时候attach定义并设置为falseCompose 不收集服务日志,
,直到您明确请求它。
默认服务配置为attach: true.
建
build指定用于从源创建容器镜像的构建配置,如 Compose 构建规范中所定义。
blkio_config
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: 30device_read_bps、device_write_bps
为给定设备上的读/写作设置每秒字节数限制。 列表中的每个项目都必须有两个键:
path:定义受影响设备的符号路径。rate:作为表示字节数的整数值或表示字节值的字符串。
device_read_iops、device_write_iops
为给定设备上的读/写作设置每秒作数限制。 列表中的每个项目都必须有两个键:
path:定义受影响设备的符号路径。rate:作为整数值,表示每秒允许的作数。
重量
修改分配给服务的带宽相对于其他服务的比例。 采用 10 到 1000 之间的整数值,其中 500 是默认值。
weight_device
按设备微调带宽分配。列表中的每个项目都必须有两个键:
path:定义受影响设备的符号路径。weight:介于 10 和 1000 之间的整数值。
cpu_count
cpu_count定义服务容器的可用 CPU 数量。
cpu_percent
cpu_percent定义可用 CPU 的可用百分比。
cpu_shares
cpu_shares以整数值定义服务容器相对于其他容器的相对 CPU 权重。
cpu_period
cpu_period配置平台所基于的 CPU CFS(完全公平调度程序)周期
在 Linux 内核上。
cpu_quota
cpu_quota在平台基于时配置 CPU CFS (Completely Fair Scheduler) 配额
在 Linux 内核上。
cpu_rt_runtime
cpu_rt_runtime为支持 Realtime Scheduler 的平台配置 CPU 分配参数。它可以是
使用微秒作为单位或持续时间的整数值。
cpu_rt_runtime: '400ms'
cpu_rt_runtime: 95000`cpu_rt_period
cpu_rt_period为支持 Realtime Scheduler 的平台配置 CPU 分配参数。它可以是
使用微秒作为单位或持续时间的整数值。
cpu_rt_period: '1400us'
cpu_rt_period: 11000`CPU
cpus定义要分配给服务容器的 (可能是虚拟的) CPU 的数量。这是一个小数。0.000表示无限制。
设置后,cpus必须与cpus属性。
cpuset
cpuset定义允许在其中执行的显式 CPU。可以是范围0-3或列表0,1
cap_add
cap_add将其他容器功能指定为字符串。
cap_add:
- ALLcap_drop
cap_drop指定要删除的容器功能
作为字符串。
cap_drop:
- NET_ADMIN
- SYS_ADMINcgroup
cgroup指定要加入的 cgroup 命名空间。如果未设置,则由容器运行时决定
选择要使用的 cgroup 命名空间(如果支持)。
host:在容器运行时 cgroup 命名空间中运行容器。private:在容器自己的私有 cgroup 命名空间中运行容器。
cgroup_parent
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时,将使用镜像中的默认命令。
如果值为 (empty list) 或 (empty string),则忽略镜像声明的默认命令,
即 overridden 为空。[]''
配置
配置允许服务调整其行为,而无需重新构建 Docker 镜像。
服务只有在configs属性。支持两种不同的语法变体。
如果出现config在平台上不存在,或者未在configs顶级元素在 Compose 文件中。
为 config 定义了两种语法:short 语法和 long 语法。
您可以向服务授予对多个配置的访问权限,并且可以混合使用长语法和短语法。
短语法
短语法变体仅指定配置名称。这将授予
容器访问配置,并将其作为文件挂载到服务的容器的文件系统中。容器中挂载点的位置默认为/<config_name>在 Linux 容器中,以及C:\<config-name>在 Windows 容器中。
以下示例使用 short 语法向redis服务
访问my_config和my_other_configconfigs 的 Configs。的值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长语法
long 语法为如何在服务的任务容器中创建配置提供了更精细的粒度。
source:平台中存在的配置名称。target:要挂载到服务的 任务容器。默认为/<source>如果未指定。uid和gid:拥有挂载的配置文件的数字 UID 或 GID 在服务的任务容器中。未指定时的默认值为 USER running container。mode:挂载在服务的 任务容器,采用八进制表示法。默认值为世界可读 (0444). 必须忽略可写位。可执行位可以设置。
以下示例将my_config自redis_config在
container,将 mode 设置为0440(组可读)并设置用户和组
自103.这redis服务无权访问my_other_configconfig。
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: truecontainer_name
container_name是一个字符串,用于指定自定义容器名称,而不是默认生成的名称。
container_name: my-web-container如果 Compose 文件指定了container_name.尝试这样做会导致错误。
container_name遵循[a-zA-Z0-9][a-zA-Z0-9_.-]+
credential_spec
credential_spec配置 Managed Service 账户的凭证规范。
如果您有使用 Windows 容器的服务,则可以使用file:和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-specgMSA 配置示例
为服务配置 gMSA 凭证规范时,您只需要
要使用config,如以下示例所示:
services:
myservice:
image: myimage:latest
credential_spec:
config: my_credential_spec
configs:
my_credentials_spec:
file: ./my-credential-spec.json|depends_on
使用depends_on属性,您可以控制服务启动和关闭的顺序。如果服务紧密耦合,并且启动顺序会影响应用程序的功能,则此功能非常有用。
短语法
短语法变体仅指定依赖项的服务名称。 服务依赖关系会导致以下行为:
Compose 按依赖项顺序创建服务。在以下 例
db和redis创建时间web.Compose 会按依赖关系顺序删除服务。在以下 例
web之前已删除db和redis.
简单示例:
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgresCompose 保证依赖项服务之前已启动 启动依赖服务。 Compose 会等待依赖项服务“准备就绪”,然后再 启动依赖服务。
长语法
长格式语法支持配置不能 以简短的形式表示。
restart:设置为trueCompose 会在更新依赖项服务后重新启动此服务。 这适用于由 Compose作控制的显式重启,但不包括容器运行时的自动重启 容器死机后。在 Docker Compose 版本 2.17.0 中引入。condition:设置被视为满足依赖项的条件service_started:相当于上述短语法service_healthy:指定依赖项应为“正常” (如 healthcheck 所示)在启动依赖项之前 服务。service_completed_successfully:指定依赖项应运行 成功完成,然后再启动依赖服务。
required:设置为falseCompose 仅在 Dependency Service 未启动或不可用时发出警告。如果未定义 默认值required是true.在 Docker Compose 版本 2.20.0 中引入。
服务依赖关系会导致以下行为:
Compose 按依赖项顺序创建服务。在以下 例
db和redis创建时间web.Compose 等待 healthchecks 传递依赖项 标有
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: postgresCompose 保证依赖项服务在
启动依赖服务。
Compose 保证标有service_healthy在 “healthy” 之前。
部署
deploy指定服务的部署和生命周期的配置,如 Compose Deploy 规范中所定义。
发展
develop指定用于保持容器与 source 同步的开发配置,如 Development 部分所定义。
device_cgroup_rules
device_cgroup_rules定义此容器的设备 cgroup 规则列表。
该格式与 Linux 内核在 Control Groups 中指定的格式相同
设备白名单控制器。
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定义要在容器网络接口配置上设置的自定义 DNS 服务器。它可以是单个值或列表。
dns: 8.8.8.8dns:
- 8.8.8.8
- 9.9.9.9dns_opt
dns_opt列出要传递给容器的 DNS 解析器的自定义 DNS 选项(/etc/resolv.conf文件)。
dns_opt:
- use-vc
- no-tld-querydns_search
dns_search定义要在容器网络接口配置上设置的自定义 DNS 搜索域。它可以是单个值或列表。
dns_search: example.comdns_search:
- dc1.example.com
- dc2.example.com域名
domainname声明要用于服务容器的自定义域名。它必须是有效的 RFC 1123 主机名。
driver_opts
driver_opts将选项列表指定为要传递给驱动程序的键值对。这些选项包括
取决于驱动程序。
services:
app:
networks:
app_net:
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"有关更多信息,请参阅网络驱动程序文档。
入口点
entrypoint声明服务容器的默认入口点。
这会覆盖ENTRYPOINT指令。
如果entrypoint为非 null,则 Compose 会忽略镜像中的任何默认命令,例如CMD指令。
另请参阅command设置或覆盖 EntryPoint 进程要执行的默认命令。
在其简短形式中,该值可以定义为字符串:
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,则使用镜像中的默认入口点。
如果值为 (empty list) 或 (empty string),则忽略镜像声明的默认入口点,
即 overridden 为空。[]''
env_file
这env_file属性用于指定一个或多个文件,这些文件包含要传递给容器的环境变量。
env_file: .env相对路径是从 Compose 文件的父文件夹解析的。由于绝对路径会阻止 Compose
文件,则 Compose 会在使用此类路径设置env_file.
在 environment 部分中声明的环境变量将覆盖这些值。即使这些值为 空或未定义。
env_file也可以是列表。列表中的文件是自上而下处理的。对于同一变量
在两个 env 文件中指定,则列表中最后一个文件的值保持不变。
env_file:
- ./a.env
- ./b.envList 元素也可以声明为 Map,然后允许您设置额外的 属性。
必填
这required属性默认为true.什么时候required设置为false和.env文件缺失,则 Compose 会静默忽略该条目。
env_file:
- path: ./default.env
required: true # default
- path: ./override.env
required: false格式
这format属性允许您使用env_file.未设置时,env_file根据 Env_file 格式概述的 Compose 规则进行解析。
rawformat 允许您使用env_file替换为 key=value 项,但 Compose 不会尝试解析值以进行插值。
这样,您就可以按原样传递值,包括引号和符号。$
env_file:
- path: ./default.env
format: rawEnv_file 格式
每 个.env文件必须位于VAR[=[VAL]]格式。以下语法规则适用:
- 以 开头的行将作为注释处理并忽略。
# - 空行将被忽略。
- 未加引号和双引号的 () 值应用了 Interpolation。
" - 每行表示一个键值对。值可以选择引用。
VAR=VAL->VALVAR="VAL"->VALVAR='VAL'->VAL
- 未加引号的值的内联注释前面必须有空格。
VAR=VAL # comment->VALVAR=VAL# not a comment->VAL# not a comment
- 带引号的值的内联注释必须跟在结束引号后面。
VAR="VAL # not a comment"->VAL # not a commentVAR="VAL" # comment->VAL
- 单引号 () 值按字面意思使用。
'VAR='$OTHER'->$OTHERVAR='${OTHER}'->${OTHER}
- 引号可以用 .
\VAR='Let\'s go!'->Let's go!VAR="{\"hello\": \"json\"}"->{"hello": "json"}
- 常见的 shell 转义序列包括
\n,\r,\t,并且支持双引号值。\\VAR="some\tvalue"->some valueVAR='some\tvalue'->some\tvalueVAR=some\tvalue->some\tvalue
VAL可以省略,在这种情况下,变量 value 为空字符串。=VAL可以省略,在这种情况下,变量为 unset。
# Set Rails/Rack environment
RACK_ENV=development
VAR="quoted"环境
这environmentattribute 定义容器中设置的环境变量。environment可以使用数组或
地图。任何布尔值;true、false、yes、no 应括在引号中以确保
YAML 解析器不会将它们转换为 True 或 False。
环境变量可以由单个键声明(没有值到等号)。在本例中,使用 Compose 依赖于您解析该值。如果该值未解析,则变量 未设置,并从 Service Container 环境中删除。
Map 语法:
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:数组语法:
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT当两者env_file和environment为服务设置,值由environment具有优先权。
暴露
expose定义 Compose 从容器公开的(传入)端口或端口范围。这些端口必须是
可供链接服务访问,并且不应将其发布到主机。仅内部容器
可以指定端口。
语法为<portnum>/[<proto>]或<startport-endport>/[<proto>]对于端口范围。
如果未显式设置,则tcpprotocol 的
expose:
- "3000"
- "8000"
- "8080-8085/tcp"注意
如果镜像的 Dockerfile 已经公开了端口,则即使
expose未在 Compose 文件中设置。
延伸
extends允许您在不同的文件之间共享通用配置,甚至完全共享不同的项目。跟extends您可以在一个位置定义一组通用的服务选项,并从任何位置引用它。您可以引用另一个 Compose 文件,并选择您也想在自己的应用程序中使用的服务,并能够根据自己的需要覆盖某些属性。
您可以使用extends与其他 Configuration Key 一起在任何服务上。这extendsvalue 必须是 Map
使用必需的service和可选的file钥匙。
extends:
file: common.yml
service: webappservice:定义作为基础引用的服务的名称,例如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 文件中的主定义和引用的服务定义
指定者extends的 ID 将按以下方式合并:
- Mappings:主服务定义的 mapping 中的键覆盖 mapping 中的键 引用的服务定义。未覆盖的键将按原样包含。
- 序列:项目组合成一个新序列。元素的顺序是 保留,引用的项目在前,主项目在后。
- 标量:主服务定义中的键优先于 引用了一个。
映射
以下键应被视为映射: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也被视为映射,其中 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如果引用的服务定义包含extendsmapping 的
只需复制到新的合并定义中。然后启动合并过程
再次关闭直到没有extends键剩余。
例如,下面的输入:
services:
base:
image: busybox
user: root
common:
image: busybox
extends:
service: base
cli:
extends:
service: common为cli服务。这里cli服务业
得到user密钥来自commonservice,而 service 又从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如果使用 case list 语法,则以下键也应被视为序列:dns,dns_search,env_file,tmpfs.与上面提到的序列字段不同,
不会删除合并产生的重复项。
标量
服务定义中允许的任何其他键都应被视为标量。
external_links
external_links将服务容器链接到在 Compose 应用程序外部托管的服务。external_links定义要使用 Platform Lookup 机制检索的现有服务的名称。
形式的别名SERVICE:ALIAS可以指定。
external_links:
- redis
- database:mysql
- database:postgresqlextra_hosts
extra_hosts将主机名映射添加到容器网络接口配置 (/etc/hosts适用于 Linux)。
短语法
短语法在列表中使用纯字符串。值必须以HOSTNAME=IP.
extra_hosts:
- "somehost=162.242.195.82"
- "otherhost=50.31.209.229"
- "myhostv6=::1"IPv6 地址可以括在方括号中,例如:
extra_hosts:
- "myhostv6=[::1]"separator 是首选,但=:也可以使用。在 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 地址和主机名的匹配条目
configuration,这意味着对于 Linux/etc/hosts获取额外行:
162.242.195.82 somehost
50.31.209.229 otherhost
::1 myhostv6
group_add
group_add按名称或编号指定其他组,容器内的用户必须是该组的成员。
例如,当多个容器(以不同用户身份运行)需要全部读取或写入时,这非常有用
共享卷上的同一文件。该文件可以由所有容器共享的组拥有,并在group_add.
services:
myservice:
image: alpine
group_add:
- mail运行id在创建的容器内必须显示用户属于mailgroup 中,则不会有
如果group_add没有宣布。
健康检查
这healthcheck属性声明一项检查,该检查用于确定服务容器是否“运行状况良好”。它的工作方式与 HEALTHCHECK Dockerfile 指令相同,并且具有相同的默认值
由服务的 Docker 镜像设置。您的 Compose 文件可以覆盖 Dockerfile 中设置的值。
有关更多信息HEALTHCHECK,请参阅 Dockerfile 参考。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
start_interval: 5sinterval,timeout,start_period和start_interval指定为 durations。在 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 运行配置为字符串的命令
(/bin/sh适用于 Linux)。以下两种形式是等效的:
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]test: curl -f https://localhost || exit 1NONE禁用 healthcheck,主要用于禁用服务的 Docker 镜像设置的 Healthcheck Dockerfile 指令。或者
镜像设置的 HealthCheck 可以通过设置disable: true:
healthcheck:
disable: true主机名
hostname声明用于服务容器的自定义主机名。它必须是有效的 RFC 1123 主机名。
镜像
image指定要从中启动容器的镜像。image必须遵循 Open Container Specification 可寻址镜像格式,
如[<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 Build Specification,则还有其他选项可用于控制
pull over 从 source 构建镜像,但 pull the image 是默认行为。
image可以从 Compose 文件中省略,只要build部分。如果您未使用 Compose 构建规范,则 Compose 在以下情况下将无法正常工作imageCompose 文件中缺少。
初始化
init在容器内运行一个 init 进程 (PID 1),该进程转发 signals 并 reaps 进程。
将此选项设置为true为服务启用此功能。
services:
web:
image: alpine:latest
init: true使用的 init Binaries是特定于平台的。
工控机
ipc配置 Service Container 设置的 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.projectset 设置为 Compose 创建的所有资源的用户项目名称com.docker.compose.service在 Compose 文件中定义的服务名称的服务容器上设置
这com.docker.composelabel prefix 被保留。在 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"这drivername 指定服务容器的日志记录驱动程序。默认值和可用值
特定于平台。驱动程序特定的选项可以使用options作为键值对。
mac_address
适用于 Docker Compose 版本 2.24.0 及更高版本。
mac_address设置服务容器的 MAC 地址。
注意
容器运行时可能会拒绝此值(即。Docker 引擎 >= v25.0)。在这种情况下,您应该改用 networks.mac_address。
mem_limit
mem_limit配置容器可以分配的内存量的限制,设置为表示字节值的字符串。
设置后,mem_limit必须与limits.memory属性。
mem_reservation
mem_reservation配置容器可以分配的内存量的预留,设置为表示字节值的字符串。
设置后,mem_reservation必须与reservations.memory属性。
mem_swappiness
mem_swappiness定义为一个百分比,一个介于 0 和 100 之间的值,供主机内核换出
容器使用的匿名内存页。
0:关闭匿名页面交换。100:将所有匿名页面设置为可交换页面。
默认值是特定于平台的。
memswap_limit
memswap_limit定义允许容器交换到磁盘的内存量。这是一个修饰符
属性,该属性仅在memory。使用 swap 可以让容器写入多余的
内存要求。
经常将内存交换到磁盘的应用程序会降低性能。
- 如果
memswap_limit设置为正整数,则memory和memswap_limit必须设置。memswap_limit表示可以使用的内存和 swap 的总量,并且memory控制非交换内存使用的数量。因此,如果memory=“300m” 和memswap_limit=“1g”,容器可以使用 300m 的内存和 700m (1g - 300m) 的交换空间。 - 如果
memswap_limit设置为 0,则忽略该设置,并将该值视为未设置。 - 如果
memswap_limit设置为与memory和memory设置为正整数,则容器无权访问 swap。 - 如果
memswap_limit未设置,并且memory设置后,容器可以使用与memory设置,如果主机容器配置了交换内存。例如,如果memory=“300m” 和memswap_limit未设置,则容器总共可以使用 600m 的内存和 swap。 - 如果
memswap_limit显式设置为 -1,则允许容器使用无限交换,最高可达主机系统上的可用数量。
network_mode
network_mode设置 Service Container 的网络模式。
none:关闭所有容器联网。host:为容器提供对主机网络接口的原始访问权限。service:{name}:通过引用容器的服务名称,为容器提供对指定容器的访问权限。container:{name}:通过引用容器的容器 ID 为容器提供对指定容器的访问权限。
有关容器网络的更多信息,请参阅 Docker Engine 文档。
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"设置后,networks属性,并且 Compose 会拒绝任何
Compose 文件。
网络
这networks属性定义服务容器所附加到的网络,引用networkstop-level 元素。这networks属性有助于管理容器的网络方面,从而控制服务在 Docker 环境中的分段和交互方式。这用于指定该服务的容器应连接到哪些网络。这对于定义容器如何相互通信以及如何进行外部通信非常重要。
services:
some-service:
networks:
- some-network
- other-network有关networks顶级元素,请参阅 网络。
别名
aliases声明网络上服务的备用主机名。同一台上的其他容器
network 可以使用服务名称或别名连接到服务的容器之一。
因为aliases是网络范围的,则同一服务可以在不同的网络上具有不同的别名。
注意
网络范围的别名可以由多个容器共享,甚至可以由多个服务共享。 如果是,则无法保证名称解析为哪个容器。
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2在以下示例中,servicefrontend能够到达backendservice 在
主机名backend或database在back-tier网络。服务monitoring能够达到相同的backendservice 在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_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
link_local_ips指定链路本地 IP 的列表。链路本地 IP 是属于井的特殊 IP
已知子网,完全由 Operator 管理,通常取决于它们所在的架构
部署。
例:
services:
app:
image: busybox
command: top
networks:
app_net:
link_local_ips:
- 57.123.22.11
- 57.123.22.13
networks:
app_net:
driver: bridgemac_address
mac_address设置服务容器在连接到此特定网络时使用的 MAC 地址。
优先权
priority指示 Compose 将服务的容器连接到其
网络。如果未指定,则默认值为 0。
在以下示例中,应用服务连接到app_net_1首先,因为它具有最高优先级。然后它连接到app_net_3然后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调整在内存不足时由 Platform 终止的容器的首选项。值必须
在 -1000,1000 范围内。
PID
pid设置 Compose 创建的容器的 PID 模式。
支持的值特定于平台。
pids_limit
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港口
这ports用于定义主机和容器之间的端口映射。这对于允许外部访问容器内运行的服务至关重要。可以使用简单端口映射的短语法或长语法(包括协议类型和网络模式等其他选项)来定义它。
注意
端口映射不得与
network_mode: host否则会发生运行时错误。
短语法
短语法是一个以冒号分隔的字符串,用于设置主机 IP、主机端口和容器端口 在表单中:
[HOST:]CONTAINER[/PROTOCOL]哪里:
HOST是[IP:](port | range)CONTAINER是port | rangePROTOCOL将端口限制为指定的协议。tcp和udp值由规范定义, Compose 支持特定于平台的协议名称。
如果未设置主机 IP,它将绑定到所有网络接口。端口可以是单个 值或范围。Host 和容器必须使用等效的范围。
指定两个端口 (HOST:CONTAINER),或者只是容器端口。在后一种情况下,
容器运行时会自动分配主机的任何未分配端口。
HOST:CONTAINER应始终指定为(带引号的)字符串,以避免冲突
使用 YAML Base-60 浮点数。
例子:
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 级别 4 / OSI 级别 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: hostpost_start
post_start定义在容器启动后运行的生命周期钩子序列。无法保证命令运行的确切时间。
command:指定容器启动后要运行的命令。此属性是必需的,您可以选择使用 shell 表单或 exec 表单。user:运行命令的用户。如果未设置,则使用与主服务命令相同的用户运行该命令。privileged:让post_start命令运行。working_dir:运行命令的工作目录。如果未设置,它将在与 main service 命令相同的工作目录中运行。environment:专门为post_start命令。虽然该命令继承了为服务的 main 命令定义的环境变量,但此部分允许您添加新变量或覆盖现有变量。
services:
test:
post_start:
- command: ./do_something_on_startup.sh
user: root
privileged: true
environment:
- FOO=BAR有关更多信息,请参阅使用生命周期挂钩。
pre_stop
pre_stop定义在容器停止之前要运行的生命周期钩子序列。如果容器自行停止或突然终止,这些 hook 将不会运行。
配置等效于“post_start。
特权
privileged将服务容器配置为使用提升的权限运行。支持和实际影响因平台而异。
配置 文件
profiles定义要启用的服务的命名配置文件列表。如果未分配,则始终启动服务,但如果已分配,则仅在激活配置文件时启动该服务。
如果存在,则profiles遵循[a-zA-Z0-9][a-zA-Z0-9_.-]+.
services:
frontend:
image: frontend
profiles: ["frontend"]
phpmyadmin:
image: phpmyadmin
depends_on:
- db
profiles:
- debugpull_policy
pull_policy定义 Compose 在开始拉取镜像时做出的决策。可能的值为:
always:Compose 始终从注册表中提取镜像。never:Compose 不会从注册表中提取镜像,而是依赖于平台缓存的镜像。 如果没有缓存的镜像,则报告失败。missing:仅当镜像在平台缓存中不可用时,Compose 才会提取镜像。 如果您未同时使用 Compose Build Specification,则此选项为默认选项。if_not_present被视为此值的别名,以实现向后兼容性。build:Compose 会构建镜像。如果镜像已存在,则 Compose 会重新构建该镜像。
read_only
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指定要用于服务容器的运行时。
例如runtime可以是 OCI 运行时规范的实施名称,例如“runc”。
web:
image: busybox:latest
command: true
runtime: runc默认值为runc.要使用其他运行时,请参阅替代运行时。
规模
scale指定要为此服务部署的默认容器数。
当两者都设置好时,scale必须与replicas属性。
秘密
这secretsattribute 按服务授予对 secrets 顶级元素定义的敏感数据的访问权限。可以向服务授予对多个密钥的访问权限。
支持两种不同的语法变体;短语法和长语法。密钥的 long 和 short 语法可以在同一 Compose 文件中使用。
如果密钥在平台上不存在或未在secrets顶级部分的 Compose 文件。
在顶级中定义密钥secrets不得暗示授予对它的任何服务访问权限。
此类授权必须在服务规范中作为 secrets 服务元素显式指定。
短语法
短语法变体仅指定密钥名称。这将授予
容器访问密钥并将其作为只读挂载到/run/secrets/<secret_name>在容器内。源名称和目标挂载点均已设置
添加到密钥名称。
以下示例使用 short 语法向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/在服务的任务容器中。默认值为 USER running container。mode:要挂载的文件的权限/run/secrets/在服务的任务容器中,采用八进制表示法。 默认值为全局可读权限(模式0444). 如果设置了 writable bit,则必须忽略该 writable bit 。可以设置可执行位。
以下示例将server-certificatesecret 文件设置为server.cert在容器中,将 mode 设置为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.certsecurity_opt
security_opt覆盖每个容器的默认标记方案。
security_opt:
- label:user:USER
- label:role:ROLE有关您可以覆盖的更多默认标记方案,请参阅安全配置。
shm_size
shm_size配置共享内存的大小 (/dev/shm分区)。
它被指定为字节值。
stdin_open
stdin_open将服务的容器配置为使用分配的 stdin 运行。这与使用-i旗。有关详细信息,请参阅 使 STDIN 保持打开状态。
支持的值包括true或false.
stop_grace_period
stop_grace_period指定 Compose 在尝试停止容器时必须等待多长时间(如果未停止容器)
handle SIGTERM (或已指定的任何停止信号stop_signal),然后再发送 SIGKILL。它被指定
作为持续时间。
stop_grace_period: 1s
stop_grace_period: 1m30s默认值为 10 秒,以便容器在发送 SIGKILL 之前退出。
stop_signal
stop_signal定义 Compose 用于停止服务容器的信号。
如果未设置的容器被 Compose 通过发送SIGTERM.
stop_signal: SIGUSR1storage_opt
storage_opt定义服务的存储驱动程序选项。
storage_opt:
size: '1G'sysctl 参数
sysctls定义要在容器中设置的内核参数。sysctls可以使用 array 或 map。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0您只能使用在内核中具有命名空间的 sysctl 参数。Docker 不会 支持更改容器内的 sysctl 参数,这些 sysctl 参数也会修改主机系统。 有关支持的 sysctl 的概述,请参阅配置命名空间内核 参数 (sysctl) 的 S 参数。
TMPFS
tmpfs在容器内挂载临时文件系统。它可以是单个值或列表。
tmpfs:
- <path>
- <path>:<options>:容器内将挂载 tmpfs 的路径。 :tmpfs 挂载的选项列表(以逗号分隔)。
可用选项:
mode:设置文件系统权限。uid:设置拥有已挂载 tmpfs 的用户 ID。gid:设置拥有已挂载 tmpfs 的组 ID。
services:
app:
tmpfs:
- /data:mode=755,uid=1009,gid=1009
- /runtty
tty将服务的容器配置为使用 TTY 运行。这与使用-t或--tty旗。有关详细信息,请参阅分配伪 TTY。
支持的值包括true或false.
ulimits
ulimits覆盖容器的默认 uLimit。它被指定为单个限制的整数
或作为软/硬限制的映射。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000用户
user覆盖用于运行容器进程的用户。默认值由镜像(即 DockerfileUSER).如果未设置,则root.
userns_mode
userns_mode设置服务的用户命名空间。支持的值特定于平台,可能取决于
在平台配置上。
userns_mode: "host"UTS
uts配置服务容器的 UTS 命名空间模式集。未指定时
如果支持,则由运行时决定分配 UTS 命名空间。可用值为:
'host':导致容器使用与主机相同的 UTS 命名空间。
uts: "host"卷
这volumes属性定义服务容器可访问的挂载主机路径或命名卷。您可以使用volumes定义多种类型的挂载;volume,bind,tmpfs或npipe.
如果挂载是主机路径,并且仅由单个服务使用,则可以将其声明为服务的一部分
定义。要跨多个服务重用卷,请创建一个名为
volume 必须在volumestop-level 元素。
以下示例显示了一个命名卷 (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:有关volumes顶级元素,请参阅 卷。
短语法
短语法使用带有冒号分隔值的单个字符串来指定卷挂载
(VOLUME:CONTAINER_PATH) 或访问模式 (VOLUME:CONTAINER_PATH:ACCESS_MODE).
VOLUME:可以是托管容器的平台上的主机路径(绑定挂载)或卷名称。CONTAINER_PATH:容器中挂载卷的路径。ACCESS_MODE:逗号分隔,选项列表:rw:读取和写入访问权限。如果未指定任何内容,则为默认值。ro:只读访问权限。z: SELinux 选项,指示绑定挂载主机内容在多个容器之间共享。Z:SELinux 选项,指示绑定挂载主机内容是私有的,并且对于其他容器是非共享的。
注意
在没有 SELinux 的平台上,将忽略 SELinux 重新标记绑定挂载选项。
注意
只有部署到 本地容器运行时。这是因为相对路径是从 Compose 文件的父级解析的 目录,该目录仅适用于本地情况。当 Compose 部署到非本地 platform 拒绝使用相对主机路径的 Compose 文件,但会出现错误。为避免歧义 对于命名卷,相对路径应始终以
.或...
长语法
长格式语法允许配置不能 以简短的形式表示。
type:挂载类型。也volume,bind,tmpfs,npipe或clustersource:挂载的源、绑定挂载在主机上的路径或 在顶级volumes钥匙.不适用于 tmpfs 挂载。target:容器中挂载卷的路径。read_only:标记以将卷设置为只读。bind:用于配置其他绑定选项:propagation:用于绑定的传播模式。create_host_path:如果不存在任何内容,则在 host 上的源路径处创建一个目录。 如果路径中存在任何内容,则 Compose 不会执行任何作。这由简短的语法自动暗示 为了向后兼容docker-compose遗产。selinux:SELinux 重新标记选项z(共享) 或Z(私人)
volume:配置其他卷选项:nocopy:此标记可在创建卷时禁用从容器复制数据。subpath:卷中要挂载的路径,而不是卷根目录。
tmpfs:配置其他 tmpfs 选项:size:tmpfs 挂载的大小,以字节为单位(数字或字节单位)。mode:tmpfs 的文件模式作为八进制数的 Unix 权限位挂载。在 Docker Compose 版本 2.14.0 中引入。
consistency:挂载的一致性要求。可用值特定于平台。
提示
使用大型仓库或 monorepo,或者使用不再随代码库扩展的虚拟文件系统? Compose 现在利用同步文件共享,并自动为绑定挂载创建文件共享。 确保您已使用付费订阅登录到 Docker,并且已在 Docker Desktop 的设置中启用了 Access experimental features 和 Manage Synchronized file shares with Compose。
volumes_from
volumes_from挂载来自其他服务或容器的所有卷。您可以选择指定
只读访问ro或读写rw.如果未指定访问级别,则使用读写访问权限。
您还可以使用container:前缀。
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rwworking_dir
working_dir覆盖由镜像指定的容器工作目录,例如 Dockerfile 的WORKDIR.