iT邦幫忙

2025 iThome 鐵人賽

0
自我挑戰組

《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》系列 第 33

Day33 - 持續成長學習藍圖 - Docker(API + DB 完整整合)

  • 分享至 

  • xImage
  •  

昨天我們用 Docker Compose 成功讓「API + PostgreSQL」同時啟動。
今天要更進一步 ——
Todo API 真正連上容器裡的資料庫
把 Prisma 改成用 PostgreSQL,而不是之前的 SQLite。

今天的目標是:

讓兩者真的「連線起來」。

換句話說,今天我們要做到這件事👇
🧩 Express → Prisma → PostgreSQL(容器)


1️⃣ 切換 Prisma 資料庫設定

先打開專案裡的 prisma/schema.prisma
原本應該長這樣(使用 SQLite):

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

我們改成使用 PostgreSQL 👇

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

2️⃣ 更新 .env

在專案根目錄 .env 檔設定以下內容:

DATABASE_URL="postgresql://postgres:password@db:5432/todo"

⚠️ 注意:這裡的 dbCompose 裡服務名稱,不是 localhost
Compose 會自動建立虛擬網路,api 可以直接用 db 當主機名。


3️⃣ 重新建構資料庫

進入 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 資料表介面了 👏


4️⃣ 更新 Prisma Model

如果還沒有,請確認你的 schema 裡至少有一個 Todo 模型:

model Todo {
  id        Int      @id @default(autoincrement())
  task      String
  done      Boolean  @default(false)
  note      String?
  createdAt DateTime @default(now())
}

5️⃣ 確認服務能正常連線

重新啟動整個 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

6️⃣ 實測 API

➕ 新增 Todo

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"
}

📋 查詢 Todo

curl http://localhost:3000/todos

回傳:

[
  {
    "id": 1,
    "task": "Docker 整合測試",
    "done": false
  }
]

🎉 這代表你的 API 已經成功連上容器裡的 PostgreSQL!


7️⃣ 驗證資料持久化

就算你停掉整個 Compose,資料也會保留在 volume 裡。

docker compose down
docker compose up -d

重新查詢:

curl http://localhost:3000/todos

資料還在 ✅
這就是 Volume 的威力。


8️⃣ 檢查 PostgreSQL 容器

如果你想直接進入資料庫看看:

docker compose exec db psql -U postgres -d todo

輸入:

\d
SELECT * FROM "Todo";

你會看到 Prisma 創建的資料表與內容。


9️⃣ 專案架構總覽

現在的專案已經變成這樣👇

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
全部在容器中互通,完全沒有碰主機環境。

重點收穫:

  • Prisma 改用 PostgreSQL provider
  • Compose 自動處理服務之間的網路
  • 一次啟動雙容器環境
  • 資料可以持久保存

這次練習讓我更確信 Docker 的威力:
不只是「能跑」,而是「能快速重建整個環境」。


上一篇
Day32 - 持續成長學習藍圖 - Docker(Docker Compose 入門)
下一篇
Day34 - 持續成長學習藍圖 - Docker(模擬部署環境)
系列文
《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》34
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言