模板文件是使用docker-compose的核心,默認的模板文件名稱爲docker-compose.yml,格式爲YAML格式。每個服務都必須通過image指令指定鏡像或build指令(需要Dockerfile)等來自動構建生成鏡像。
注意:在編寫docker-compose.yml文件時,所有的冒號(:)、短橫線(-)後面都需要加一個空格,不然會出錯。
下面將介紹docker-compose模板文件常用指令:
build
指定Dockerfile所在文件夾的路徑(可以是絕對路徑,或者相對於docker-compose.yml文件的路徑)。docker-compose將會利用它自動構建這個鏡像,然後使用這個鏡像。
使用 context指令 指定Dockerfile所在文件夾的路徑。
使用 dockerfile指令 指定Dockerfile文件名
使用 args指令 指定構建鏡像時的變量
例如:
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
command
覆蓋容器啓動後默認執行的命令
command: echo "hello world"
container_name
指定容器名稱。默認將會使用 項目名稱_服務名稱_序號 這樣的格式
container_name: docker-web-container
configs
僅用於Swarm mode
deploy
僅用於Swarm mode
devices
指定設備映射關係
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
depends_on
解決容器的依賴、啓動先後的問題。
dns
自定義DNS服務器。可以是一個值,也可以是一個列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
environment
設置環境變量。可以使用數組或字典兩種格式。只給定名稱的變量會自動獲取運行Compose主機上對應變量的值,可以用來防止泄露不必要的數據。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
expose
暴露端口,但不映射到宿主機,只被連接的服務訪問。僅可以指定內部端口爲參數。
expose:
- "3000"
- "8000"
extra_hosts
類似Docker中的–add-host參數,指定額外的host名稱映射信息。會在啓動後的服務容器中/etc/hosts文件中添加一個條目。如:8.8.8.8 googledns
extra_hosts:
- "googledns:8.8.8.8"
healthcheck
通過命令檢查容器是否健康運行
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
image
指定爲鏡像名或鏡像ID,如果鏡像在本地不存在,Compose將會嘗試拉取這個鏡像。
image: session-web:latest
labels
爲容器添加Docker元數據(metadata)信息。例如可以爲容器添加輔助說明信息。
labels:
com.study.department: "devops department"
com.study.release: "v1.0"
links
連接到其他容器。注意:不推薦使用該指令。
應該使用docker network,建立網絡,而docker run --network來連接特定網絡。
或者使用version: ‘2’ 和更高版本的docker-compose.yml直接定義自定義網絡並使用。
network_mode
設置網絡模式。使用和docker run的–network參數一樣的值。
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
networks
配置容器連接的網絡
version: '3'
services:
some-service:
networks:
- network-demo
networks:
network-demo
ports
暴露端口信息,使用宿主端口:容器端口(HOST:CONTAINER)格式,或者僅僅指定容器的端口(宿主將會隨機選擇端)都可以。
ports:
- "3000"
- "8000:8000"
volumes
數據卷所掛載路徑設置,可以設置宿主機路徑,同時支持相對路徑
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/config:/etc/configs/:ro
ulimits
指定容器的ulimits限制值。
例如,指定最大進程數爲65535,指定文件句柄數爲20000(軟限制,應用可以隨時修改,不能超過硬限制)和 40000(系統硬限制,只能root用戶提高)
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
entrypoint
指定服務容器啓動後執行的入口文件
entrypoint: /code/entrypoint.sh
user
指定容器中運行應用的用戶名
user: nginx
working_dir
指定容器中工作目錄
working_dir: /code
domainname
指定容器中搜索域名
domainname: your_website.com
hostname
指定容器中主機名
hostname: test
mac_address
指定容器中mac地址
mac_address: 08-00-27-0C-0A
privileged
允許容器中運行一些特權命令
privileged: true
restart
指定容器退出後的重啓策略爲始終重啓。在生產環境中推薦配置爲 always 或者 unless-stopped
restart: always
read_only
以只讀模式掛載容器的root文件系統,意味着不能對容器內容進行修改
read_only: true
stdin_open
打開標準輸入,可以接受外部輸入
stdin_open: true
tty
模擬一個僞終端
tty: true
讀取變量
Compose模板文件支持動態讀取主機的系統環境變量和當前目錄下 .env 文件中的變量。
例如,下面Compose文件將從運行它的環境中讀取變量${MONGO_VERSION}的值,並寫入執行的指令中。
version: '3'
services:
db:
image: "mongo:${MONGO_VERSION}"
如果執行MONGO_VERSION=3.2 docker-compse up則會啓動一個mongo:3.2鏡像的容器 。
若當前目錄存在 .env文件,執行docker-compose命令時將從該文件中讀取變量。