1. 程式人生 > >docker-compose.yml 配置檔案詳解及專案釋出

docker-compose.yml 配置檔案詳解及專案釋出

一. 前言
關於 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:

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

檔案配置
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/dir
也可以是相對路徑
build: ./dir
設定上下文根目錄,然後以該目錄為準指定 Dockerfile

build:
context: ../
dockerfile: path/of/Dockerfile
例子

version: '3'
services:
webapp:
build: ./dir
如果 context 中有指定的路徑,並且可以選定 Dockerfile 和 args。那麼 arg 這個標籤,就像 Dockerfile 中的 ARG 指令,它可以在構建過程中指定環境變數,但是在構建成功後取消,在 docker-compose.yml 檔案中也支援這樣的寫法:

version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
與 ENV 不同的是,ARG 可以為空值

args:
- buildno
- password
如果要指定 image 以及 build ,選項格式為

build: ./dir
image: webapp:tag
這會在 ./dir 目錄生成一個名為 webaapp 和標記為 tag 的映象

Note:當用(Version 3) Compose 檔案在群集模式下部署堆疊時,該選項被忽略。因為 docker stack 命令只接受預先構建的映象

2. context
context 選項可以是 Dockerfile 的檔案路徑,也可以是到連結到 git 倉庫的 url

當提供的值是相對路徑時,它被解析為相對於撰寫檔案的路徑,此目錄也是傳送到 Docker 守護程序的 context

build:
context: ./dir
3. dockerfile
使用此 dockerfile 檔案來構建,必須指定構建路徑

build:
context: .
dockerfile: Dockerfile-alternate
4. args
新增構建引數,這些引數是僅在構建過程中可訪問的環境變數

首先, 在Dockerfile中指定引數:

ARG buildno
ARG password

RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
然後指定 build 下的引數,可以傳遞對映或列表

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

build:
context: .
args:
- buildno=1
- password=secret
指定構建引數時可以省略該值,在這種情況下,構建時的值預設構成執行環境中的值

args:
- buildno
- password
Note: YAML 布林值(true,false,yes,no,on,off)必須使用引號括起來,以為了能夠正常被解析為字串

5. cache_from
編寫快取解析映象列表

build:
context: .
cache_from:
- alpine:latest
- corp/web_app:3.14
6. labels
使用 Docker標籤 將元資料新增到生成的映象中,可以使用陣列或字典。

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

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

build:
context: .
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
7.shm_size
設定容器 /dev/shm 分割槽的大小,值為表示位元組的整數值或表示字元的字串

build:
context: .
shm_size: '2gb'

build:
context: .
shm_size: 10000000
8. target
根據對應的 Dockerfile 構建指定 Stage

build:
context: .
target: prod
9. cap_add、cap_drop
新增或刪除容器功能,可檢視 man 7 capabilities

cap_add:
- ALL

cap_drop:
- NET_ADMIN
- SYS_ADMIN
Note:當用(Version 3) Compose 檔案在群集模式下部署堆疊時,該選項被忽略。因為 docker stack 命令只接受預先構建的映象

10. command
覆蓋容器啟動後預設執行的命令
command: bundle exec thin -p 3000
該命令也可以是一個列表,方法類似於 dockerfile:
command: ["bundle", "exec", "thin", "-p", "3000"]
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_config
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
以上例項使用 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: 0440
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
可以同時授予多個配置的服務相應的訪問許可權,也可以混合使用 LONG 和 SHORT 語法。定義配置並不意味著授予服務訪問許可權。

12. cgroup_parent
可以為容器選擇一個可選的父 cgroup
cgroup_parent: m-executor-abcd
注意:當 使用(Version 3)Compose 檔案在群集模式下部署堆疊時,忽略此選項

13. container_name
為自定義的容器指定一個名稱,而不是使用預設的名稱

container_name: my-web-container
因為 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.json
使用 registry: 將從守護程序主機上的 Windows 登錄檔中讀取憑據規範。其登錄檔值必須位於:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs
下面的示例通過 my-credential-spec 登錄檔中指定的值載入憑證規範:

credential_spec:
registry: my-credential-spec
15. deploy
指定與部署和執行服務相關的配置

version: '3'
services:
redis:
image: redis:alpine
deploy:
replicas: 6
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
這裡有幾個子選項
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:
相關資訊:Swarm 模式 CLI 命令 、Configure 服務發現

2.labels
指定服務的標籤,這些標籤僅在服務上設定。

version: "3"
services:
web:
image: web
deploy:
labels:
com.example.description: "This label will appear on the web service"
通過將 deploy 外面的 labels 標籤來設定容器上的 labels

version: "3"
services:
web:
image: web
labels:
com.example.description: "This label will appear on all containers for the web service"
3.mode
global:每個集節點只有一個容器
replicated:指定容器數量(預設)
version: '3'
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
mode: global
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.zone
5.replicas
如果服務是 replicated(預設),需要指定執行的容器數量

version: '3'
services:
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 6
6. resources
配置資源限制

version: '3'
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
此例子中,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: 120s
8. update_config
配置更新服務,用於無縫更新應用(rolling update)
delay:更新一組容器之間的等待時間。
failure_action:如果更新失敗,可以執行的的是 continue、rollback 或 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-first
不支援 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"
17. depends_on
此選項解決了啟動順序的問題

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

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

docker-compose up 以依賴順序啟動服務,下面例子中 redis 和 db 服務在 web 啟動前啟動
docker-compose up SERVICE 自動包含 SERVICE 的依賴性,下面例子中,例如下面容器會先啟動 redis 和 db
兩個服務,最後才啟動 web 服務:
version: '3'
services:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意的是,預設情況下使用 docker-compose up web 這樣的方式啟動 web 服務時,也會啟動 redis 和 db 兩個服務,因為在配置檔案中定義了依賴關係

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

dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
19. dns_search
自定義 DNS 搜尋域,可以是單個值或列表

dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
20. tmpfs
掛載臨時檔案目錄到容器內部,與 run 的引數一樣效果,可以是單個值或列表

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

entrypoint: /code/entrypoint.sh
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/phpunit
21. env_file
從檔案中新增環境變數。可以是單個值或是列表
如果已經用 docker-compose -f FILE 指定了 Compose 檔案,那麼 env_file 路徑值為相對於該檔案所在的目錄

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

env_file: .env
或者根據 docker-compose.yml 設定多個:

env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
環境配置檔案 env_file 中的宣告每行都是以 VAR=VAL 格式,其中以 # 開頭的被解析為註釋而被忽略

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

docker_compose.yml

services:
some-service:
env_file:
- a.env
- b.env
a.env 檔案

# a.env
VAR=1
b.env檔案

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

新增環境變數,可以使用陣列或字典。與上面的 env_file 選項完全不同,反而和 arg 有幾分類似,這個標籤的作用是設定映象變數,它可以儲存變數到映象裡面,也就是說啟動的容器也會包含這些變數設定,這是與 arg 最大的不同。
一般 arg 標籤的變數僅用在構建過程中。而 environment 和 Dockerfile 中的 ENV 指令一樣會把變數一直儲存在映象、容器中,類似 docker run -e 的效果
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:

environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
23. expose
暴露埠,但不對映到宿主機,只被連線的服務訪問。這個標籤與 Dockerfile 中的 EXPOSE 指令一樣,用於指定暴露的埠,但是隻是作為一種參考,實際上 docker-compose.yml 的埠對映還得 ports 這樣的標籤

expose:
- "3000"
- "8000"
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:postgresql
25. extra_hosts
新增主機名的標籤,就是往 /etc/hosts 檔案中新增一些記錄,與 Docker 客戶端 中的 --add-host 類似:

extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
具有 IP 地址和主機名的條目在 /etc/hosts 內部容器中建立。啟動之後檢視容器內部 hosts ,例如:

162.242.195.82 somehost
50.31.209.229 otherhost
26.healthcheck
用於檢查測試服務使用的容器是否正常

healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
interval,timeout 以及 start_period 都定為持續時間

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

# Hit the local web app
test: ["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 1
如果需要禁用映象的所有檢查專案,可以使用 disable:true,相當於 test:["NONE"]

healthcheck:
disable: true
27. image
從指定的映象中啟動容器,可以是儲存倉庫、標籤以及映象 ID

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd

如果映象不存在,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"
30.links
連結到其它服務的中的容器,可以指定服務名稱也可以指定連結別名(SERVICE:ALIAS),與 Docker 客戶端的 --link 有一樣效果,會連線到其它服務中的容器

web:
links:
- db
- db:database
- redis
使用的別名將會自動在服務容器中的 /etc/hosts 裡建立。例如:

172.12.2.186 db
172.12.2.186 database
172.12.2.187 redis
相應的環境變數也將被建立

31. logging
配置日誌服務

logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
該 driver值是指定伺服器的日誌記錄驅動程式,預設值為 json-file,與 --log-diver 選項一樣

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

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

driver: "syslog"
options:
syslog-address: "tcp://192.168.0.42:123"
預設驅動程式 json-file 具有限制儲存日誌量的選項,所以,使用鍵值對來獲得最大儲存大小以及最小儲存數量

options:
max-size: "200k"
max-file: "10"
上面例項將儲存日誌檔案,直到它們達到max-size:200kB,儲存的單個日誌檔案的數量由該 max-file 值指定。隨著日誌增長超出最大限制,舊日誌檔案將被刪除以儲存新日誌

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

services:
some-service:
image: some-service
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
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]"
可以指定使用服務或者容器的網路

33. networks
加入指定網路

services:
some-service:
networks:
- some-network
- other-network
34. aliases
同一網路上的其他容器可以使用伺服器名稱或別名來連線到其他服務的容器

services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
下面例項中,提供 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:
- mysql

networks:
new:
legacy:
相同的服務可以在不同的網路有不同的別名

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::/64
36. PID
pid: "host"
將 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"
注意:當使用 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: host
38. secrets
通過 secrets為每個服務授予相應的訪問許可權

1. SHORT 語法
version: "3.1"
services:
redis:
image: redis:latest
deploy:
replicas: 1
secrets:
- my_secret
- my_other_secret
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
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: 0440
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
39. security_opt
為每個容器覆蓋預設的標籤。簡單說來就是管理全部服務的標籤,比如設定全部服務的 user 標籤值為 USER

security_opt:
- label:user:USER
- label:role:ROLE
40. stop_grace_period
在傳送 SIGKILL 之前指定 stop_signal ,如果試圖停止容器(如果它沒有處理 SIGTERM(或指定的任何停止訊號)),則需要等待的時間

stop_grace_period: 1s
stop_grace_period: 1m30s

預設情況下,stop 在傳送SIGKILL之前等待10秒鐘容器退出

41. stop_signal
設定另一個訊號來停止容器。在預設情況下使用的 SIGTERM 來停止容器。設定另一個訊號可以使用 stop_signal 標籤:

stop_signal: SIGUSR1
42. sysctls
在容器中設定的核心引數,可以為陣列或字典

sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0

sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
43. ulimits
覆蓋容器的預設限制,可以單一地將限制值設為一個整數,也可以將soft/hard 限制指定為對映

ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
44. userns_mode
userns_mode: "host"
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:
Compose 的資料卷指定路徑可以是相對路徑,使用 . 或者 .. 來指定相對目錄。

資料卷的格式可以是下面多種形式:

volumes:
# 只是指定一個路徑,Docker 會自動在建立一個數據卷(這個路徑是容器內部的)。
- /var/lib/mysql

# 使用絕對路徑掛載資料卷
- /opt/data:/var/lib/mysql

# 以 Compose 配置檔案為中心的相對路徑作為資料卷掛載到容器。
- ./cache:/tmp/cache

# 使用使用者的相對路徑(~/ 表示的目錄是 /home/<使用者目錄>/ 或者 /root/)。
- ~/configs:/etc/configs/:ro

# 已經存在的命名的資料卷。
- datavolume:/var/lib/mysql
如果你不使用宿主機的路徑,可以指定一個 volume_driver

volume_driver: mydriver
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/mysql
2. LONG 語法
LONG 語法有些附加欄位

type:安裝型別,可以為 volume、bind 或 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/static

networks:
webnet:

volumes:
mydata:
46. volumes_from
從其它容器或者服務掛載資料卷,可選的引數是 :ro 或 :rw,前者表示容器只讀,後者表示容器對資料卷是可讀可寫的(預設情況為可讀可寫的)。

volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
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]
48. restart
預設值為 no ,即在任何情況下都不會重新啟動容器;當值為 always 時,容器總是重新啟動;當值為 on-failure 時,當出現 on-failure 報錯容器退出時,容器重新啟動。
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
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: 73
cpu_quota: 50000
cpuset: 0,1

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
privileged: true

read_only: true
shm_size: 64M
stdin_open: true
tty: true
50. 持續時間
某些配置選項如 check 的子選項interval以及timeout 的設定格式
2.5s
10s
1m30s
2h32m
5h34m56s
支援的單位有 us、ms、s、m 以及 h
51. 指定位元組值
某些選項如 bulid 的子選項 shm_size
2b
1024kb
2048k
300m
1gb
支援的單位是 b,k,m 以及 g,或 kb, mb 和 gb。目前不支援十進位制值

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

extends:
file: common.yml
service: webapp
使用者可以在任何地方使用這個標籤,只要標籤內容包含 file 和 service 兩個值就可以了。file 的值可以是相對或者絕對路徑,如果不指定 file 的值,那麼 Compose 會讀取當前 YML 檔案的資訊。