Docker Compose 配置文件详解(V3)
随着 Docker v1.13 版本发布,Compose 的配置文件也发生了改动,官方命名为 v3,今天来看一下相比 v2 的写法,v3有哪些异同。
因为是 YAML 语法,所以无论是 .yml 还是 .yaml 作为后缀名,Compose 都可以识别。
1. build
与上一个版本没有变化,依旧是熟悉的格式:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
2. cap_add, cap_drop
这部分用于调整容器操作内核权限、能力。这部分有一点点变化,就是在 Swarm 模式中,Compose 会忽略这部分参数的值。
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
大概是出于提高集群安全性的考虑?没怎么用过这个部分的参数。
3. command
没有变化
command: bundle exec thin -p 3000
4. cgroup_parent
与上面第二条一样,在 Swarm 模式中忽略这部分的值。格式没变化:
cgroup_parent: m-executor-abcd
5. container_name
没变化。
6. deploy
这个来了,deploy 加入了正式版,这是 V3 才能使用的语法。
首先这是一个服务于 Swarm 的语法,也就是当用户使用例如:
docker-compose up
docker-compose run
这种方式启动时,Compose 会忽略 deploy 部分的内容。
语法规则:
deploy:
replicas: 6
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
6.1 mode
首先 deploy 提供了一个模式选项,它的值有 global 和 replicated 两个,默认是 replicated 模式。
这两个模式的区别是:
- global:每个集群每个服务实例启动一个容器,就像以前启动 Service 时一样。
- replicated:用户可以指定集群中实例的副本数量。
以前这个功能是无法在 Compose 中直接实现的,以前需要用户先使用 docker-compose bundle
命令将 docker-compose.yml 转换为 .dab 文件,然后才能拿到集群部署,而且很多功能用不了。
但是随着这次更新把 stack 加进来了,deploy 也就水到渠成加进了 Compose 功能中。
6.2 replicas
上面说到可以指定副本数量,其中 replicas 就是用于指定副本数量的选项。
deploy:
replicas: 6
部署服务栈:
docker stack deploy --compose-file docker-compose.yml
6.3 placement
这是 Docker 1.12 版本时就引入的概念,允许用户限制服务容器,具体有什么用我也不知道,笑。
网上能找的资料好少,官方文档只有两句废话,如果我能找到原来的 issue 或者 PR 或许可以理解一些。
6.4 update_config
早在上一个版本中,Swarm 就提供了一个升级回滚的功能。当服务升级出现故障时,超过重试次数则停止升级的功能,这也很方便,避免让错误的应用替代现有正常服务。
这个选项用于告诉 Compose 使用怎样的方式升级,以及升级失败后怎样回滚原来的服务。
- parallelism: 服务中多个容器同时更新。
- delay: 设置每组容器更新之间的延迟时间。
- failure_action: 设置更新失败时的动作,可选值有 continue 与 pause (默认是:pause)。
- monitor: 每次任务更新失败后监视故障的持续时间 (ns|us|ms|s|m|h) (默认:0s)。
- max_failure_ratio: 更新期间容忍的故障率。
6.5 resources
看例子:
resources:
limits:
cpus: '0.001'
memory: 50M
reservations:
cpus: '0.0001'
memory: 20M
知道干啥用了吧,这是一个新的语法选项,替代了之前的类似 cpu_shares, cpu_quota, cpuset, mem_limit, memswap_limit 这种选项。统一起来好看点。
6.6 restart_policy
设置如何重启容器,毕竟有时候容器会意外退出。
- condition:设置重启策略的条件,可选值有 none, on-failure 和 any (默认:any)。
- delay:在重新启动尝试之间等待多长时间,指定为持续时间(默认值:0)。
- max_attempts:设置最大的重启尝试次数,默认是永不放弃,哈哈,感受到一股运维的绝望。
- window:在决定重新启动是否成功之前要等待多长时间,默认是立刻判断,有些容器启动时间比较长,指定一个“窗口期”非常重要。
7. labels
没有变化。
8. devices
基本没变化,Swarm 模式会无视这部分设置。
9. depends_on
和以前一样。
10. dns 和 dns_search
Swarm 模式无视设置,其他一样。
11. tmpfs
没有变化。Swarm 模式无视设置。
12. entrypoint
没有变化。
13. env_file
变量出奇多时可以用这个办法管理变量。没有变化。
14. environment
没有变化。
15. expose
没有变化。
16. external_links
没有变化,但是不建议使用,因为这是一个遗留的选项,现在你可以在 Compose 中使用 networks 代替,效果是一样的,但是后者更加容易管理与理解。
17. extra_hosts
没有变化。
18. group_add 和 healthcheck、image、isolation、links、logging、network_mode、networks、aliases、ipv4_address, ipv6_address、link_local_ips、pid、ports、security_opt、stop_grace_period、stop_signal、sysctls、ulimits、userns_mode、domainname, hostname, ipc, mac_address, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir
以上都没有变化,需要提一下的是 links、network_mode、security_opt、stop_signal、sysctls、userns_mode 会在 Swarm 模式中无视。
isolation 提供了三种容器隔离方式:default,process 和 hyperv。
19. secret 管理
新事物,这部分放到以后的文章中。
20. volumes_from
这个去掉了,嗯。需要共享数据用命名卷,例如:
version: "3"
services:
db:
image: db
volumes:
- data-volume:/var/lib/db
backup:
image: backup-service
volumes:
- data-volume:/var/lib/backup/data
volumes:
data-volume:
去除 volume_driver,这种服务全局的东西没有必要,直接针对每个卷使用 volume 键下的 driver 即可。
最后一个官方例子结束本文:
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data: