docker-compose.yml 配置文件編寫詳解

docker compose 在 Docker 容器運用中具有很大的學習意義,docker compose 是一個整合發佈應用的利器。而使用 docker compose 時,懂得如何編排 docker compose 配置文件是很重要的。

一. 前言

關於 docker compose 技術可以查看官方文檔 Docker Compose

以下的內容是確立在已經下載好 Docker 以及 Docker Compose,可參看 Docker Compose 的官方安裝教程 Install Docker Compose

二. Docker Compose 配置文件的構建參數說明

首先,官方提供了一個 yaml Docker Compose 配置文件的標準例子

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:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293

此文件配置了多個服務,關於此配置文件的各個語句含義就需要弄懂配置選項的含義了

文件配置

compose 文件是一個定義服務、 網絡和卷的 YAML 文件 。Compose 文件的默認路徑是 ./docker-compose.yml

提示:可以是用 .yml 或 .yaml 作爲文件擴展名

服務定義包含應用於爲該服務啓動的每個容器的配置,就像傳遞命令行參數一樣 docker container create。同樣,網絡和卷的定義類似於 docker network create 和 docker volume create

正如 docker container create 在 Dockerfile 指定選項,如 CMD、 EXPOSE、VOLUME、ENV,在默認情況下,你不需要再次指定它們docker-compose.yml。

可以使用 Bash 類 ${VARIABLE} 語法在配置值中使用環境變量。

配置選項

1.bulid

服務除了可以基於指定的鏡像,還可以基於一份 Dockerfile,在使用 up 啓動之時執行構建任務,這個構建標籤就是 build,它可以指定 Dockerfile 所在文件夾的路徑。Compose 將會利用它自動構建這個鏡像,然後使用這個鏡像啓動服務容器

build: /path/to/build/dir1

也可以是相對路徑

build: ./dir1

設定上下文根目錄,然後以該目錄爲準指定 Dockerfile

build:  context: ../
  dockerfile: path/of/Dockerfile123

例子

version: '3'services:
  webapp:
    build: ./dir12345

如果 context 中有指定的路徑,並且可以選定 Dockerfile 和 args。那麼 arg 這個標籤,就像 Dockerfile 中的 ARG 指令,它可以在構建過程中指定環境變量,但是在構建成功後取消,在 docker-compose.yml 文件中也支持這樣的寫法:

version: '3'services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1123456789

與 ENV 不同的是,ARG 可以爲空值

args:
  - buildno  - password123

如果要指定 image 以及 build ,選項格式爲

build: ./dirimage: webapp:tag12

這會在 ./dir 目錄生成一個名爲 webaapp 和標記爲 tag 的鏡像

Note:當用(Version 3) Compose 文件在羣集模式下部署堆棧時,該選項被忽略。因爲 docker stack 命令只接受預先構建的鏡像

2. context

context 選項可以是 Dockerfile 的文件路徑,也可以是到鏈接到 git 倉庫的 url

當提供的值是相對路徑時,它被解析爲相對於撰寫文件的路徑,此目錄也是發送到 Docker 守護進程的 context

build:
  context: ./dir12

3. dockerfile

使用此 dockerfile 文件來構建,必須指定構建路徑

build:
  context: .
  dockerfile: Dockerfile-alternate123

4. args

添加構建參數,這些參數是僅在構建過程中可訪問的環境變量

首先, 在Dockerfile中指定參數:

ARG buildno
ARG password

RUN echo "Build number: $buildno"RUN script-requiring-password.sh "$password"123456

然後指定 build 下的參數,可以傳遞映射或列表

build:
  context: .
  args:
    buildno: 1
    password: secret12345

build:
  context: .
  args:
    - buildno=1    - password=secret123456

指定構建參數時可以省略該值,在這種情況下,構建時的值默認構成運行環境中的值

args:
  - buildno  - password123

Note: YAML 布爾值(true,false,yes,no,on,off)必須使用引號括起來,以爲了能夠正常被解析爲字符串

5. cache_from

編寫緩存解析鏡像列表

build:
  context: .
  cache_from:
    - alpine:latest    - corp/web_app:3.1412345

6. labels

使用 Docker標籤 將元數據添加到生成的鏡像中,可以使用數組或字典。

建議使用反向 DNS 標記來防止簽名與其他軟件所使用的簽名衝突

build:
  context: .
  labels:    com.example.description: "Accounting webapp"
    com.example.department: "Finance"
    com.example.label-with-empty-value: ""123456

build:
  context: .
  labels:
    - "com.example.description=Accounting webapp"    - "com.example.department=Finance"    - "com.example.label-with-empty-value"123456

7.shm_size

設置容器 /dev/shm 分區的大小,值爲表示字節的整數值或表示字符的字符串

build:
  context: .
  shm_size: '2gb'1234

build:
  context: .
  shm_size: 100000001234

8. target

根據對應的 Dockerfile 構建指定 Stage

build:
    context: .
    target: prod1234

9. cap_add、cap_drop

添加或刪除容器功能,可查看 man 7 capabilities

cap_add:
  - ALLcap_drop:
  - NET_ADMIN  - SYS_ADMIN123456

Note:當用(Version 3) Compose 文件在羣集模式下部署堆棧時,該選項被忽略。因爲 docker stack 命令只接受預先構建的鏡像

10. command

覆蓋容器啓動後默認執行的命令

command: bundle exec thin -p 30001

該命令也可以是一個列表,方法類似於 dockerfile:

command: ["bundle", "exec", "thin", "-p", "3000"]12

11. configs

使用服務 configs 配置爲每個服務賦予相應的訪問權限,支持兩種不同的語法。

Note: 配置必須存在或在 configs 此堆棧文件的頂層中定義,否則堆棧部署失效

1.SHORT 語法

SHORT 語法只能指定配置名稱,這允許容器訪問配置並將其安裝在 /<config_name> 容器內,源名稱和目標裝入點都設爲配置名稱。

version: "3.3"services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - my_config
      - my_other_configconfigs:
  my_config:
    file: ./my_config.txt
  my_other_config:
    external: true1234567891011121314

以上實例使用 SHORT 語法將 redis 服務訪問授予 my_config 和 my_other_config ,並被 my_other_config 定義爲外部資源,這意味着它已經在 Docker 中定義。可以通過 docker config create 命令或通過另一個堆棧部署。如果外部部署配置都不存在,則堆棧部署會失敗並出現 config not found 錯誤。

Note: config 定義僅在 3.3 版本或在更高版本的撰寫文件格式中受支持,YAML 的布爾值(true, false, yes, no, on, off)必須要使用引號引起來(單引號、雙引號均可),否則會當成字符串解析。

2. LONG 語法

LONG 語法提供了創建服務配置的更加詳細的信息

  • source:Docker 中存在的配置的名稱

  • target:要在服務的任務中裝載的文件的路徑或名稱。如果未指定則默認爲 /<source>

  • uid 和 gid:在服務的任務容器中擁有安裝的配置文件的數字 UID 或 GID。如果未指定,則默認爲在Linux上。Windows不支持。

  • mode:在服務的任務容器中安裝的文件的權限,以八進制表示法。例如,0444 代表文件可讀的。默認是 0444。如果配置文件無法寫入,是因爲它們安裝在臨時文件系統中,所以如果設置了可寫位,它將被忽略。可執行位可以設置。如果您不熟悉 UNIX 文件權限模式,Unix Permissions Calculator

下面示例在容器中將 my_config 名稱設置爲 redis_config,將模式設置爲 0440(group-readable)並將用戶和組設置爲 103。該 `redis 服務無法訪問 my_other_config 配置。

version: "3.3"services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    configs:
      - source: my_config
        target: /redis_config
        uid: '103'
        gid: '103'
        mode: 0440configs:
  my_config:    file: ./my_config.txt
  my_other_config:
    external: true123456789101112131415161718

可以同時授予多個配置的服務相應的訪問權限,也可以混合使用 LONG 和 SHORT 語法。定義配置並不意味着授予服務訪問權限。

12. cgroup_parent

可以爲容器選擇一個可選的父 cgroup

cgroup_parent: m-executor-abcd1

注意:當 使用(Version 3)Compose 文件在羣集模式下部署堆棧時,忽略此選項

13. container_name

爲自定義的容器指定一個名稱,而不是使用默認的名稱

container_name: my-web-container1

因爲 docker 容器名稱必須是唯一的,所以如果指定了一個自定義的名稱,不能擴展一個服務超過 1 個容器

14. credential_spec

爲託管服務賬戶配置憑據規範,此選項僅適用於 Windows 容器服務

在 credential_spec 上的配置列表格式爲 file://<filename> 或 registry://<value-name>

使用 file: 應該注意引用的文件必須存在於 CredentialSpecs,docker 數據目錄的子目錄中。在 Windows 上,該目錄默認爲 C:\ProgramData\Docker\。以下示例從名爲C:\ProgramData\Docker\CredentialSpecs\my-credential-spec.json 的文件加載憑證規範 :

credential_spec:
  file: my-credential-spec.json123

使用 registry: 將從守護進程主機上的 Windows 註冊表中讀取憑據規範。其註冊表值必須位於:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs1

下面的示例通過 my-credential-spec 註冊表中指定的值加載憑證規範:

credential_spec:
  registry: my-credential-spec12

15. deploy

指定與部署和運行服務相關的配置

version: '3'services:
  redis:
    image: redis:alpine
    deploy:
      replicas: 6
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure1234567891011

這裏有幾個子選項

1. endpoint_mode

指定連接到羣組外部客戶端服務發現方法

  • endpoint_mode:vip :Docker 爲該服務分配了一個虛擬 IP(VIP),作爲客戶端的 “前端“ 部位用於訪問網絡上的服務。

  • endpoint_mode: dnsrr : DNS輪詢(DNSRR)服務發現不使用單個虛擬 IP。Docker爲服務設置 DNS 條目,使得服務名稱的 DNS 查詢返回一個 IP 地址列表,並且客戶端直接連接到其中的一個。如果想使用自己的負載平衡器,或者混合 Windows 和 Linux 應用程序,則 DNS 輪詢調度(round-robin)功能就非常實用。

version: "3.3"services:
  wordpress:
    image: wordpress
    ports:
      - 8080:80    networks:
      - overlay    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: vip

  mysql:
    image: mysql
    volumes:
       - db-data:/var/lib/mysql/data    networks:
       - overlay    deploy:
      mode: replicated
      replicas: 2
      endpoint_mode: dnsrr

volumes:
  db-data:

networks:
  overlay:123456789101112131415161718192021222324252627282930

相關信息:Swarm 模式 CLI 命令 、Configure 服務發現

2.labels

指定服務的標籤,這些標籤僅在服務上設置。

version: "3"services:
  web:
    image: web
    deploy:
      labels:        com.example.description: "This label will appear on the web service"12345678

通過將 deploy 外面的 labels 標籤來設置容器上的 labels

version: "3"services:
  web:
    image: web
    labels:      com.example.description: "This label will appear on all containers for the web service"1234567

3.mode

  • global:每個集節點只有一個容器

  • replicated:指定容器數量(默認)

version: '3'services:
  worker:
    image: dockersamples/examplevotingapp_worker
    deploy:
      mode: global123456

4. placement

指定 constraints 和 preferences

version: '3'services:
  db:
    image: postgres
    deploy:
      placement:
        constraints:
          - node.role == manager
          - engine.labels.operatingsystem == ubuntu 14.04
        preferences:
          - spread: node.labels.zone1234567891011

5.replicas

如果服務是 replicated(默認),需要指定運行的容器數量

version: '3'
services:
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend      - backend    deploy:
      mode: replicated
      replicas: 612345678910

6. resources

配置資源限制

version: '3'services:
  redis:    image: redis:alpine
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M123456789101112

此例子中,redis 服務限制使用不超過 50M 的內存和 0.50(50%)可用處理時間(CPU),並且 保留 20M 了內存和 0.25 CPU時間

7. restart_policy

配置容器的重新啓動,代替 restart

  • condition:值可以爲 none 、on-failure 以及 any(默認)

  • delay: 嘗試重啓的等待時間,默認爲 0

  • max_attempts:在放棄之前嘗試重新啓動容器次數(默認:從不放棄)。如果重新啓動在配置中沒有成功 window,則此嘗試不計入配置max_attempts 值。例如,如果 max_attempts 值爲 2,並且第一次嘗試重新啓動失敗,則可能會嘗試重新啓動兩次以上。

  • windows:在決定重新啓動是否成功之前的等時間,指定爲持續時間(默認值:立即決定)。

version: "3"services:
  redis:
    image: redis:alpine
    deploy:
      restart_policy:
        condition: on-failure        delay: 5s
        max_attempts: 3
        window: 120s12345678910

8. update_config

配置更新服務,用於無縫更新應用(rolling update)

  • parallelism:一次性更新的容器數量

  • delay:更新一組容器之間的等待時間。

  • failure_action:如果更新失敗,可以執行的的是 continuerollback 或 pause (默認)

  • monitor:每次任務更新後監視失敗的時間(ns|us|ms|s|m|h)(默認爲0)

  • max_failure_ratio:在更新期間能接受的失敗率

  • order:更新次序設置,top-first(舊的任務在開始新任務之前停止)、start-first(新的任務首先啓動,並且正在運行的任務短暫重疊)(默認 stop-first

version: '3.4'services:
  vote:
    image: dockersamples/examplevotingapp_vote:before
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
        order: stop-first12345678910111213

不支持 Docker stack desploy 的幾個子選項 
build、cgroup_parent、container_name、devices、tmpfs、external_links、inks、network_mode、restart、security_opt、stop_signal、sysctls、userns_mode

16. devices

設置映射列表,與 Docker 客戶端的 --device 參數類似 :

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"12

17. depends_on

此選項解決了啓動順序的問題

在使用 Compose 時,最大的好處就是少打啓動命令,但是一般項目容器啓動的順序是有要求的,如果直接從上到下啓動容器,必然會因爲容器依賴問題而啓動失敗。例如在沒啓動數據庫容器的時候啓動了應用容器,這時候應用容器會因爲找不到數據庫而退出,爲了避免這種情況我們需要加入一個標籤,就是 depends_on,這個標籤解決了容器的依賴、啓動先後的問題。

指定服務之間的依賴關係,有兩種效果

  • docker-compose up 以依賴順序啓動服務,下面例子中 redis 和 db 服務在 web 啓動前啓動

  • docker-compose up SERVICE 自動包含 SERVICE 的依賴性,下面例子中,例如下面容器會先啓動 redis 和 db 
    兩個服務,最後才啓動 web 服務:

version: '3'
services:
  web:
    build: .
    depends_on:
      - db      - redis  redis:
    image: redis
  db:
    image: postgres1234567891011

注意的是,默認情況下使用 docker-compose up web 這樣的方式啓動 web 服務時,也會啓動 redis 和 db 兩個服務,因爲在配置文件中定義了依賴關係

18. dns

自定義 DNS 服務器,與 --dns 具有一樣的用途,可以是單個值或列表

dns: 8.8.8.8
dns:
  - 8.8.8.8  - 9.9.9.91234

19. dns_search

自定義 DNS 搜索域,可以是單個值或列表

dns_search: example.comdns_search:
  - dc1.example.com
  - dc2.example.com12345

20. tmpfs

掛載臨時文件目錄到容器內部,與 run 的參數一樣效果,可以是單個值或列表

tmpfs: /run
tmpfs:
  - /run  - /tmp1234

21. entrypoint

在 Dockerfile 中有一個指令叫做 ENTRYPOINT 指令,用於指定接入點。在 docker-compose.yml 中可以定義接入點,覆蓋 Dockerfile 中的定義:

entrypoint: /code/entrypoint.sh1

entrypoint 也可以是一個列表,方法類似於 dockerfile

entrypoint:
    - php    - -d    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so    - -d    - memory_limit=-1    - vendor/bin/phpunit1234567

21. env_file

從文件中添加環境變量。可以是單個值或是列表 
如果已經用 docker-compose -f FILE 指定了 Compose 文件,那麼 env_file 路徑值爲相對於該文件所在的目錄

但 environment 環境中的設置的變量會會覆蓋這些值,無論這些值未定義還是爲 None

env_file: .env1

或者根據 docker-compose.yml 設置多個:

env_file:
  - ./common.env  - ./apps/web.env  - /opt/secrets.env1234

環境配置文件 env_file 中的聲明每行都是以 VAR=VAL 格式,其中以 # 開頭的被解析爲註釋而被忽略

注意環境變量配置列表的順序*,例如下面例子

docker_compose.yml

services:
  some-service:
    env_file:
      - a.env      - b.env12345

a.env 文件

# a.envVAR=112

b.env文件

對於在文件a.env 中指定的相同變量但在文件 b.env 中分配了不同的值,如果 b.env 像下面列在 a.env 之後,則剛在 a.env 設置的值被 b.env 相同變量的值覆蓋,此時 $VAR 值爲 hello。此外,這裏所說的環境變量是對宿主機的 Compose 而言的,如果在配置文件中有 build 操作,這些變量並不會進入構建過程中,如果要在構建中使用變量還是首選 arg 標籤

22. environment

添加環境變量,可以使用數組或字典。與上面的 env_file 選項完全不同,反而和 arg 有幾分類似,這個標籤的作用是設置鏡像變量,它可以保存變量到鏡像裏面,也就是說啓動的容器也會包含這些變量設置,這是與 arg 最大的不同。 
一般 arg 標籤的變量僅用在構建過程中。而 environment 和 Dockerfile 中的 ENV 指令一樣會把變量一直保存在鏡像、容器中,類似 docker run -e 的效果

environment:
  RACK_ENV: development
  SHOW: 'true'
  SESSION_SECRET:1234

environment:
  - RACK_ENV=development  - SHOW=true  - SESSION_SECRET1234

23. expose

暴露端口,但不映射到宿主機,只被連接的服務訪問。這個標籤與 Dockerfile 中的 EXPOSE 指令一樣,用於指定暴露的端口,但是隻是作爲一種參考,實際上 docker-compose.yml 的端口映射還得 ports 這樣的標籤

expose:
 - "3000" - "8000"123

24. external_links

鏈接到 docker-compose.yml 外部的容器,甚至 並非 Compose 項目文件管理的容器。參數格式跟 links 類似

在使用Docker過程中,會有許多單獨使用 docker run 啓動的容器的情況,爲了使 Compose 能夠連接這些不在docker-compose.yml 配置文件中定義的容器,那麼就需要一個特殊的標籤,就是 external_links,它可以讓Compose 項目裏面的容器連接到那些項目配置外部的容器(前提是外部容器中必須至少有一個容器是連接到與項目內的服務的同一個網絡裏面)。

格式如下

external_links:
 - redis_1 - project_db_1:mysql - project_db_1:postgresql12345

25. extra_hosts

添加主機名的標籤,就是往 /etc/hosts 文件中添加一些記錄,與 Docker 客戶端 中的 --add-host 類似:

extra_hosts:
 - "somehost:162.242.195.82" - "otherhost:50.31.209.229"123

具有 IP 地址和主機名的條目在 /etc/hosts 內部容器中創建。啓動之後查看容器內部 hosts ,例如:

162.242.195.82  somehost
50.31.209.229   otherhost12

26.healthcheck

用於檢查測試服務使用的容器是否正常

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s123456

intervaltimeout 以及 start_period 都定爲持續時間

test 必須是字符串或列表,如果它是一個列表,第一項必須是 NONECMD 或 CMD-SHELL ;如果它是一個字符串,則相當於指定CMD-SHELL 後跟該字符串。

# Hit the local web apptest: ["CMD", "curl", "-f", "http://localhost"]# As above, but wrapped in /bin/sh. Both forms below are equivalent.test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
test: curl -f https://localhost || exit 1123456

如果需要禁用鏡像的所有檢查項目,可以使用 disable:true,相當於 test:["NONE"]

healthcheck:
  disable: true12

27. image

從指定的鏡像中啓動容器,可以是存儲倉庫、標籤以及鏡像 ID

image: redisimage: ubuntu:14.04image: tutum/influxdbimage: example-registry.com:4000/postgresqlimage: a4bc65fd123456

如果鏡像不存在,Compose 會自動拉去鏡像

28. isolation

Linux 上僅僅支持 default 值

29. labels

使用 Docker 標籤將元數據添加到容器,可以使用數組或字典。與 Dockerfile 中的 LABELS 類似:

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"123456789

30.links

鏈接到其它服務的中的容器,可以指定服務名稱也可以指定鏈接別名(SERVICE:ALIAS),與 Docker 客戶端的 --link 有一樣效果,會連接到其它服務中的容器

web:
  links:
   - db   - db:database   - redis123456

使用的別名將會自動在服務容器中的 /etc/hosts 裏創建。例如:

172.12.2.186  db
172.12.2.186  database
172.12.2.187  redis1234

相應的環境變量也將被創建

31. logging

配置日誌服務

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"12345

該 driver值是指定服務器的日誌記錄驅動程序,默認值爲 json-file,與 --log-diver 選項一樣

driver: "json-file"driver: "syslog"driver: "none"123

注意:只有驅動程序 json-file 和 journald 驅動程序可以直接從 docker-compose up 和 docker-compose logs 獲取日誌。使用任何其他方式不會顯示任何日誌。

對於可選值,可以使用 options 指定日誌記錄中的日誌記錄選項

driver: "syslog"options:
  syslog-address: "tcp://192.168.0.42:123"123

默認驅動程序 json-file 具有限制存儲日誌量的選項,所以,使用鍵值對來獲得最大存儲大小以及最小存儲數量

options:  max-size: "200k"
  max-file: "10"123

上面實例將存儲日誌文件,直到它們達到max-size:200kB,存儲的單個日誌文件的數量由該 max-file 值指定。隨着日誌增長超出最大限制,舊日誌文件將被刪除以存儲新日誌

docker-compose.yml 限制日誌存儲的示例

services:
  some-service:
    image: some-service
    logging:
      driver: "json-file"
      options:        max-size: "200k"
        max-file: "10"12345678

32. network_mode

網絡模式,用法類似於 Docke 客戶端的 --net 選項,格式爲:service:[service name]

network_mode: "bridge"network_mode: "host"network_mode: "none"network_mode: "service:[service name]"network_mode: "container:[container name/id]"12345

可以指定使用服務或者容器的網絡

33. networks

加入指定網絡

services:
  some-service:
    networks:
     - some-network     - other-network12345

34. aliases

同一網絡上的其他容器可以使用服務器名稱或別名來連接到其他服務的容器

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1         - alias3      other-network:
        aliases:
         - alias212345678910

下面實例中,提供 web 、worker以及db 服務,伴隨着兩個網絡 new 和 legacy 。

version: '2'services:
  web:
    build: ./web
    networks:
      - new
  worker:
    build: ./worker
    networks:
      - legacy
  db:
    image: mysql
    networks:
      new:
        aliases:
          - database      legacy:
        aliases:
          - mysqlnetworks:
  new:
  legacy:1234567891011121314151617181920212223242526

相同的服務可以在不同的網絡有不同的別名

35. ipv4_address、ipv6_address

爲服務的容器指定一個靜態 IP 地址

version: '2.1'services:
  app:
    image: busybox
    command: ifconfig
    networks:
      app_net:
        ipv4_address: 172.16.238.10
        ipv6_address: 2001:3984:3989::10

networks:
  app_net:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
      -        subnet: 172.16.238.0/24
      -        subnet: 2001:3984:3989::/6412345678910111213141516171819202122

36. PID

pid: "host"1

將 PID 模式設置爲主機 PID 模式,可以打開容器與主機操作系統之間的共享 PID 地址空間。使用此標誌啓動的容器可以訪問和操作宿主機的其他容器,反之亦然。

37. ports

映射端口

1. SHORT 語法

可以使用 HOST:CONTAINER 的方式指定端口,也可以指定容器端口(選擇臨時主機端口),宿主機會隨機映射端口

ports:
 - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010" - "6060:6060/udp"123456789

注意:當使用 HOST:CONTAINER 格式來映射端口時,如果使用的容器端口小於 60 可能會得到錯誤得結果,因爲YAML將會解析 xx:yy 這種數字格式爲 60 進制,所以建議採用字符串格式。

2. LONG 語法

LONG 語法支持 SHORT 語法不支持的附加字段

  • target:容器內的端口

  • published:公開的端口

  • protocol: 端口協議(tcp 或 udp

  • mode:通過host 用在每個節點還是哪個發佈的主機端口或使用 ingress 用於集羣模式端口進行平衡負載,

ports:
  - target: 80    published: 8080
    protocol: tcp
    mode: host123456

38. secrets

通過 secrets爲每個服務授予相應的訪問權限

1. SHORT 語法

version: "3.1"services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    secrets:
      - my_secret
      - my_other_secretsecrets:
  my_secret:
    file: ./my_secret.txt
  my_other_secret:
    external: true1234567891011121314

2.. LONG 語法

LONG 語法可以添加其他選項

  • source:secret 名稱

  • target:在服務任務容器中需要裝載在 /run/secrets/ 中的文件名稱,如果 source 未定義,那麼默認爲此值

  • uid&gid:在服務的任務容器中擁有該文件的 UID 或 GID 。如果未指定,兩者都默認爲 0。

  • mode:以八進制表示法將文件裝載到服務的任務容器中 /run/secrets/ 的權限。例如,0444 代表可讀。

version: "3.1"services:
  redis:
    image: redis:latest
    deploy:
      replicas: 1
    secrets:
      - source: my_secret
        target: redis_secret
        uid: '103'
        gid: '103'
        mode: 0440secrets:
  my_secret:    file: ./my_secret.txt
  my_other_secret:
    external: true1234567891011121314151617

39. security_opt

爲每個容器覆蓋默認的標籤。簡單說來就是管理全部服務的標籤,比如設置全部服務的 user 標籤值爲 USER

security_opt:  - label:user:USER
  - label:role:ROLE123

40. stop_grace_period

在發送 SIGKILL 之前指定 stop_signal ,如果試圖停止容器(如果它沒有處理 SIGTERM(或指定的任何停止信號)),則需要等待的時間

stop_grace_period: 1sstop_grace_period: 1m30s12

默認情況下,stop 在發送SIGKILL之前等待10秒鐘容器退出

41. stop_signal

設置另一個信號來停止容器。在默認情況下使用的 SIGTERM 來停止容器。設置另一個信號可以使用 stop_signal標籤:

stop_signal: SIGUSR11

42. sysctls

在容器中設置的內核參數,可以爲數組或字典

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=01234567

43. ulimits

覆蓋容器的默認限制,可以單一地將限制值設爲一個整數,也可以將soft/hard 限制指定爲映射

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 4000012345

44. userns_mode

userns_mode: "host"1

45. volumes

掛載一個目錄或者一個已存在的數據卷容器,可以直接使用 HOST:CONTAINER 這樣的格式,或者使用 HOST:CONTAINER:ro 這樣的格式,後者對於容器來說,數據卷是隻讀的,這樣可以有效保護宿主機的文件系統

version: "3.2"
services:
  web:
    image: nginx:alpine
    volumes:
      - type: volume        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind        source: ./static
        target: /opt/app/static

  db:
    image: postgres:latest
    volumes:
      - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"      - "dbdata:/var/lib/postgresql/data"volumes:
  mydata:
  dbdata:1234567891011121314151617181920212223

Compose 的數據卷指定路徑可以是相對路徑,使用 . 或者 .. 來指定相對目錄。

數據卷的格式可以是下面多種形式:

volumes:
  # 只是指定一個路徑,Docker 會自動在創建一個數據卷(這個路徑是容器內部的)。
  - /var/lib/mysql
  # 使用絕對路徑掛載數據卷
  - /opt/data:/var/lib/mysql
  # 以 Compose 配置文件爲中心的相對路徑作爲數據卷掛載到容器。
  - ./cache:/tmp/cache
  # 使用用戶的相對路徑(~/ 表示的目錄是 /home/<用戶目錄>/ 或者 /root/)。
  - ~/configs:/etc/configs/:ro
  # 已經存在的命名的數據卷。
  - datavolume:/var/lib/mysql123456789101112131415

如果你不使用宿主機的路徑,可以指定一個 volume_driver

volume_driver: mydriver12

1. SHORT 語法

可以選擇在主機(HOST:CONTAINER)或訪問模式(HOST:CONTAINER:ro)上指定路徑。

可以在主機上掛載相對路徑,該路徑相對於正在使用的 Compose 配置文件的目錄進行擴展。相對路徑應始終以 . 或 .. 開頭

volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql
  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql
  # Path on the host, relative to the Compose file
  - ./cache:/tmp/cache
  # User-relative path
  - ~/configs:/etc/configs/:ro
  # Named volume
  - datavolume:/var/lib/mysql123456789101112131415

2. LONG 語法

LONG 語法有些附加字段

  • type:安裝類型,可以爲 volumebind 或 tmpfs

  • source:安裝源,主機上用於綁定安裝的路徑或定義在頂級 volumes密鑰中卷的名稱 ,不適用於 tmpfs 類型安裝。

  • target:卷安裝在容器中的路徑

  • read_only:標誌將卷設置爲只讀

  • bind:配置額外的綁定選項

  • propagation:用於綁定的傳播模式

  • volume:配置額外的音量選項

  • nocopy:創建卷時禁止從容器複製數據的標誌

  • tmpfs:配置額外的 tmpfs 選項

  • size:tmpfs 的大小,以字節爲單位

version: "3.2"services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - type: volume
        source: mydata
        target: /data
        volume:
          nocopy: true
      - type: bind
        source: ./static
        target: /opt/app/staticnetworks:
  webnet:

volumes:
  mydata:123456789101112131415161718192021

46. volumes_from

從其它容器或者服務掛載數據卷,可選的參數是 :ro 或 :rw,前者表示容器只讀,後者表示容器對數據卷是可讀可寫的(默認情況爲可讀可寫的)。

volumes_from:
  - service_name  - service_name:ro  - container:container_name  - container:container_name:rw12345

47. 用於服務、羣集以及堆棧文件的卷

在使用服務,羣集和 docker-stack.yml 文件時,請記住支持服務的任務(容器)可以部署在羣集中的任何節點上,並且每次更新服務時都可能是不同的節點。

在缺少指定源的命名卷的情況下,Docker 爲支持服務的每個任務創建一個匿名卷。關聯的容器被移除後,匿名卷不會保留。

如果希望數據持久存在,請使用可識別多主機的命名卷和卷驅動程序,以便可以從任何節點訪問數據。或者,對該服務設置約束,以便將其任務部署在具有該卷的節點上。

下面一個例子,Docker Labs 中 votingapp 示例的 docker-stack.yml文件中定義了一個稱爲 db 的服務。它被配置爲一個命名捲來保存羣體上的數據, 並且僅限於在節點上運行。下面是來自該文件的部分內容:db postgres manager

version: "3"
services:
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data    networks:
      - backend    deploy:
      placement:
        constraints: [node.role == manager]1234567891011

48. restart

默認值爲 no ,即在任何情況下都不會重新啓動容器;當值爲 always 時,容器總是重新啓動;當值爲 on-failure 時,當出現 on-failure 報錯容器退出時,容器重新啓動。

restart: "no"restart: alwaysrestart: on-failurerestart: unless-stopped1234

49. 其他選項

關於標籤:cpu_shares、cpu_quota、 cpuse、domainname、hostname、 ipc、 mac_address、privileged、 read_only、 shm_size、stdin_open、tty、 user、 working_dir

上面這些都是一個單值的標籤,類似於使用 docker run 的效果

cpu_shares: 73cpu_quota: 50000cpuset: 0,1user: postgresqlworking_dir: /codedomainname: foo.comhostname: fooipc: hostmac_address: 02:42:ac:11:65:43privileged: trueread_only: trueshm_size: 64Mstdin_open: truetty: true12345678910111213141516171819

50. 持續時間

某些配置選項如 check 的子選項interval以及timeout 的設置格式

2.5s
10s
1m30s
2h32m
5h34m56s12345

支持的單位有 usmssm 以及 h

51. 指定字節值

某些選項如 bulid 的子選項 shm_size

2b
1024kb
2048k
300m
1gb12345

支持的單位是 bkm 以及 g,或 kb, mb 和 gb。目前不支持十進制值

52. extends

這個標籤可以擴展另一個服務,擴展內容可以是來自在當前文件,也可以是來自其他文件,相同服務的情況下,後來者會有選擇地覆蓋原有配置

extends:
  file: common.yml
  service: webapp123

用戶可以在任何地方使用這個標籤,只要標籤內容包含 file 和 service 兩個值就可以了。file 的值可以是相對或者絕對路徑,如果不指定 file 的值,那麼 Compose 會讀取當前 YML 文件的信息。

詳細的文檔可以查看官方文檔:撰寫 docker-compose.yml 文件參考 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章