文章目錄
說在前面:
本文是基於version 3
devices
指定設備映射列表 (等同於 docker run --device 的作用)
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
dns
自定義DNS服務器。可以是單個值或列表。(等同於 docker run --dns 的作用)
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
dns_search
設置 DNS 搜索域(等同於 docker run --dns-search 的作用)
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
entrypoint
覆蓋容器的默認 entrypoint 指令 (等同於 docker run --entrypoint 的作用)
entrypoint: /code/entrypoint.sh
入口點也可以是列表,類似於 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
注意
:設置entrypoint兩者都會覆蓋使用ENTRYPOINT , Dockerfile指令在服務映像上設置的任何默認入口點,並清除鏡像上的任何默認命令-這意味着如果CMD Dockerfile中有指令,則將其忽略。
env_file
從文件添加環境變量。可以是單個值或列表。
如果您使用指定了Compose文件docker-compose -f FILE,則in env_file的路徑 相對於該文件所在的目錄。
如果多個文件中的變量重名則後面的變量覆蓋前面的變量, environment 的值覆蓋 env_file 的值
Compose環境文件中的每一行都採用VAR=VAL格式。以開頭的行#被視爲註釋,並被忽略。空行也將被忽略。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
environment
添加環境變量。您可以使用數組或字典。任何布爾值(true,false,yes,no)都需要用引號引起來,以確保YML解析器不會將其轉換爲True或False。
environment 的值可以覆蓋 env_file 的值 (等同於 docker run --env 的作用)。
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
expose
公開端口而不將其發佈到主機上-只有鏈接的服務才能訪問它們。只能指定內部端口。
expose:
- "3000"
- "8000"
external_links
連接不在 docker-compose.yml 中定義的容器或者不在 compose 管理的容器(docker run 啓動的容器, 在 v3 版本中使用 swarm 部署時將忽略該選項)
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
extra_hosts
添加 host 記錄到容器中的 /etc/hosts 中 (等同於 docker run --add-host 的作用)
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
在/etc/hosts此服務的內部容器中創建一個具有ip地址和主機名的條目,例如:
162.242.195.82 somehost
50.31.209.229 otherhost
healthcheck
v2.1 以上版本, 定義容器健康狀態檢查, 類似於 Dockerfile 的 HEALTHCHECK 指令
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
test
檢查容器檢查狀態的命令, 該選項必須是一個字符串或者列表, 第一項必須是 NONE, CMD 或 CMD-SHELL, 如果其是一個字符串則相當於 CMD-SHELL 加該字符串
- NONE 禁用容器的健康狀態檢測
- CMD test: [“CMD”, “curl”, “-f”, “http://localhost”]
- CMD-SHELL test: [“CMD-SHELL”, “curl -f http://localhost || exit 1”] 或者 test: curl -f https://localhost || exit 1
interval:
每次檢查之間的間隔時間
timeout:
運行命令的超時時間
retries:
重試次數
start_period:
v3.4 以上新增的選項, 定義容器啓動時間間隔
disable:
true 或 false, 表示是否禁用健康狀態檢測和 test: NONE 相同
image
指定用於啓動容器的鏡像。可以是存儲庫/標籤或本地鏡像ID。
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
如果鏡像不存在,除非指定了build,否則Compose會嘗試拉取它,在這種情況下,它將使用指定的選項來構建它並使用指定的標籤對其進行標記。
init
注
:v3.7新增參數
true 或 false 表示是否在容器中運行一個 init, 它接收信號並傳遞給進程
version: "3.7"
services:
web:
image: alpine:latest
init: true
使用的默認初始化二進制文件是Tini,並安裝在/usr/libexec/docker-init守護程序主機上。您可以通過init-path配置選項將守護程序配置爲使用自定義init二進制文件 。
isolation
指定容器的隔離技術。在Linux上,唯一支持的值是default。在Windows中,可接受的值是default,process和 hyperv。
labels
使用Docker標籤將元數據添加到容器中。您可以使用數組或字典。
建議您使用反向DNS表示法,以防止標籤與其他軟件使用的標籤衝突。
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"
links
警告:該--link是Docker的舊功能。它最終可能會被刪除。除非絕對需要繼續使用它,否則建議使用用戶定義的網絡 來促進兩個容器之間的通信,而不要使用--link。用戶定義的網絡不支持的一項功能 --link是在容器之間共享環境變量。但是,可以使用其他機制(例如卷)以更可控的方式在容器之間共享環境變量。
鏈接到另一個服務中的容器。指定服務名稱和鏈接別名(SERVICE:ALIAS),或者僅指定服務名稱
鏈接也以與depends_on相同的方式表示服務之間的依賴關係 ,因此它們確定了服務啓動的順序。
在使用 swarm 部署時將忽略該選項
web:
links:
- db
- db:database
- redis
如果同時定義鏈接和網絡,則它們之間具有鏈接的服務必須共享至少一個公共網絡才能進行通信。
logging
服務的日誌記錄配置。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
driver
指定日誌記錄驅動程序, 默認 json-file (等同於 docker run --log-driver 的作用)
默認值爲json-file。
--og-driverdocker run
選項,請參考https://docs.docker.com/config/containers/logging/configure/
注意
:只有json-file和journald驅動程序才能從docker-compose up和直接提供日誌docker-compose logs。使用任何其他驅動程序不會打印任何日誌。
options
默認驅動程序json-file,具有用於限制存儲的日誌量的選項。爲此,請使用鍵值對以獲取最大存儲大小和最大文件數:
max-size:
設置單個日誌文件的大小, 當到達這個值後會進行日誌滾動操作
max-file:
日誌文件保留的數量
這是一個docker-compose.yml限制日誌存儲的示例文件:
version: "3.7"
services:
some-service:
image: some-service
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
network_mode
指定網絡模式 (等同於 docker run --net 的作用, 在使用 swarm 部署時將忽略該選項)
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
注
:network_mode: "host"不能與鏈接混合使用
networks
將容器加入指定網絡 (等同於 docker network connect 的作用), networks 可以位於 compose 文件頂級鍵和 services 鍵的二級鍵
aliase
同一網絡上的容器可以使用服務名稱或別名連接到其中一個服務的容器
在下面的例子中,提供了三種服務(web,worker,和db),其中兩個網絡(new和legacy)。db服務是在可到達的主機名db或database連上new網絡,並且db或mysql將連上legacy網絡。
version: "3.7"
services:
web:
image: "nginx:alpine"
networks:
- new
worker:
image: "my-worker-image:latest"
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:
ipv4_adress,ipv6_adress
加入網絡後,爲此服務的容器指定一個靜態IP地址。
頂級網絡部分中的相應網絡配置 必須具有一個 ipam塊,其中子網配置覆蓋每個靜態地址。
version: "3.7"
services:
app:
image: nginx:alpine
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "2001:3984:3989::/64"
pid
將PID模式設置爲主機PID模式。這將打開容器和主機操作系統之間的PID地址空間共享。
pid: "host"
ports
建立宿主機和容器之間的端口映射關係, ports 支持兩種語法格式
短語法
要麼指定兩個端口(HOST:CONTAINER),要麼僅指定容器端口(選擇了臨時主機端口)。
注意
:以這種HOST:CONTAINER格式映射端口時,使用低於60的容器端口可能會遇到錯誤的結果,因爲YAML會將格式xx:yy中的數字解析爲以60爲底的值。因此,我們建議始終將端口映射顯式指定爲字符串。
# 暴露容器的 3000 端口, 宿主機的端口由 docker 隨機映射一個沒有被佔用的端口
-"3000"
# 暴露容器的 3000 到 3005 端口, 宿主機的端口由 docker 隨機映射沒有被佔用的端口
- "3000-3005"
# 容器的 8000 端口和宿主機的 8000 端口建立映射關係
- "8000:8000"
- "9090-9091:8080-8081"
# 指定映射宿主機的指定地址的
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
# 指定協議
- "6060:6060/udp"
長語法
長格式語法允許配置其他不能以短格式表示的字段。
注意
:長語法是v3.2中的新增功能
- arget:容器內的端口
- published:公開端口
- protocol:端口協議(tcp或udp)
- mode:host用於在每個節點上發佈主機端口,或ingress使羣集模式端口達到負載平衡。
ports:
- target: 80
published: 8080
protocol: tcp
mode: host
restart
no是默認的重啓策略,在任何情況下都不會重啓容器。當always指定時,容器總是重新啓動。該 on-failure如果退出代碼指示的故障錯誤政策重啓的容器。
注意
:在v3版本文件以羣集模式部署堆棧時,將忽略此選項 。請改用restart_policy。
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
secrets
不懂
security_opt
爲每個容器覆蓋默認的標籤 (在使用 swarm 部署時將忽略該選項)
security_opt:
- label:user:USER
- label:role:ROLE
stop_grace_period
指定在發送了 SIGTERM 信號之後, 容器等待多少秒之後退出(默認 10s)
stop_grace_period: 1s
stop_grace_period: 1m30s
stop_signal
指定停止容器發送的信號 (默認爲 SIGTERM 相當於 kill PID; SIGKILL 相當於 kill -9 PID; 在使用 swarm 部署時將忽略該選項)
sysctls
設置容器中的內核參數 (在使用 swarm 部署時將忽略該選項)
此選項需要Docker Engine 19.03或更高 版本。
可以使用數組或字典。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
tmpfs
注
:v2版本文件格式及更高版本。
在容器內安裝一個臨時文件系統。可以是單個值或列表。
tmpfs: /run
tmpfs:
- /run
- /tmp
注
:v3.6版文件格式及更高版本。
在容器內安裝一個臨時文件系統。Size參數指定tmpfs安裝的大小(以字節爲單位)。默認情況下不受限制。
- type: tmpfs
target: /app
tmpfs:
size: 1000
ulimits
覆蓋容器的默認ulimit。可以將單個限制指定爲整數,也可以將軟/硬限制指定爲映射。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000