Docker Compose
單一 docker run 帶一堆旗標難維護,多個容器更是。Docker Compose 用一份 compose.yaml 把整套應用(多服務、網路、volume)宣告起來,一個指令拉起整組。
點 compose.yaml 裡的鍵,看每個區塊在做什麼:
頂層結構
service 常用鍵
建立網路
docker compose up 會自動建一個專案專屬的 bridge 網路(命名 <專案名>_default),所有服務自動加入。服務名就是它在這個網路上的 DNS hostname,所以 web 服務直接用 db:5432 連資料庫,不必管 IP。要分層隔離就自己宣告網路:
proxy 與 db 不同網路無法直接通訊,只有 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_on配healthcheck:用condition: service_healthy等依賴服務真的 ready 才啟動,避免應用搶在資料庫還沒起來時連線失敗。- 資源限制:
deploy.resources.limits的cpus/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,靠來源寫法區分(差別見 資料落點):
volumes: 指定的路徑,寫進去就只在容器可寫層,容器一刪就沒。
一份完整的 compose.yaml
docker compose 常用指令
上面的指令都假設當前目錄有預設檔名。
docker compose 預設依序尋找 compose.yaml(首選)、compose.yml、docker-compose.yaml、docker-compose.yml(從工作目錄逐層往上找)。檔名不是預設時(例如 docker-compose.dev.yml、my-stack.yaml),就要用 -f 明確指定。-f 屬頂層選項,放在子指令(up / down …)之前;多個 -f 依宣告順序合併(後者覆寫前者)。也可改用 COMPOSE_FILE 環境變數。官方 CLI 文件即如此定義。compose.yaml 起整組長這樣:
接下來
- 資料落點:volume 與 bind mount 的差別。
- 如何撰寫 Dockerfile:
build:指向的 Dockerfile 怎麼寫。