Docker Compose 簡介
回到主目錄去建立 docker-compose.yml
檔案。
Docker Compose 檔案 (docker-compose.yml
) 是一個用來定義和管理多容器 Docker 應用程式的工具。這個檔案的主要功能和用途包括:
定義多個服務:允許你在一個檔案中定義多個相關聯的服務(容器),例如你的專案中的前端、後端和資料庫。
指定容器關係:你可以定義服務之間的依賴關係,例如指定前端服務依賴於後端服務。
設定共享網路:自動為所有服務建立一個共享的網路,使它們可以使用服務名稱互相通訊。
管理環境變數:為每個服務設定不同的環境變數。
處理持久資料:設定資料卷 (volumes) 來保存資料,確保容器重啟後資料不會遺失。
設定連接埠映射:將容器內部的連接埠映射到主機的連接埠,使服務可以從外部存取。
單一命令控制:透過簡單的命令(如
docker-compose up
)一次啟動所有服務。
在專案中,docker-compose.yml
讓你能夠在一個命令中啟動完整的應用程式堆疊——資料庫、後端 API 和前端網頁介面,確保它們能正確連接並一起運作。它大大簡化了環境設定和部署過程,尤其是當你的應用需要多個相互依賴的組件時。
處理原有的 docker-compose.yml
這邊有一個疑問,原本在 BE 裡面的 docker-compose.yml
檔案需要刪除嗎?
對於後端的 Docker Compose 檔案,有兩種處理方式:
整合方式:將原本後端的
docker-compose.yml
內容整合到新的總體docker-compose.yml
中替換方式:完全使用新的總體
docker-compose.yml
,原本的檔案可以保留但不使用
建議採用整合方式。這表示:
可以保留原本後端目錄中的
docker-compose.yml
(不需要刪除)在新的整合目錄中建立一個新的
docker-compose.yml
,包含前端、後端和資料庫服務新的整合版本會成為主要使用的版本
這樣做的好處是,後端仍然可以使用他們原本的 docker-compose.yml
單獨開發和測試後端,而整合版本則用於執行完整系統。
docker-compose.yml 內容
現在我們來討論 docker-compose.yml
檔案的內容。這個檔案將整合前端、後端和資料庫服務。
以下是一個完整的 docker-compose.yml
檔案範例:
version: '3.8'
services:
db:
image: postgres:13
container_name: voting_db
restart: always
environment:
TZ: Asia/Taipei
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: voting_system
volumes:
- ./data/:/var/lib/postgresql/data
ports:
- "15432:5432"
server:
build:
context: ./voting-system-be
image: voting-system-be
restart: always
container_name: voting_system_be
depends_on:
- db
environment:
DATABASE_URL: "postgresql://postgres:postgres@db:5432/voting_system"
volumes:
- ./voting-system-be:/app
ports:
- "3000:3000"
command: npm run dev
frontend:
build:
context: ./voting-system-fe
image: voting-system-fe
container_name: voting_system_fe
restart: always
ports:
- "4200:80"
depends_on:
- server
服務說明
這個 docker-compose.yml
檔案定義了三個服務:
1. db: PostgreSQL 資料庫
使用 postgres:13 映像檔
設定使用者名稱、密碼和資料庫名稱
將資料儲存在本地的 ./data/ 目錄中
將容器內部的 5432 連接埠映射到主機的 15432 連接埠
2. server: 後端服務
根據 ./voting-system-be 目錄中的
Dockerfile
建置命名為 voting-system-be
依賴於 db 服務(會在 db 啟動後才啟動)
設定連接資料庫的環境變數
將本地的 ./voting-system-be 目錄掛載到容器的 /app 目錄
將容器的 3000 連接埠映射到主機的 3000 連接埠
啟動時執行
npm run dev
命令
3. frontend: 前端服務
根據 ./voting-system-fe 目錄中的
Dockerfile
建置命名為 voting-system-fe
依賴於 server 服務(會在 server 啟動後才啟動)
將容器的 80 連接埠(Nginx 的預設連接埠)映射到主機的 4200 連接埠
部署說明
將這個內容儲存在整合目錄的根部的 docker-compose.yml
檔案中,然後就可以使用 docker-compose up
命令來啟動整個系統了。
執行完整的命令流程如下:
# 確保位於整合目錄的根部
cd voting-system-docker
# 啟動所有服務(前台模式,可以看到日誌輸出)
docker-compose up
# 或者在背景模式啟動
docker-compose up -d
# 查看正在運行的容器
docker-compose ps
# 停止並移除所有容器
docker-compose down
注意事項
確保整合目錄中包含 voting-system-be 和 voting-system-fe 這兩個子目錄,且這些目錄中分別有正確的 Dockerfile。
資料庫資料會被存儲在 ./data/ 目錄中,確保這個目錄有適當的讀寫權限。
在本例中,後端服務的命令直接使用
npm run dev
,視實際情況可能需要調整,例如在問題排解筆記中提到的,可能需要加上安裝 nodemon 的步驟。請確保環境變數 DATABASE_URL 中的連接參數與實際設定一致。
Last updated