Docker Compose YML
默認的模板文件是 docker-compose.yml,其中定義的每個服務都必須通過 image 指令指定鏡像或 build 指令(需要 Dockerfile)來自動構建。
其它大部分指令都跟 docker run 中的類似。
如果使用 build 指令,在 Dockerfile 中設置的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在 docker-compose.yml 中再次設置。
image指定為鏡像名稱或鏡像 ID。如果鏡像在本地不存在,Compose 將會嘗試拉去這個鏡像。
image
鏡像的地址,可以在鏡像倉庫找到。會在主機不存在該鏡像的時候,拉取。
image: ubuntu
image: orchardup/postgresql
image: a4bc65fd
build
指定 Dockerfile 所在文件夾的路徑。 Compose 將會利用它自動構建這個鏡像,然后使用這個鏡像。build構建鏡像和image下拉鏡像,優先通過build執行Dockerfile構建鏡像。
build: /path/to/build/dir
command
覆蓋掉默認的命令
command: bundle exec thin -p 3000
links
可以Link到其他的容器。可以直接寫應用名(同一個YML內),或者可以寫Link別名(SERVICE:ALIAS)
links:
- db
- db:database
- redis
Docker Link 會修改您容器內的HOST表和環境變量,的工作方式可以參考 Docker Link文檔。
depends_on
可以把依賴的容器名寫進來。
depends_on:
- db
- redis
external_links:
external_links可以Link到不是同一個YML內的容器。語法和普通的Link接近。但啟動的時候要保證被Link的容器是正常運行的。可以直接寫應用名(同一個YML內),或者可以寫Link別名(SERVICE:ALIAS)
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
extra_hosts
hostname映射。相當於在Docker Run中--add-host 參數.
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
這個配置會在容器的 /etc/hosts 文件中添加如下的內容。
162.242.195.82 somehost
50.31.209.229 otherhost
ports
開放端口,可以同時申明主機和容器端口 (HOST:CONTAINER), 也可以只申明容器端口。(會隨機選定一個外部端口).
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
expose
開放端口但不會在主機上映射。僅僅用於被其他的容器Link。只能保留內部端口
expose:
- "3000"
- "8000"
volumes
支持Mount存儲卷,可以支持指定主機路徑和容器路徑(HOST:CONTAINER), 還可以包括只讀 (HOST:CONTAINER:ro).
volumes:
- /var/lib/mysql
- ./cache:/tmp/cache
- ~/configs:/etc/configs/:ro
volumes_from
支持從其他APP和容器Mount。
volumes_from:
- service_name
- container_name
environment
可以添加環境變量,您可以指定YML數組或者字典。
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
env_file
從文件中獲取環境變量,可以為單獨的文件路徑或列表。
如果通過 docker-compose -f FILE 指定了模板文件,則 env_file 中路徑會基於模板文件路徑。
如果有變量名稱與 environment 指令沖突,則以后者為准。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
環境變量文件中每一行必須符合格式,支持 # 開頭的注釋行。
環境變量文件中每一行必須符合格式,支持 # 開頭的注釋行。
common.env: Set Rails/Rack environment
RACK_ENV=development
extends
基於已有的服務進行擴展。例如我們已經有了一個 webapp 服務,模板文件為 common.yml。
# common.yml
webapp:
build: ./webapp
environment:
- DEBUG=false
- SEND_EMAILS=false
編寫一個新的 development.yml 文件,使用 common.yml 中的 webapp 服務進行擴展。
web:
extends:
file: common.yml
service: webapp
ports:
- "8000:8000"
links:
- db
environment:
- DEBUG=true
db:
image: postgres
后者會自動繼承 common.yml 中的 webapp 服務及相關環節變量。
labels
可以通過Docker Lable給容器加一些元數據。
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
log_driver
可以給容器增加Log Driver。和命令行參數 --log-driver 相同
現在支持 json-file, syslog and none. 默認是 json-file.
log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"
net
設置網絡模式。使用和 docker client 的 --net 參數一樣的值
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
pid
容器共享pid。 跟主機系統共享進程命名空間。打開該選項的容器可以相互通過進程 ID 來訪問和操作。在docker命令中的使用是:docker run --pid container:containerid
pid: "host"
dns
配置 DNS 服務器。可以是一個值,也可以是一個列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
cap_add
增加容器的能力
cap_add:
- ALL
cap_drop
刪除容器的能力
cap_drop:
- NET_ADMIN
- SYS_ADMIN
dns_search
配置 DNS 搜索域。可以是一個值,也可以是一個列表
dns_search: example.com
dns_search:
- dc1.example.com
- dc2.example.com
devices
設備映射. 和命令行參數 --device 相同
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
security_opt
覆蓋默認的容器安全參數
security_opt:
- label:user:USER
- label:role:ROLE
working_dir
docker指定工作目錄
entrypoint
docker入口點
user
指定容器當前用戶
hostname
指定容器主機名
domainname
指定域名
mem_limit
指定容器內存限制
privileged
開啟特權,可以設置容器里的內核參數
restart
重啟后的容器啟動情況
stdin_open
tty
支持tty
cpu_shares
CPU 共享權值(相對權重)
cpuset
允許使用的CPU 集,值可以為 0-3,0,1
read_only
設置只讀文件系統
下列的熟悉都和 docker run 命令中的參數相同。
cpu_shares: 73
cpuset: 0,1
working_dir: /code
entrypoint: /code/entrypoint.sh
user: postgresql
hostname: foo
domainname: foo.com
mac_address: 02:42:ac:11:65:43
mem_limit: 1000000000
privileged: true
restart: always
stdin_open: true
tty: true
read_only: true