Skip to main content
Docker Compose 單一 docker run 帶一堆旗標難維護,多個容器更是。Docker Compose 用一份 compose.yaml 把整套應用(多服務、網路、volume)宣告起來,一個指令拉起整組。
現行版本是 docker compose(v2,空格,無連字號),已內建於 Docker CLI。舊的 docker-compose(v1,Python 版)已 EOL、不再維護,不要再用compose.yaml不需要也不要寫 version: 頂層欄位,它在 Compose Specification 已 obsolete,寫了只會收到過時警告。
compose.yaml 裡的鍵,看每個區塊在做什麼:

頂層結構

service 常用鍵

建立網路

docker compose up 會自動建一個專案專屬的 bridge 網路(命名 <專案名>_default),所有服務自動加入。服務名就是它在這個網路上的 DNS hostname,所以 web 服務直接用 db:5432 連資料庫,不必管 IP。要分層隔離就自己宣告網路:
proxydb 不同網路無法直接通訊,只有 app 能同時接觸兩者。

容器群組(專案)名稱

Compose 用「專案名」把這組資源綁在一起,並當命名前綴: 優先序(高到低):docker compose -p <name> > COMPOSE_PROJECT_NAME 環境變數 > 頂層 name: > compose.yaml 所在目錄名。

環境設定參數

插值語法:${VAR} 取值、${VAR:-default} 未設定或為空用預設、${VAR:?msg} 未設定就報錯中止。容器內環境變數的優先序(高到低):docker compose run -e > environment: > env_file: > 宿主 shell 繼承 > Dockerfile ENV

使用 GPU

官方寫法是在服務的 deploy.resources.reservations.devices 宣告(主機需先裝 NVIDIA Container Toolkit):

效能與啟動順序

  • depends_onhealthcheck:用 condition: service_healthy 等依賴服務真的 ready 才啟動,避免應用搶在資料庫還沒起來時連線失敗。
  • 資源限制deploy.resources.limitscpus / memory 在 standalone(非 Swarm)模式也生效。
  • pull_policy 與 build cache:控制要不要每次都 pull、build 重用快取。
  • 啟動相關:up -d(背景)、--build(先重 build)、--scale web=3(擴成 3 份)、--wait(等到全部 healthy)。

volume 與 bind mount 映射

Compose 的 volumes: 同時管 bind mount 與具名 volume,靠來源寫法區分(差別見 資料落點):
要保留的資料用具名 volume,開發即時同步用 bind mount。不在 volumes: 指定的路徑,寫進去就只在容器可寫層,容器一刪就沒。

一份完整的 compose.yaml

docker compose 常用指令

上面的指令都假設當前目錄有預設檔名。docker compose 預設依序尋找 compose.yaml(首選)、compose.ymldocker-compose.yamldocker-compose.yml(從工作目錄逐層往上找)。檔名不是預設時(例如 docker-compose.dev.ymlmy-stack.yaml),就要用 -f 明確指定-f 屬頂層選項,放在子指令(up / down …)之前;多個 -f 依宣告順序合併(後者覆寫前者)。也可改用 COMPOSE_FILE 環境變數。官方 CLI 文件即如此定義。
一份 compose.yaml 起整組長這樣:
docker compose down -v 會刪掉具名 volumecompose.yamlvolumes: 區段宣告的那些),資料庫資料常在裡面,下去就沒了。只想停服務、保留資料用不帶 -vdocker compose down

接下來

官方參考:docs.docker.com/reference/compose-fileCompose GPU 支援