昨天我們用 Docker Compose 成功讓「API + PostgreSQL」同時啟動。
今天要更進一步 ——
讓 Todo API 真正連上容器裡的資料庫,
把 Prisma 改成用 PostgreSQL,而不是之前的 SQLite。
今天的目標是:
讓兩者真的「連線起來」。
換句話說,今天我們要做到這件事👇
🧩 Express → Prisma → PostgreSQL(容器)
先打開專案裡的 prisma/schema.prisma
,
原本應該長這樣(使用 SQLite):
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
我們改成使用 PostgreSQL 👇
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
.env
在專案根目錄 .env
檔設定以下內容:
DATABASE_URL="postgresql://postgres:password@db:5432/todo"
⚠️ 注意:這裡的
db
是 Compose 裡服務名稱,不是localhost
!
Compose 會自動建立虛擬網路,api
可以直接用db
當主機名。
進入 API 容器,執行 migrate:
docker compose exec api npx prisma migrate dev --name init
輸出類似:
Applying migration `20251013_init`
The database is now in sync with your Prisma schema.
再用 Prisma Studio 看看資料:
docker compose exec api npx prisma studio
打開瀏覽器 → http://localhost:5555
就能看到你熟悉的 Todo 資料表介面了 👏
如果還沒有,請確認你的 schema 裡至少有一個 Todo 模型:
model Todo {
id Int @id @default(autoincrement())
task String
done Boolean @default(false)
note String?
createdAt DateTime @default(now())
}
重新啟動整個 Compose:
docker compose down
docker compose up --build -d
查看日誌:
docker compose logs -f api
應該會看到:
🚀 Server running on http://localhost:3000
Connected to PostgreSQL via Prisma
curl -X POST http://localhost:3000/todos \
-H "Content-Type: application/json" \
-d '{"task":"Docker 整合測試"}'
回應:
{
"id": 1,
"task": "Docker 整合測試",
"done": false,
"createdAt": "2025-10-13T10:00:00Z"
}
curl http://localhost:3000/todos
回傳:
[
{
"id": 1,
"task": "Docker 整合測試",
"done": false
}
]
🎉 這代表你的 API 已經成功連上容器裡的 PostgreSQL!
就算你停掉整個 Compose,資料也會保留在 volume 裡。
docker compose down
docker compose up -d
重新查詢:
curl http://localhost:3000/todos
資料還在 ✅
這就是 Volume 的威力。
如果你想直接進入資料庫看看:
docker compose exec db psql -U postgres -d todo
輸入:
\d
SELECT * FROM "Todo";
你會看到 Prisma 創建的資料表與內容。
現在的專案已經變成這樣👇
ts-todo-api/
├─ src/
│ ├─ controllers/
│ ├─ services/
│ ├─ routes/
│ ├─ dto/
│ └─ index.ts
├─ prisma/
│ ├─ schema.prisma
│ └─ migrations/
├─ Dockerfile
├─ docker-compose.yml
├─ package.json
└─ .env
用一行指令即可啟動整個完整後端環境:
docker compose up -d
今天是整個 Docker 系列裡的一個「連線時刻」。
我終於讓我的 Express + Prisma + PostgreSQL
全部在容器中互通,完全沒有碰主機環境。
重點收穫:
這次練習讓我更確信 Docker 的威力:
不只是「能跑」,而是「能快速重建整個環境」。