iT邦幫忙

2025 iThome 鐵人賽

0
自我挑戰組

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

Day32 - 持續成長學習藍圖 - Docker(Docker Compose 入門)

  • 分享至 

  • xImage
  •  

今天,我們要學會讓多個容器(例如 API + 資料庫)「一起啟動」。
不用再手動打一堆 docker run,只要一個指令:

docker compose up 🎯


昨天我學會了用 Volume 讓容器資料不會消失。
但當專案越來越複雜,例如有:

  • 一個 API 容器
  • 一個 PostgreSQL 容器
  • 可能還有 Redis、前端、Nginx...

每次都要開好幾個容器、設定 port、環境變數,超煩。
這時候就該讓 Docker Compose 接手了。


1️⃣ Docker Compose 是什麼

用一句話講:

Docker Compose 就是「一次管理多個容器的設定檔」。

你只要寫一份 docker-compose.yml
裡面描述各個服務(service)要用的映像、port、volume、env,
然後下指令:

docker compose up

整個環境就會一次啟動。


2️⃣ 安裝與版本確認

Docker Desktop 內建 Compose,確認版本即可:

docker compose version

看到:

Docker Compose version v2.x.x

就 OK。

⚠️ 注意新版是 docker compose(空格),
舊版是 docker-compose(有 dash),現在幾乎都用新版。


3️⃣ 建立 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 建立 Image
  • ports:主機 3000 → 容器 3000
  • environment:設定環境變數
  • depends_on:確保 DB 先啟動
  • volumes:掛載專案資料夾(方便開發)
  • command:覆蓋 Dockerfile 的 CMD(這裡我讓它先做 migrate)

services.db

  • 使用官方 PostgreSQL 映像
  • 設定使用者、密碼、資料庫名稱
  • Volume db_data 負責持久化資料
  • restart: always:重開機也會自動啟動

volumes

底部定義所有持久化資料掛載點。


4️⃣ 啟動整個環境

docker compose up --build

第一次跑會:

  1. build 你的 API image
  2. 拉取 postgres:16-alpine
  3. 自動建立 volume
  4. 同時啟動兩個容器 🚀

等看到 log 出現:

🚀 Server running on http://localhost:3000
database system is ready to accept connections

恭喜 🎉 你剛剛成功啟動了一個雙容器系統。


5️⃣ 確認容器狀態

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

6️⃣ 常用指令

指令 說明
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(小心!)

7️⃣ 實作驗證

打開瀏覽器輸入:

http://localhost:3000/todos

看到熟悉的 JSON 回應 ✨
再打開資料庫 GUI 工具(或用命令列):

psql -h localhost -U postgres -d todo

確認資料表都有成功建立。


8️⃣ 讓 Prisma 自動連到容器內的 DB

記得 .env 裡面的連線要改成這樣👇
(因為容器之間用 service name 溝通,不用 localhost

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

Compose 會幫你自動建立「容器網路」,
service name db 就是另一台容器的主機名稱。


9️⃣ 結構總覽

你現在的專案結構應該像這樣:

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_onvolumesenvironment 的用法
  • Prisma 成功連上 PostgreSQL 容器
  • 一次啟動多容器系統

Docker Compose 給我的感覺就像「小型雲端部署模擬器」:
本地就能體驗到完整的後端環境。


上一篇
Day31 - 持續成長學習藍圖 - Docker(資料持久化與 Volume)
下一篇
Day33 - 持續成長學習藍圖 - Docker(API + DB 完整整合)
系列文
《轉職學習日記:JavaScript × Node.js × TypeScript × Docker × AWS ECS》34
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言