🚀 使用 Docker Compose 部署多服務架構(.NET + PostgreSQL 範例)

 

📖 文章摘要(Meta Description)

學會如何使用 Docker Compose 一次部署多個服務!本文以 .NET 8 Web API 搭配 PostgreSQL 為例,從 Dockerfile 到 docker-compose.yml,一步步教你打造可擴充的容器化架構,適用於開發、測試與 CI/CD 流程。


🔧 為什麼要使用 Docker Compose?

當你的應用程式需要串接資料庫、快取系統或訊息佇列時,單一容器已無法滿足需求。Docker Compose 是專為「多容器部署」設計的工具,只要透過一個 docker-compose.yml,就能一次定義與啟動整套應用。


📦 專案結構與說明

假設我們的範例是一個 ASP.NET Core Web API 搭配 PostgreSQL 資料庫的專案,目錄如下:

myapp/
├── docker-compose.yml
├── backend/
│   ├── Dockerfile
│   └── [Your .NET Solution Files]
└── db/
    └── init.sql (可選:初始化 SQL 腳本)


⚙️ Step 1:撰寫 ASP.NET Core 的 Dockerfile

myapp/backend/Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet restore
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "MyApi.dll"]


⚙️Step 2:撰寫 docker-compose.yml

myapp/docker-compose.yml

version: '3.9'
services:
  web:
    build:
      context: ./backend
    ports:
      - "5000:80"
    depends_on:
      - db
    environment:
      - ASPNETCORE_URLS=http://+:80
      - ConnectionStrings__DefaultConnection=Host=db;Port=5432;Database=mydb;Username=postgres;Password=pass123

  db:
    image: postgres:16
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: pass123
      POSTGRES_DB: mydb
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

📌 說明重點:

  • depends_on: 確保 web 容器在 db 之後啟動

  • environment: 使用 Docker Compose 設定環境變數(等同 appsettings.json

  • volumes: 保留 PostgreSQL 資料,即使容器關掉資料也不會遺失


🧪 Step 3:執行服務

myapp/ 目錄下執行:


docker-compose up -d


  • -d:背景執行

  • 使用 docker ps 查看目前服務狀態

  • 瀏覽器輸入 http://localhost:5000 查看 Web API 是否正常運作


🧰 Step 4:測試資料庫連線

你可以使用 psql、DBeaver 或任何 GUI 工具連接 PostgreSQL:

  • Host: localhost

  • Port: 5432

  • User: postgres

  • Password: pass123

  • Database: mydb

🔁 資料庫連線字串:

Host=db;Port=5432;Database=mydb;Username=postgres;Password=pass123

請注意:在容器之間使用「服務名稱」(如 db)當作主機名稱。


🧯 常見錯誤排查

錯誤訊息原因與解法
web exited with code 137容器記憶體不足,可檢查資源或調整 Docker Desktop 設定
ECONNREFUSED db:5432PostgreSQL 尚未啟動完成,稍等幾秒後重啟 web 容器即可
無法連接資料庫確保連線字串中使用 db 作為 host,而不是 localhost

🧹 清理容器與資料(開發時用)

docker-compose down -v

這會關閉所有服務並刪除資料卷(volumes)。


留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題