Docker Compose 簡介

回到主目錄去建立 docker-compose.yml 檔案。

Docker Compose 檔案 (docker-compose.yml) 是一個用來定義和管理多容器 Docker 應用程式的工具。這個檔案的主要功能和用途包括:

  1. 定義多個服務:允許你在一個檔案中定義多個相關聯的服務(容器),例如你的專案中的前端、後端和資料庫。

  2. 指定容器關係:你可以定義服務之間的依賴關係,例如指定前端服務依賴於後端服務。

  3. 設定共享網路:自動為所有服務建立一個共享的網路,使它們可以使用服務名稱互相通訊。

  4. 管理環境變數:為每個服務設定不同的環境變數。

  5. 處理持久資料:設定資料卷 (volumes) 來保存資料,確保容器重啟後資料不會遺失。

  6. 設定連接埠映射:將容器內部的連接埠映射到主機的連接埠,使服務可以從外部存取。

  7. 單一命令控制:透過簡單的命令(如 docker-compose up)一次啟動所有服務。

在專案中,docker-compose.yml 讓你能夠在一個命令中啟動完整的應用程式堆疊——資料庫、後端 API 和前端網頁介面,確保它們能正確連接並一起運作。它大大簡化了環境設定和部署過程,尤其是當你的應用需要多個相互依賴的組件時。

處理原有的 docker-compose.yml

這邊有一個疑問,原本在 BE 裡面的 docker-compose.yml 檔案需要刪除嗎?

對於後端的 Docker Compose 檔案,有兩種處理方式:

  1. 整合方式:將原本後端的 docker-compose.yml 內容整合到新的總體 docker-compose.yml

  2. 替換方式:完全使用新的總體 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

注意事項

  1. 確保整合目錄中包含 voting-system-be 和 voting-system-fe 這兩個子目錄,且這些目錄中分別有正確的 Dockerfile。

  2. 資料庫資料會被存儲在 ./data/ 目錄中,確保這個目錄有適當的讀寫權限。

  3. 在本例中,後端服務的命令直接使用 npm run dev,視實際情況可能需要調整,例如在問題排解筆記中提到的,可能需要加上安裝 nodemon 的步驟。

  4. 請確保環境變數 DATABASE_URL 中的連接參數與實際設定一致。

Last updated