Docker Compose 一個檔案起整套環境
當
docker run已經長到六七行、而且要照順序開三個容器時,就該換 Compose。它把所有 run 參數寫成一個 YAML。
services:
api:
build: .
ports: ["3000:3000"]
environment:
DB_HOST: postgres # 服務名稱直接當 hostname
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
postgres:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: dev123
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
retries: 5
# 不開 ports,只有內網連得到 → 更安全
volumes:
pgdata:docker compose up -d --build # 重建再啟動
docker compose logs -f api
docker compose down # 停掉並移除(加 -v 連 volume 一起刪,資料會沒)它自動幫你做的事
- 自動建立共用 network,所有服務都在裡面 → 服務名稱直接當 hostname(容器之間要用容器名稱連線而不是 localhost 的自動版)
- 依
depends_on決定啟動順序、管理 volume 生命週期、一行起停整套
⚠️ depends_on 不保證「就緒」
它預設只保證啟動順序。Postgres 容器啟動了不代表它已經可以接受連線。要搭配 healthcheck + condition: service_healthy,或在應用程式端做連線重試——正式環境建議兩者都做。
這是「新人第一天上班」問題的最終解
README 從 30 個步驟變成 git clone → cd → docker compose up。而且 docker-compose.yml 進了 git,環境的每次變更都有版本紀錄、都能 code review。
開發用疊加檔(掛原始碼 + 覆寫 CMD 跑 nodemon):docker compose -f docker-compose.yml -f docker-compose.dev.yml up,注意 bind mount 掛原始碼會蓋掉 image 裡的 node_modules。