模闆檔案是使用 Compose docker run
的核心,涉及到的指令關鍵字也比較多。但大家不用擔心,這裡面大部分指令跟
相關參數的含義都是類似的。
預設的模闆檔案名稱為
docker-compose.yml
,格式為 YAML 格式。 version: "3"services: webapp: image: examples/web ports: - "80:80" volumes: - "/data"
注意每個服務都必須通過
image
指令指定鏡像或
build
指令(需要 Dockerfile)等來自動建構生成鏡像。
如果使用
build
指令,在
Dockerfile
中設定的選項(例如:
CMD
,
EXPOSE
VOLUME
ENV
等) 将會自動被擷取,無需在
docker-compose.yml
中重複設定。
下面分别介紹各個指令的用法。
build
build
指定
Dockerfile
所在檔案夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 檔案的路徑)。
Compose
将會利用它自動建構這個鏡像,然後使用這個鏡像。
version: '3'services: webapp: build: ./dir
你也可以使用
context
指令指定
Dockerfile
所在檔案夾的路徑。
使用
dockerfile
Dockerfile
檔案名。
arg
指令指定建構鏡像時的變量。
version: '3'services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
cache_from
指定建構鏡像的緩存
build: context: . cache_from: - alpine:latest - corp/web_app:3.14
cap_add, cap_drop
cap_add, cap_drop
指定容器的核心能力(capacity)配置設定。
例如,讓容器擁有所有能力可以指定為:
cap_add: - ALL
去掉 NET_ADMIN 能力可以指定為:
cap_drop: - NET_ADMIN
command
command
覆寫容器啟動後預設執行的指令。
command: echo "hello world"
configs
configs
僅用于
Swarm mode
,詳細内容請檢視
Swarm mode
一節。
cgroup_parent
cgroup_parent
指定父
cgroup
組,意味着将繼承該組的資源限制。
例如,建立了一個 cgroup 組名稱為
cgroups_1
。
cgroup_parent: cgroups_1
container_name
container_name
指定容器名稱。預設将會使用
項目名稱_服務名稱_序号
這樣的格式。
container_name: docker-web-container
注意: 指定容器名稱後,該服務将無法進行擴充(scale),因為 Docker 不允許多個容器具有相同的名稱。
deploy
deploy
Swarm mode
Swarm mode
一節
devices
devices
指定裝置映射關系。
devices: - "/dev/ttyUSB1:/dev/ttyUSB0"
depends_on
depends_on
解決容器的依賴、啟動先後的問題。以下例子中會先啟動
redis
db
再啟動
web
version: '3'services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
注意:服務不會等待
web
redis
「完全啟動」之後才啟動。
db
dns
dns
自定義
DNS
伺服器。可以是一個值,也可以是一個清單。
dns: 8.8.8.8dns: - 8.8.8.8 - 114.114.114.114
dns_search
dns_search
配置
DNS
搜尋域。可以是一個值,也可以是一個清單。
dns_search: example.comdns_search: - domain1.example.com - domain2.example.com
tmpfs
tmpfs
挂載一個 tmpfs 檔案系統到容器。
tmpfs: /runtmpfs: - /run - /tmp
env_file
env_file
從檔案中擷取環境變量,可以為單獨的檔案路徑或清單。
如果通過
docker-compose -f FILE
方式來指定 Compose 模闆檔案,則
env_file
中變量的路徑會基于模闆檔案路徑。
如果有變量名稱與
environment
指令沖突,則按照慣例,以後者為準。
env_file: .envenv_file: - ./common.env - ./apps/web.env - /opt/secrets.env
環境變量檔案中每一行必須符合格式,支援
#
開頭的注釋行。
# common.env: Set development environmentPROG_ENV=development
environment
environment
設定環境變量。你可以使用數組或字典兩種格式。
隻給定名稱的變量會自動擷取運作 Compose 主機上對應變量的值,可以用來防止洩露不必要的資料。
environment: RACK_ENV: development SESSION_SECRET:environment: - RACK_ENV=development - SESSION_SECRET
如果變量名稱或者值中用到
true|false,yes|no
等表達 布爾 含義的詞彙,最好放到引号裡,避免 YAML 自動解析某些内容為對應的布爾語義。這些特定詞彙,包括
y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF
expose
expose
暴露端口,但不映射到主控端,隻被連接配接的服務通路。
僅可以指定内部端口為參數
expose: - "3000" - "8000"
external_links
external_links
注意:不建議使用該指令。
連結到
docker-compose.yml
外部的容器,甚至并非
Compose
管理的外部容器。
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
extra_hosts
extra_hosts
類似 Docker 中的
--add-host
參數,指定額外的 host 名稱映射資訊。
extra_hosts: - "googledns:8.8.8.8" - "dockerhub:52.1.157.61"
會在啟動後的服務容器中
/etc/hosts
檔案中添加如下兩條條目。
8.8.8.8 googledns52.1.157.61 dockerhub
healthcheck
healthcheck
通過指令檢查容器是否健康運作。
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3
image
image
指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,
Compose
将會嘗試拉取這個鏡像。
image: ubuntuimage: orchardup/postgresqlimage: a4bc65fd
labels
labels
為容器添加 Docker 中繼資料(metadata)資訊。例如可以為容器添加輔助說明資訊。
labels: com.startupteam.description: "webapp for a startup team" com.startupteam.department: "devops department" com.startupteam.release: "rc3 for v1.0"
links
links
注意:不推薦使用該指令。
logging
logging
配置日志選項。
logging: driver: syslog options: syslog-address: "tcp://192.168.0.42:123"
目前支援三種日志驅動類型。
driver: "json-file"driver: "syslog"driver: "none"
options
配置日志驅動的相關參數。
options: max-size: "200k" max-file: "10"
network_mode
network_mode
設定網絡模式。使用和
docker run
的
--network
參數一樣的值。
network_mode: "bridge"network_mode: "host"network_mode: "none"network_mode: "service:[service name]"network_mode: "container:[container name/id]"
networks
networks
配置容器連接配接的網絡。
version: "3"services: some-service: networks: - some-network - other-networknetworks: some-network: other-network:
pid
pid
跟主機系統共享程序命名空間。打開該選項的容器之間,以及容器和主控端系統之間可以通過程序 ID 來互相通路和操作。
pid: "host"
ports
ports
暴露端口資訊。
使用宿主端口:容器端口
(HOST:CONTAINER)
格式,或者僅僅指定容器的端口(宿主将會随機選擇端口)都可以。
ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
注意:當使用 HOST:CONTAINER 格式來映射端口時,如果你使用的容器端口小于 60 并且沒放到引号裡,可能會得到錯誤結果,因為 YAML 會自動解析 xx:yy 這種數字格式為 60 進制。為避免出現這種問題,建議數字串都采用引号包括起來的字元串格式。
secrets
secrets
存儲敏感資料,例如
mysql
服務密碼。
version: "3.1"services:mysql: image: mysql environment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password secrets: - db_root_password - my_other_secretsecrets: my_secret: file: ./my_secret.txt my_other_secret: external: true
security_opt
security_opt
指定容器模闆标簽(label)機制的預設屬性(使用者、角色、類型、級别等)。例如配置标簽的使用者名和角色名。
security_opt: - label:user:USER - label:role:ROLE
stop_signal
stop_signal
設定另一個信号來停止容器。在預設情況下使用的是 SIGTERM 停止容器。
stop_signal: SIGUSR1
sysctls
sysctls
配置容器核心參數。
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
ulimits
ulimits
指定容器的 ulimits 限制值。
例如,指定最大程序數為 65535,指定檔案句柄數為 20000(軟限制,應用可以随時修改,不能超過硬限制) 和 40000(系統硬限制,隻能 root 使用者提高)。
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
volumes
volumes
資料卷所挂載路徑設定。可以設定為主控端路徑(
HOST:CONTAINER
)或者資料卷名稱(
VOLUME:CONTAINER
),并且可以設定通路模式 (
HOST:CONTAINER:ro
)。
該指令中路徑支援相對路徑。
volumes: - /var/lib/mysql - cache/:/tmp/cache - ~/configs:/etc/configs/:ro
如果路徑為資料卷名稱,必須在檔案中配置資料卷。
version: "3"services: my_src: image: mysql:8.0 volumes: - mysql_data:/var/lib/mysqlvolumes: mysql_data:
其它指令
此外,還有包括
domainname, entrypoint, hostname, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir
等指令,基本跟
docker run
中對應參數的功能一緻。
指定服務容器啟動後執行的入口檔案。
entrypoint: /code/entrypoint.sh
指定容器中運作應用的使用者名。
user: nginx
指定容器中工作目錄。
working_dir: /code
指定容器中搜尋域名、主機名、mac 位址等。
domainname: your_website.comhostname: testmac_address: 08-00-27-00-0C-0A
允許容器中運作一些特權指令。
privileged: true
指定容器退出後的重新開機政策為始終重新開機。該指令對保持服務始終運作十分有效,在生産環境中推薦配置為
always
或者
unless-stopped
restart: always
以隻讀模式挂載容器的 root 檔案系統,意味着不能對容器内容進行修改。
read_only: true
打開标準輸入,可以接受外部輸入。
stdin_open: true
模拟一個僞終端。
tty: true
讀取變量
Compose 模闆檔案支援動态讀取主機的系統環境變量和目前目錄下的
.env
檔案中的變量。
例如,下面的 Compose 檔案将從運作它的環境中讀取變量
${MONGO_VERSION}
的值,并寫入執行的指令中。
version: "3"services:db: image: "mongo:${MONGO_VERSION}"
如果執行
MONGO_VERSION=3.2 docker-compose up
則會啟動一個
mongo:3.2
鏡像的容器;如果執行
MONGO_VERSION=2.8 docker-compose up
mongo:2.8
鏡像的容器。
若目前目錄存在
.env
檔案,執行
docker-compose
指令時将從該檔案中讀取變量。
在目前目錄建立
.env
檔案并寫入以下内容。
# 支援 # 号注釋MONGO_VERSION=3.6
執行
docker-compose up
mongo:3.6