Docker Compose 配置文件詳解(V3)

隨著 Docker v1.13 版本發(fā)布,Compose 的配置文件也發(fā)生了改動(dòng),官方命名為 v3,今天來(lái)看一下相比 v2 的寫(xiě)法,v3有哪些異同。

因?yàn)槭?YAML 語(yǔ)法,所以無(wú)論是 .yml 還是 .yaml 作為后綴名,Compose 都可以識(shí)別。

1. build

與上一個(gè)版本沒(méi)有變化,依舊是熟悉的格式:

build:
  context: ./dir
  dockerfile: Dockerfile-alternate
  args:
    buildno: 1

2. cap_add, cap_drop

這部分用于調(diào)整容器操作內(nèi)核權(quán)限、能力。這部分有一點(diǎn)點(diǎn)變化,就是在 Swarm 模式中,Compose 會(huì)忽略這部分參數(shù)的值。

cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

大概是出于提高集群安全性的考慮?沒(méi)怎么用過(guò)這個(gè)部分的參數(shù)。

3. command

沒(méi)有變化

command: bundle exec thin -p 3000

4. cgroup_parent

與上面第二條一樣,在 Swarm 模式中忽略這部分的值。格式?jīng)]變化:

cgroup_parent: m-executor-abcd

5. container_name

沒(méi)變化。

6. deploy

這個(gè)來(lái)了,deploy 加入了正式版,這是 V3 才能使用的語(yǔ)法。
首先這是一個(gè)服務(wù)于 Swarm 的語(yǔ)法,也就是當(dāng)用戶(hù)使用例如:

docker-compose up
docker-compose run

這種方式啟動(dòng)時(shí),Compose 會(huì)忽略 deploy 部分的內(nèi)容。

語(yǔ)法規(guī)則:

deploy:
  replicas: 6
  update_config:
    parallelism: 2
    delay: 10s
  restart_policy:
    condition: on-failure

6.1 mode

首先 deploy 提供了一個(gè)模式選項(xiàng),它的值有 global 和 replicated 兩個(gè),默認(rèn)是 replicated 模式。

這兩個(gè)模式的區(qū)別是:

  • global:每個(gè)集群每個(gè)服務(wù)實(shí)例啟動(dòng)一個(gè)容器,就像以前啟動(dòng) Service 時(shí)一樣。
  • replicated:用戶(hù)可以指定集群中實(shí)例的副本數(shù)量。

以前這個(gè)功能是無(wú)法在 Compose 中直接實(shí)現(xiàn)的,以前需要用戶(hù)先使用 docker-compose bundle 命令將 docker-compose.yml 轉(zhuǎn)換為 .dab 文件,然后才能拿到集群部署,而且很多功能用不了。

但是隨著這次更新把 stack 加進(jìn)來(lái)了,deploy 也就水到渠成加進(jìn)了 Compose 功能中。

6.2 replicas

上面說(shuō)到可以指定副本數(shù)量,其中 replicas 就是用于指定副本數(shù)量的選項(xiàng)。

deploy:
  replicas: 6

部署服務(wù)棧:

docker stack deploy --compose-file docker-compose.yml

6.3 placement

這是 Docker 1.12 版本時(shí)就引入的概念,允許用戶(hù)限制服務(wù)容器,具體有什么用我也不知道,笑。

網(wǎng)上能找的資料好少,官方文檔只有兩句廢話,如果我能找到原來(lái)的 issue 或者 PR 或許可以理解一些。

6.4 update_config

早在上一個(gè)版本中,Swarm 就提供了一個(gè)升級(jí)回滾的功能。當(dāng)服務(wù)升級(jí)出現(xiàn)故障時(shí),超過(guò)重試次數(shù)則停止升級(jí)的功能,這也很方便,避免讓錯(cuò)誤的應(yīng)用替代現(xiàn)有正常服務(wù)。

這個(gè)選項(xiàng)用于告訴 Compose 使用怎樣的方式升級(jí),以及升級(jí)失敗后怎樣回滾原來(lái)的服務(wù)。

  • parallelism: 服務(wù)中多個(gè)容器同時(shí)更新。
  • delay: 設(shè)置每組容器更新之間的延遲時(shí)間。
  • failure_action: 設(shè)置更新失敗時(shí)的動(dòng)作,可選值有 continue 與 pause (默認(rèn)是:pause)。
  • monitor: 每次任務(wù)更新失敗后監(jiān)視故障的持續(xù)時(shí)間 (ns|us|ms|s|m|h) (默認(rèn):0s)。
  • max_failure_ratio: 更新期間容忍的故障率。

6.5 resources

看例子:

resources:
  limits:
    cpus: '0.001'
    memory: 50M
  reservations:
    cpus: '0.0001'
    memory: 20M

知道干啥用了吧,這是一個(gè)新的語(yǔ)法選項(xiàng),替代了之前的類(lèi)似 cpu_shares, cpu_quota, cpuset, mem_limit, memswap_limit 這種選項(xiàng)。統(tǒng)一起來(lái)好看點(diǎn)。

6.6 restart_policy

設(shè)置如何重啟容器,畢竟有時(shí)候容器會(huì)意外退出。

  • condition:設(shè)置重啟策略的條件,可選值有 none, on-failure 和 any (默認(rèn):any)。
  • delay:在重新啟動(dòng)嘗試之間等待多長(zhǎng)時(shí)間,指定為持續(xù)時(shí)間(默認(rèn)值:0)。
  • max_attempts:設(shè)置最大的重啟嘗試次數(shù),默認(rèn)是永不放棄,哈哈,感受到一股運(yùn)維的絕望。
  • window:在決定重新啟動(dòng)是否成功之前要等待多長(zhǎng)時(shí)間,默認(rèn)是立刻判斷,有些容器啟動(dòng)時(shí)間比較長(zhǎng),指定一個(gè)“窗口期”非常重要。

7. labels

沒(méi)有變化。

8. devices

基本沒(méi)變化,Swarm 模式會(huì)無(wú)視這部分設(shè)置。

9. depends_on

和以前一樣。

10. dns 和 dns_search

Swarm 模式無(wú)視設(shè)置,其他一樣。

11. tmpfs

沒(méi)有變化。Swarm 模式無(wú)視設(shè)置。

12. entrypoint

沒(méi)有變化。

13. env_file

變量出奇多時(shí)可以用這個(gè)辦法管理變量。沒(méi)有變化。

14. environment

沒(méi)有變化。

15. expose

沒(méi)有變化。

16. external_links

沒(méi)有變化,但是不建議使用,因?yàn)檫@是一個(gè)遺留的選項(xiàng),現(xiàn)在你可以在 Compose 中使用 networks 代替,效果是一樣的,但是后者更加容易管理與理解。

17. extra_hosts

沒(méi)有變化。

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

以上都沒(méi)有變化,需要提一下的是 links、network_mode、security_opt、stop_signal、sysctls、userns_mode 會(huì)在 Swarm 模式中無(wú)視。
isolation 提供了三種容器隔離方式:default,process 和 hyperv。

19. secret 管理

新事物,這部分放到以后的文章中。

20. volumes_from

這個(gè)去掉了,嗯。需要共享數(shù)據(jù)用命名卷,例如:

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,這種服務(wù)全局的東西沒(méi)有必要,直接針對(duì)每個(gè)卷使用 volume 鍵下的 driver 即可。

最后一個(gè)官方例子結(jié)束本文:

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:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 以下原文轉(zhuǎn)載于(https://docs.docker.com/docker-for-mac/)(想找中文版的最新...
    Veekend閱讀 7,613評(píng)論 0 17
  • 我?guī)е穷w純真的心向你走去 溫火 熱焰 及寒冰 我笑那水中的倒影沒(méi)出息 水一晃她便面目全非 水一止則令人心動(dòng) 那飽...
    小辣椒0閱讀 255評(píng)論 0 7
  • Zuul是什么? Zuul相當(dāng)于是第三方調(diào)用(app應(yīng)用端和PC端)和服務(wù)提供方之間的防護(hù)門(mén)。作為前端服務(wù)(Edg...
    黑山老妖拉肚子閱讀 4,572評(píng)論 0 0
  • 孩子考完試放假了,本來(lái)想著放假可以晚點(diǎn)起床做早餐,結(jié)果還是五點(diǎn)醒啦!只好起來(lái)準(zhǔn)備早餐,想著還可以去市場(chǎng)買(mǎi)點(diǎn)新鮮的食...
    黃泳儀閱讀 220評(píng)論 0 2