Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它允许用户使用YAML格式的配置文件(通常是docker-compose.yml)来配置应用程序所需的所有服务,并可以通过一个命令来启动或关闭这些容器。
服务配置(接上一篇)
6. container_name
指定自定义容器的名称,而不是使用默认名称。例如:
container_name: my-web-container
因为Docker容器的名称必须唯一,所以为一个服务指定了自定义容器名称后,该服务不能进行扩展。如果尝试为该服务扩容将会导致错误。
使用docker stack deploy时的注意事项:在swarm mode下部署堆栈时,container_name配置项将被忽略。
7. credential_spec
在3.3版的配置文件格式中加入
在3.8或更高版本文件格式中支持将组托管服务帐户(GMSA)配置与Compose配置文件一起使用。
配置托管服务帐户的凭据规格(credential spec)。此选项仅用于使用Windows容器的服务。credential_spec配置必须采用file://或registry://格式。使用file:时,引用的文件必须存在于Docker数据目录的CredentialSpecs子目录中,在Windows上,Docker数据目录默认为C:\ProgramData\Docker\。以下示例从名为C:\ProgramData\Docker\CredentialSpecs\my-credential-spec.json的文件加载凭证规格:
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凭据规格时,只需用config指定凭据规格。例如:
version: "3.8"
services:
myservice:
image: myimage:latest
credential_spec:
config: my_credential_spec
configs:
my_credentials_spec:
file: ./my-credential-spec.json|
8. depends_on
指定服务之间的依赖关系,解决服务启动先后顺序问题。指定服务之间的依赖关系,将会导致以下行为:
docker-compose up以依赖顺序启动服务。
docker-compose up SERVICE会自动包含SERVICE的依赖项。
docker-compose stop以依赖顺序停止服务。
例如以下示例:
version: "3.8"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
启动时会先启动db和redis,最后才启动web。在使用docker-compose up web启动web时,也会启动db和redis,因为在web服务中指定了依赖关系。在停止时也在web之前先停止db和redis。
使用depends_on时的注意事项:
服务不会等待该服务所依赖的服务完全启动之后才启动。例如上例,web不会等到db和redis完全启动之后才启动。
V3版不再支持的condition形式的depends_on。
V3版中,在swarm mode下部署堆栈时,depends_on配置项将被忽略。
9. deploy
在3版的配置文件格式中加入
指定部署和运行服务的相关配置。该配置仅在swarm mode下生效,并只能通过docker stack deploy命令部署,docker-compose up和docker-compose run命令将被忽略。例如:
version: "3.8"
services:
redis:
image: redis:alpine
deploy:
replicas: 6
placement:
max_replicas_per_node: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
deploy配置项中包含endpoint_mode、labels、mode、placement、replicas、resources、restart_policy、update_config等子配置项。
(1) endpoint_mode
在3.2版的配置文件格式中加入
为外部客户端连接到swarm指定服务发现方式:
endpoint_mode: vip:Docker为服务分配了一个前端的虚拟IP,客户端通过该虚拟IP访问网络上的服务。Docker在客户端和服务的可用工作节点之间进行路由请求,而无须关系有多少节点正在参与该服务或这些节点的IP地址或者端口。这是默认设置。
endpoint_mode: dnsrr:DNS轮询(DNSRR),Docker设置服务的DNS条目,以便对服务名称的DNS查询返回IP地址列表,并且客户端通过轮询的方式直接连接到其中之一。
例如:
version: "3.8"
services:
wordpress:
image: wordpress
ports:
- "8080:80"
deploy:
mode: replicated
replicas: 2
endpoint_mode: vip
(2) labels
指定服务的标签。这些标签仅在服务上设置,而不在服务的任何容器上设置。例如:
version: "3.8"
services:
web:
image: web
deploy:
labels:
com.example.description: "This label will appear on the web service"
(3) mode
指定服务的容器副本模式。可以为:
global:每个swarm节点只有一个该服务容器。
replicated:整个集群中存在指定份数的服务容器副本,为默认值。
例如,指定容器副本模式为global:
version: "3.8"
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
mode: global
(4) placement
指定constraints和preferences。constraints可以指定只有符合要求的节点上才能运行该服务容器,preferences可以指定容器分配策略。例如,指定集群中只有满足node.rolemanager和engine.labels.operatingsystemubuntu 18.04条件的节点上能运行db服务容器,并且在满足node.labels.zone的节点上均匀分配:
version: "3.8"
services:
db:
image: postgres
deploy:
placement:
constraints:
- "node.role==manager"
- "engine.labels.operatingsystem==ubuntu 18.04"
preferences:
- spread: node.labels.zone
(5) max_replicas_per_node
在3.8版的配置文件格式中加入
如果服务的容器副本模式为replicated(默认),可以指定每个节点上运行的最大容器副本数量。当指定的容器副本数量大于最大容器副本数量时,将引发no suitable node (max replicas per node limit exceed)错误。例如:
version: "3.8"
services:
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 6
placement:
max_replicas_per_node: 1
(6) replicas
如果服务的容器副本模式为replicated(默认),指定运行的容器副本数量。例如:
version: "3.8"
services:
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 6
(7) resources
配置资源限制。例如,指定redis服务使用的cpu份额为25%到50%,内存为20M到50M:
version: "3.8"
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
在V3版Compose配置文件中的改变:resources取代了V3版之前的Compose配置文件中旧的资源限制的配置项,包括cpu_shares、cpu_quota、cpuset、mem_limit、memswap_limit、mem_swappiness。
在非swarm mode容器上设置资源限制:此处的resources配置项只有用于deploy配置项之下和swarm mode。如果要在非swarm mode部署中设置资源限制,需使用V2版Compose配置文件中CPU、memory和其他资源的配置项。
(8) restart_policy
指定容器的重启策略。代替restart。有以下配置选项:
condition:重启策略。值可以为none、on-failure或any,默认为any。
delay:尝试重启的等待时间。指定为持续时间(durations)。默认值为0。
max_attempts:重启最多尝试的次数,超过该次数将放弃。默认为永不放弃。如果在window配置的时间之内未成功重启,则此次尝试不计入max_attempts的值。
window:在决定重启是否成功之前的等待时间。指定为持续时间(durations)。默认值为立即决定。
例如,指定重启策略为失败时重启,等待5s,重启最多尝试3次,决定重启是否成功前的等待时间为120s:
version: "3.8"
services:
redis:
image: redis:alpine
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
(9) rollback_config
在3.7版的配置文件格式中加入
配置在更新失败的情况下如何回滚服务。有以下配置选项:
parallelism:一次回滚的容器数量。如果设置为0,则所有容器同时回滚。
delay:每个容器组之间的回滚所等待的时间。默认值为0s。
failure_action:回滚失败后的行为。有continue和pause两种,默认值为pause。
monitor:每次任务更新后监视失败的时间(ns|us|ms|s|m|h)。默认值为0s。
max_failure_ratio:在回滚期间能够容忍的最大失败率。默认值为0。
order:设置回滚顺序。stop-first为在开启新任务之前停止旧任务,start-first为首先启动新任务,和正在运行任务短暂重叠,默认值为stop-first。
(10) update_config
配置如何更新服务。该配置对滚动更新很有用。有以下配置选项:
parallelism:一次更新的容器数量。
delay:更新一组容器之间的等待时间。
failure_action:更新失败后的行为。有continue、rollback和pause三种,默认值为pause。
monitor:每次任务更新后监视失败的时间(ns|us|ms|s|m|h)。默认值为0s。
max_failure_ratio:在更新期间能够容忍的最大失败率。
order:设置更新顺序。stop-first为在开启新任务之前停止旧任务,start-first为首先启动新任务,和正在运行任务短暂重叠,默认值为stop-first。注意该配置项在3.4版的配置文件格式中加入,仅支持3.4或更高版本。
例如,指定每次更新2个容器,更新等待时间10s,更新顺序为先停止旧任务再开启新任务:
version: "3.8"
services:
vote:
image: dockersamples/examplevotingapp_vote:before
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
order: stop-first
(11) 不支持docker stack deploy的配置项
以下为支持docker-compose up和docker-compose run,不支持docker stack deploy或deploy配置项的配置项:
build
cgroup_parent
container_name
devices
tmpfs
external_links
links
network_mode
restart
security_opt
userns_mode
10. devices
指定设备映射列表。与Docker客户端create的--device选项类似。例如:
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
使用docker stack deploy时的注意事项:在swarm mode下部署堆栈时,devices配置选项将被忽略。