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:如果更新失敗,可以執行的的是
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-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
interval
,timeout
以及 start_period
都定爲持續時間
test
必須是字符串或列表,如果它是一個列表,第一項必須是 NONE
,CMD
或 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:安裝類型,可以爲
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/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
支持的單位有 us
、ms
、s
、m
以及 h
51. 指定字節值
某些選項如 bulid
的子選項 shm_size
2b 1024kb 2048k 300m 1gb12345
支持的單位是 b
,k
,m
以及 g
,或 kb
, mb
和 gb
。目前不支持十進制值
52. extends
這個標籤可以擴展另一個服務,擴展內容可以是來自在當前文件,也可以是來自其他文件,相同服務的情況下,後來者會有選擇地覆蓋原有配置
extends: file: common.yml service: webapp123
用戶可以在任何地方使用這個標籤,只要標籤內容包含 file
和 service
兩個值就可以了。file
的值可以是相對或者絕對路徑,如果不指定 file
的值,那麼 Compose 會讀取當前 YML 文件的信息。
詳細的文檔可以查看官方文檔:撰寫 docker-compose.yml 文件參考