容許用戶經過一個單獨的 docker-compose.yml
模板文件(YAML 格式)來定義一組相關聯的應用容器爲一個項目(project)。php
兩個重要的概念:mysql
一個項目能夠由多個服務(容器)關聯而成,Compose 面向項目進行管理。nginx
默認的模板文件名稱爲 docker-compose.yml
,格式爲 YAML 格式。web
每一個服務都必須經過 image
指令指定鏡像或 build
指令(須要 Dockerfile)等來自動構建生成鏡像。redis
若是使用 build
指令,在 Dockerfile
中設置的選項(例如:CMD, EXPOSE, VOLUME, ENV 等) 將會自動被獲取,無需在 docker-compose.yml
中再次設置。sql
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
複製代碼
指定 Dockerfile
所在文件夾的路徑(能夠是絕對路徑,或者相對 docker-compose.yml 文件的路徑)。 Compose 將會利用它自動構建這個鏡像,而後使用這個鏡像。docker
build: docker/redis
# 使用 context 指令指定 Dockerfile 所在文件夾的路徑
# 使用 dockerfile 指令指定 Dockerfile 文件名
# 使用 arg 指令指定構建鏡像時的變量。
# 使用 cache_from 指定構建鏡像的緩存
build:
context: .
dockerfile: docker/nginx-php7/Dockerfile
args:
buildno: 1
cache_from:
- alpine:latest
- corp/web_app:3.14
複製代碼
指定爲鏡像名稱或鏡像 ID。若是鏡像在本地不存在,Compose 將會嘗試拉取這個鏡像。ubuntu
image: ubuntu
複製代碼
覆蓋容器啓動後默認執行的命令緩存
command: echo "hello world"
複製代碼
指定容器名稱。默認將會使用 項目名稱_服務名稱_序號 這樣的格式。bash
container_name: docker-web-container
複製代碼
指定設備映射關係
devices:
- "/dev/ttyUSB1:/dev/ttyUSB0"
複製代碼
解決容器的依賴、啓動前後的問題。如下例子中會先啓動 redis db 再啓動 web
version: '3'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
複製代碼
自定義 DNS 服務器。能夠是一個值,也能夠是一個列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
複製代碼
從文件中獲取環境變量,能夠爲單獨的文件路徑或列表。
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
複製代碼
設置環境變量。若是變量名稱或者值中用到 true|false,yes|no 等表達 布爾 含義的詞彙,最好放到引號裏
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
複製代碼
暴露端口,但不映射到宿主機,只被鏈接的服務訪問,僅能夠指定內部端口爲參數
expose:
- "3000"
- "8000"
複製代碼
暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者僅僅指定容器的端口(宿主將會隨機選擇端口)均可以。
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
複製代碼
爲容器添加 Docker 元數據(metadata)信息。例如能夠爲容器添加輔助說明信息。
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "devops department"
com.startupteam.release: "rc3 for v1.0"
複製代碼
配置容器鏈接的網絡
networks:
some-network:
other-network:
複製代碼
存儲敏感數據,例如 mysql 服務密碼。
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_root_password
- my_other_secret
複製代碼
數據卷所掛載路徑設置。能夠設置宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)。
該指令中路徑支持相對路徑。
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
複製代碼
Compose 模板文件支持動態讀取主機的系統環境變量和當前目錄下的 .env 文件中的變量。經過${變量名}
讀取
# ${MONGO_VERSION}會讀取env文件中的值
version: "3"
services:
db:
image: "mongo:${MONGO_VERSION}"
複製代碼
對於 Compose 來講,大部分命令的對象既能夠是項目自己,也能夠指定爲項目中的服務或者容器。若是沒有特別的說明,命令對象將是項目,這意味着項目中全部的服務都會受到命令影響。
構建(從新構建)項目中的服務鏡像
運行 compose 項目
# 在後臺啓動並運行全部的容器
$ docker-compose up -d
複製代碼
中止 up 命令所啓動的容器,並移除網絡
驗證 Compose 文件格式是否正確,若正確則顯示配置,若格式錯誤顯示錯誤緣由。
進入指定的容器
$ docker-compose exec <容器名(docker-compose.yml定義的名)> bash
複製代碼
列出 Compose 文件中包含的鏡像
強制中止服務容器
$ docker-compose kill [容器名(docker-compose.yml定義的名)]
複製代碼
$ docker-compose log [容器名(docker-compose.yml定義的名)]
複製代碼
暫停服務容器
$ docker-compose pause [容器名(docker-compose.yml定義的名)]
複製代碼
列出項目中目前的容器
$ docker-compose ps [容器名(docker-compose.yml定義的名)]
# 只打印容器ID
$ docker-compose ps -q [容器名(docker-compose.yml定義的名)]
複製代碼
拉取服務依賴的鏡像
$ docker-compose pull [容器名(docker-compose.yml定義的名)]
複製代碼
重啓項目中的服務
$ docker-compose restart [容器名(docker-compose.yml定義的名)]
複製代碼
刪除全部(中止狀態的)服務容器。
須要執行 docker-compose stop 命令來中止容器。
$ docker-compose rm [容器名(docker-compose.yml定義的名)]
複製代碼
$ docker-compose start [容器名(docker-compose.yml定義的名)]
複製代碼
$ docker-compose stop [容器名(docker-compose.yml定義的名)]
複製代碼