今天,我們要學會讓多個容器(例如 API + 資料庫)「一起啟動」。
不用再手動打一堆 docker run
,只要一個指令:
docker compose up
🎯
昨天我學會了用 Volume 讓容器資料不會消失。
但當專案越來越複雜,例如有:
每次都要開好幾個容器、設定 port、環境變數,超煩。
這時候就該讓 Docker Compose 接手了。
用一句話講:
Docker Compose 就是「一次管理多個容器的設定檔」。
你只要寫一份 docker-compose.yml
,
裡面描述各個服務(service)要用的映像、port、volume、env,
然後下指令:
docker compose up
整個環境就會一次啟動。
Docker Desktop 內建 Compose,確認版本即可:
docker compose version
看到:
Docker Compose version v2.x.x
就 OK。
⚠️ 注意新版是
docker compose
(空格),
舊版是docker-compose
(有 dash),現在幾乎都用新版。
docker-compose.yml
在專案根目錄新增這個檔案👇
version: "3.9"
services:
api:
build: .
container_name: ts-todo-api
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://postgres:password@db:5432/todo
depends_on:
- db
volumes:
- .:/app
- /app/node_modules
command: sh -c "npx prisma migrate deploy && npm run dev"
db:
image: postgres:16-alpine
container_name: todo-db
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: todo
ports:
- "5432:5432"
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
services.api
build: .
:從目前的 Dockerfile 建立 Imageports
:主機 3000 → 容器 3000environment
:設定環境變數depends_on
:確保 DB 先啟動volumes
:掛載專案資料夾(方便開發)command
:覆蓋 Dockerfile 的 CMD(這裡我讓它先做 migrate)services.db
db_data
負責持久化資料restart: always
:重開機也會自動啟動volumes
底部定義所有持久化資料掛載點。
docker compose up --build
第一次跑會:
postgres:16-alpine
等看到 log 出現:
🚀 Server running on http://localhost:3000
database system is ready to accept connections
恭喜 🎉 你剛剛成功啟動了一個雙容器系統。
docker compose ps
輸出:
NAME SERVICE STATUS PORTS
ts-todo-api api running 0.0.0.0:3000->3000/tcp
todo-db db running 0.0.0.0:5432->5432/tcp
指令 | 說明 |
---|---|
docker compose up -d |
背景啟動所有容器 |
docker compose down |
停止並移除所有容器 |
docker compose logs -f |
查看所有服務 log |
docker compose ps |
查看目前狀態 |
docker compose exec api sh |
進入 API 容器 |
docker compose down -v |
停止並刪除 volume(小心!) |
打開瀏覽器輸入:
http://localhost:3000/todos
看到熟悉的 JSON 回應 ✨
再打開資料庫 GUI 工具(或用命令列):
psql -h localhost -U postgres -d todo
確認資料表都有成功建立。
記得 .env
裡面的連線要改成這樣👇
(因為容器之間用 service name 溝通,不用 localhost
)
DATABASE_URL="postgresql://postgres:password@db:5432/todo"
Compose 會幫你自動建立「容器網路」,
service name db
就是另一台容器的主機名稱。
你現在的專案結構應該像這樣:
ts-todo-api/
├─ src/
├─ prisma/
│ └─ schema.prisma
├─ Dockerfile
├─ docker-compose.yml
├─ package.json
└─ .env
一行指令即可啟動整個系統 👇
docker compose up -d
今天真的是「環境自動化」的里程碑。
過去我都得手動開 DB、跑 API、設定 port,
現在只要一行 docker compose up
就能全部搞定。
重點收穫:
docker-compose.yml
結構depends_on
、volumes
、environment
的用法Docker Compose 給我的感覺就像「小型雲端部署模擬器」:
本地就能體驗到完整的後端環境。