继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Docker Compose 配置文件详解(V3)

蓝山帝景
关注TA
已关注
手记 439
粉丝 46
获赞 150

随着 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:



作者:左蓝
链接:https://www.jianshu.com/p/748416621013


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP