iT邦幫忙

2026 iThome 鐵人賽

DAY 29
0
IT Operation

Docker 新手村:從容器到 PostgreSQL 的實戰之路系列 第 30 篇

Day 29 - 用 Docker Compose 建立完整開發環境

  • 分享至 

  • xImage
  •  

學習目標

  • 整合 Node.js、PostgreSQL 與 pgAdmin
  • 使用 Docker Compose 管理完整開發環境
  • 整理 Dockerfile、.env 與 compose.yml
  • 了解各個 Container 之間的連線方式
  • 使用一個指令啟動整套系統

把前面學過的內容全部整合起來

從 Day 1 開始,陸續學習了:

Image
Container
Port
Volume
Network
Dockerfile
PostgreSQL
pgAdmin
Docker Compose
Node.js
Express API

前幾天也已經成功讓 Node.js API 連線 PostgreSQL。

今天要把這些內容整合成一套完整的 Docker 開發環境。

最後希望只需要:

docker compose up -d --build

就可以一次啟動:

Node.js API
PostgreSQL
pgAdmin

專案資料夾結構

首先整理目前的專案:

schedule-project
│
├── app.js
├── package.json
├── package-lock.json
├── Dockerfile
├── compose.yml
├── .env
└── .gitignore

每個檔案都有不同用途:

app.js        → Node.js / Express API
Dockerfile    → 建立 Node.js Image
compose.yml   → 管理所有服務
.env          → 保存環境變數
.gitignore    → 排除不應上傳的檔案

Node.js Dockerfile

Node.js 使用之前建立的 Dockerfile:

FROM node:20

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

CMD ["node", "app.js"]

這份 Dockerfile 會負責建立 Node.js 的 Image。

流程是:

Dockerfile
    ↓
docker build
    ↓
Node.js Image
    ↓
Node.js Container

設定 .env

將資料庫設定放在 .env:

POSTGRES_USER=myuser
POSTGRES_PASSWORD=123456
POSTGRES_DB=schedule_db

DB_HOST=postgres
DB_PORT=5432
DB_USER=myuser
DB_PASSWORD=123456
DB_NAME=schedule_db

Node.js 就可以使用:

process.env.DB_HOST

讀取這些設定。

.env 也要加入 .gitignore:

.env
node_modules/

避免不小心把真正的帳號密碼上傳。


完整 compose.yml

接著把 PostgreSQL、pgAdmin 和 Node.js 全部放進同一份 Compose:

services:
  postgres:
    image: postgres:17
    container_name: my-postgres
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

  pgadmin:
    image: dpage/pgadmin4
    container_name: my-pgadmin
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@example.com
      PGADMIN_DEFAULT_PASSWORD: admin123
    ports:
      - "8080:80"
    depends_on:
      - postgres

  app:
    build: .
    container_name: my-node-app
    ports:
      - "3000:3000"
    env_file:
      - .env
    depends_on:
      - postgres

volumes:
  postgres-data:

現在一份 compose.yml 就包含了三個服務。


三個服務怎麼互相連線?

Docker Compose 會替同一個專案中的服務建立 Network。

因此 Node.js 不需要使用:

localhost:5432

而是:

postgres:5432

pgAdmin 要連線 PostgreSQL 時,也可以將 Host 設定為:

postgres

整體架構:

              Docker Compose
                    │
              Docker Network
                    │
       ┌────────────┼────────────┐
       │            │            │
       ↓            ↓            ↓
   Node.js       PostgreSQL    pgAdmin
   :3000           :5432        :80
       │            │            │
       └──────────→ │ ←──────────┘
                    │
                    ↓
              postgres-data
                  Volume

一個指令啟動全部服務

完成設定後執行:

docker compose up -d --build

Docker Compose 會:

建立 Node.js Image
        ↓
建立需要的 Network
        ↓
啟動 PostgreSQL
        ↓
啟動 pgAdmin
        ↓
啟動 Node.js

接著使用:

docker compose ps

查看服務。

如果正常,就可以看到三個 Container。


測試完整環境

首先測試 Node.js API:

http://localhost:3000/employees

如果成功,就會取得 PostgreSQL 中的員工資料。

接著開啟 pgAdmin:

http://localhost:8080

登入後將 PostgreSQL Host 設定為:

postgres

就可以查看 schedule_db 中的資料。

這時整個流程就是:

前端 / Browser
      │
      ↓
Node.js API
      │
      ↓
PostgreSQL
      ↑
      │
   pgAdmin

查看服務 Logs

如果其中一個服務出現問題,可以分別查看 Logs。

Node.js:

docker compose logs app

PostgreSQL:

docker compose logs postgres

pgAdmin:

docker compose logs pgadmin

如果想查看全部:

docker compose logs

這樣在排查問題時,可以快速知道是哪一個服務發生錯誤。


關閉完整環境

使用完畢後:

docker compose down

就可以一次停止並移除 Compose 建立的 Container。

下次只需要再次執行:

docker compose up -d --build

就能重新建立整套環境。

PostgreSQL 的資料則會透過 Volume 繼續保存。


常見錯誤與修正

  • ❌ Node.js 連不到 PostgreSQL → ✅ DB Host 使用 postgres
  • ❌ pgAdmin 連不到 PostgreSQL → ✅ Host 不要填 localhost,改用 postgres
  • ❌ 修改 Node.js 後沒有更新 → ✅ 使用 --build 重新建立 Image
  • ❌ API 無法從瀏覽器開啟 → ✅ 確認有設定 3000:3000
  • ❌ PostgreSQL 資料重新建立後消失 → ✅ 確認 postgres-data Volume 是否掛載
  • ❌ 不知道哪個 Container 發生問題 → ✅ 使用 docker compose logs

今日小挑戰(可交付)

  • [ ] 整理完整專案資料夾
  • [ ] 建立 Node.js Dockerfile
  • [ ] 使用 .env 管理資料庫設定
  • [ ] 將 PostgreSQL 加入 Compose
  • [ ] 將 pgAdmin 加入 Compose
  • [ ] 將 Node.js 加入 Compose
  • [ ] 使用 docker compose up -d --build
  • [ ] 成功開啟 Node.js API
  • [ ] 成功使用 pgAdmin 查看 PostgreSQL

DAY29 心得

今天把前面 28 天學到的內容全部整合在一起,從一開始只會使用 docker run hello-world,到現在已經可以使用 Docker Compose 同時管理 Node.js、PostgreSQL 和 pgAdmin。

以前建立開發環境時,每個程式都要分別安裝和設定,現在可以把 Image、Port、Volume、Network 和環境變數全部整理在 compose.yml 中,只要一個指令就能啟動整套環境。

我覺得今天最有感的是,前面每一天學的東西原本看起來都很分散,但實際整合後才發現它們其實都有關聯。Container 負責執行服務、Network 讓服務互相溝通、Volume 保存資料,而 Compose 則負責把這些設定統一管理。

明天就是最後一天,也會重新整理這 30 天從 Docker 新手一路到 PostgreSQL 實際應用的學習過程。


上一篇
Day 28 - Node.js API 串接 PostgreSQL:讓前端可以存取資料庫
下一篇
Day 30 - 從 Docker 新手到 PostgreSQL:30 天實戰總結
系列文
Docker 新手村:從容器到 PostgreSQL 的實戰之路 共 31 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言