默認的模板文件是 docker-compose.yml,其中定義的每一個服務都必須經過 image 指令指定鏡像或 build 指令(須要 Dockerfile)來自動構建。
其它大部分指令都跟 docker run 中的相似。
若是使用 build 指令,在 Dockerfile 中設置的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在 docker-compose.yml 中再次設置。
image
指定爲鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose 將會嘗試拉去這個鏡像。
例如:mysql
image: ubuntu image: orchardup/postgresql image: a4bc65fd
指定 Dockerfile 所在文件夾的路徑。 Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像。
build: /path/to/build/dirweb
覆蓋容器啓動後默認執行的命令。
command: bundle exec thin -p 3000redis
連接到其它服務中的容器。使用服務名稱(同時做爲別名)或服務名稱:服務別名 (SERVICE:ALIAS) 格式均可以。
links:
- db
- db:database
- redis
使用的別名將會自動在服務容器中的 /etc/hosts 裏建立。例如:
172.17.2.186 db
相應的環境變量也將被建立。sql
連接到 docker-compose.yml 外部的容器,甚至 並不是 Compose 管理的容器。參數格式跟 links 相似。
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresqldocker
暴露端口信息。
使用宿主:容器 (HOST:CONTAINER)格式或者僅僅指定容器的端口(宿主將會隨機選擇端口)均可以。ubuntu
- "3000"
- "8000:8000"
- "127.0.0.1:8001:8001"
注:當使用 HOST:CONTAINER 格式來映射端口時,若是你使用的容器端口小於 60 你可能會獲得錯誤得結果,由於 YAML 將會解析 xx:yy 這種數字格式爲 60 進制。因此建議採用字符串格式。數組
暴露端口,但不映射到宿主機,只被鏈接的服務訪問。
僅能夠指定內部端口爲參數
expose:
- "3000"
- "8000"服務器
卷掛載路徑設置。能夠設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro網絡
從另外一個服務或容器掛載它的全部卷。
volumes_from:
- service_name
- container_nameapp
設置環境變量。你可使用數組或字典兩種格式。
只給定名稱的變量會自動獲取它在 Compose 主機上的值,能夠用來防止泄露沒必要要的數據。
environment:
- RACK_ENV=development
- SESSION_SECRET
從文件中獲取環境變量,能夠爲單獨的文件路徑或列表。
若是經過 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
基於已有的服務進行擴展。例如咱們已經有了一個 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 服務及相關環節變量。
設置網絡模式。使用和 docker client 的 --net 參數同樣的值。
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
跟主機系統共享進程命名空間。打開該選項的容器能夠相互經過進程 ID 來訪問和操做。
pid: "host"
配置 DNS 服務器。能夠是一個值,也能夠是一個列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
添加或放棄容器的 Linux 能力(Capabiliity)。
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
配置 DNS 搜索域。能夠是一個值,也能夠是一個列表。 dns_search: example.com dns_search: - domain1.example.com - domain2.example.com working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares 這些都是和 docker run 支持的選項相似。 cpu_shares: 73 working_dir: /code entrypoint: /code/entrypoint.sh user: postgresql hostname: foo domainname: foo.com mem_limit: 1000000000 privileged: true restart: always stdin_open: true tty: true