天天看點

Compose 模闆檔案

模闆檔案是使用

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

指定

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

指定容器的核心能力(capacity)配置設定。

例如,讓容器擁有所有能力可以指定為:

cap_add:  - ALL
           

去掉 NET_ADMIN 能力可以指定為:

cap_drop:  - NET_ADMIN
           

command

覆寫容器啟動後預設執行的指令。

command: echo "hello world"
           

configs

僅用于

Swarm mode

,詳細内容請檢視

Swarm mode

一節。

cgroup_parent

指定父

cgroup

組,意味着将繼承該組的資源限制。

例如,建立了一個 cgroup 組名稱為

cgroups_1

cgroup_parent: cgroups_1
           

container_name

指定容器名稱。預設将會使用

項目名稱_服務名稱_序号

這樣的格式。

container_name: docker-web-container
           
注意: 指定容器名稱後,該服務将無法進行擴充(scale),因為 Docker 不允許多個容器具有相同的名稱。

deploy

Swarm mode

Swarm mode

一節

devices

指定裝置映射關系。

devices:  - "/dev/ttyUSB1:/dev/ttyUSB0"
           

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: 8.8.8.8dns:  - 8.8.8.8  - 114.114.114.114
           

dns_search

配置

DNS

搜尋域。可以是一個值,也可以是一個清單。

dns_search: example.comdns_search:  - domain1.example.com  - domain2.example.com
           

tmpfs

挂載一個 tmpfs 檔案系統到容器。

tmpfs: /runtmpfs:  - /run  - /tmp
           

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

設定環境變量。你可以使用數組或字典兩種格式。

隻給定名稱的變量會自動擷取運作 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: - "3000" - "8000"
           

external_links

注意:不建議使用該指令。

連結到

docker-compose.yml

外部的容器,甚至并非

Compose

管理的外部容器。

external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
           

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:  test: ["CMD", "curl", "-f", "http://localhost"]  interval: 1m30s  timeout: 10s  retries: 3
           

image

指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,

Compose

将會嘗試拉取這個鏡像。

image: ubuntuimage: orchardup/postgresqlimage: a4bc65fd
           

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

注意:不推薦使用該指令。

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

設定網絡模式。使用和

docker run

--network

參數一樣的值。

network_mode: "bridge"network_mode: "host"network_mode: "none"network_mode: "service:[service name]"network_mode: "container:[container name/id]"
           

networks

配置容器連接配接的網絡。

version: "3"services:  some-service:    networks:     - some-network     - other-networknetworks:  some-network:  other-network:
           

pid

跟主機系統共享程序命名空間。打開該選項的容器之間,以及容器和主控端系統之間可以通過程序 ID 來互相通路和操作。

pid: "host"
           

ports

暴露端口資訊。

使用宿主端口:容器端口

(HOST:CONTAINER)

格式,或者僅僅指定容器的端口(宿主将會随機選擇端口)都可以。

ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"
           

注意:當使用 HOST:CONTAINER 格式來映射端口時,如果你使用的容器端口小于 60 并且沒放到引号裡,可能會得到錯誤結果,因為 YAML 會自動解析 xx:yy 這種數字格式為 60 進制。為避免出現這種問題,建議數字串都采用引号包括起來的字元串格式。

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

指定容器模闆标簽(label)機制的預設屬性(使用者、角色、類型、級别等)。例如配置标簽的使用者名和角色名。

security_opt:    - label:user:USER    - label:role:ROLE
           

stop_signal

設定另一個信号來停止容器。在預設情況下使用的是 SIGTERM 停止容器。

stop_signal: SIGUSR1
           

sysctls

配置容器核心參數。

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

ulimits

指定容器的 ulimits 限制值。

例如,指定最大程序數為 65535,指定檔案句柄數為 20000(軟限制,應用可以随時修改,不能超過硬限制) 和 40000(系統硬限制,隻能 root 使用者提高)。

ulimits:    nproc: 65535    nofile:      soft: 20000      hard: 40000
           

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