.env 與 compose.yml
從 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:
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:
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/
避免不小心把真正的帳號密碼上傳。
接著把 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。
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 繼續保存。
postgres
localhost,改用 postgres
--build 重新建立 Image3000:3000
postgres-data Volume 是否掛載docker compose logs
.env 管理資料庫設定docker compose up -d --build
今天把前面 28 天學到的內容全部整合在一起,從一開始只會使用 docker run hello-world,到現在已經可以使用 Docker Compose 同時管理 Node.js、PostgreSQL 和 pgAdmin。
以前建立開發環境時,每個程式都要分別安裝和設定,現在可以把 Image、Port、Volume、Network 和環境變數全部整理在 compose.yml 中,只要一個指令就能啟動整套環境。
我覺得今天最有感的是,前面每一天學的東西原本看起來都很分散,但實際整合後才發現它們其實都有關聯。Container 負責執行服務、Network 讓服務互相溝通、Volume 保存資料,而 Compose 則負責把這些設定統一管理。
明天就是最後一天,也會重新整理這 30 天從 Docker 新手一路到 PostgreSQL 實際應用的學習過程。