原本以為 docker compose 是 docker-compose 指令官方的套件整合,後來發現其實是全新的東西。
差異說明
-
docker-compose:是原先獨立安裝的 Compose 工具,使用 Python 實作,指令是用
docker-compose(中間有連字號),這是 Docker Compose v1 的常用形式。 -
docker compose:是 Docker Compose v2 版本,整合進 Docker CLI 中,採用 Go 語言重寫,使得 Compose 命令成為 docker 命令的一部分,指令使用空格隔開,即
docker compose,這是官方現階段推薦的新作法,提升整合度與效能。
Compose 檔案名稱的使用
歷史上預設檔名是 docker-compose.yml,由於 docker-compose 指令而來,仍被廣泛使用以確保向後相容。
新推薦的檔名是 compose.yaml(或 compose.yml 同樣被接受),更符合 Compose 規範,且映射到 docker compose 指令。官方文件中多建議使用 compose.yaml 作為現代 Compose 的標準檔名。
也可以用 -f 選項指定自訂檔名,靈活在不同目錄或專案間使用多個 Compose 配置檔。
建議改動
- 版本號
version已經不需要寫 deploy只在 Swarm 模式才有用- 官方推薦改成 compose.yaml
- 支援
profiles(服務分組)
services:
db:
image: mysql:8
profiles: ["dev"]
redis:
image: redis:6
profiles: ["prod", "staging"]
docker compose --profile dev up # 這樣執行只有 profiles 含 dev 的 container 會啟動
- 官方不建議用
links,用depends_on取代 - 多檔案合併,常用於「開發」跟「生產」環境分離
compose.yml
services:
app:
image: nginx:alpine
ports:
- "80:80"
environment:
- APP_ENV=production
compose.override.yaml
services:
app:
environment:
- APP_ENV=development
ports:
- "8080:80" # 開發改用 8080 port
volumes:
- ./src:/usr/share/nginx/html:ro
docker compose -f compose.yaml -f compose.override.yaml up
docker compose cp已支援docker compose config支援扁平化配置檔顯示- 支援 Include
# compose.yaml
include:
- ./database/compose.yaml
- ./monitoring/compose.yaml
services:
web:
image: nginx
- 支援單一
up或downservice
docker compose up web fpm -d
docker compose down fpm
但有 depends_on 的會被連帶啟動。