Docker 中部署 .NET 8 Web App 並支援 HTTPS

本文件詳細說明如何在 Docker 中部署 .NET 8 Web App,並讓其支援 HTTPS,同時使用 docker-compose 進行管理。


📌 目錄


1️⃣ 建立 .NET 8 Web App

如果尚未建立 .NET 8 Web 應用程式,請執行以下指令:

dotnet new web -n MyWebApp
cd MyWebApp

2️⃣ 建立 Dockerfile

在專案根目錄建立 Dockerfile,並填入以下內容:

# 使用官方 .NET 8 運行時
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

# 設定 ASP.NET Core 環境變數(HTTPS)
ENV ASPNETCORE_URLS="https://+:443;http://+:80"
ENV ASPNETCORE_HTTPS_PORT=443
ENV ASPNETCORE_Kestrel__Certificates__Default__Path=/https/aspnetapp.pfx

# 複製 HTTPS 憑證
COPY aspnetapp.pfx /https/aspnetapp.pfx

# 建置應用程式
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src

# 複製專案檔案
COPY ["03.Presentation/WayDoSoft.MoldPlan.TableSpecWeb/WayDoSoft.MoldPlan.TableSpecWeb.csproj", "03.Presentation/WayDoSoft.MoldPlan.TableSpecWeb/"]
COPY . .
WORKDIR "/src/03.Presentation/WayDoSoft.MoldPlan.TableSpecWeb"

# 還原相依性
RUN dotnet restore "./WayDoSoft.MoldPlan.TableSpecWeb.csproj"

# 建置應用程式
RUN dotnet build "./WayDoSoft.MoldPlan.TableSpecWeb.csproj" -c "${BUILD_CONFIGURATION}" -o /app/build

# 發佈應用程式
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./WayDoSoft.MoldPlan.TableSpecWeb.csproj" -c "${BUILD_CONFIGURATION}" -o /app/publish /p:UseAppHost=false

# 部署階段
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WayDoSoft.MoldPlan.TableSpecWeb.dll"]

3️⃣ 建立 HTTPS 憑證

ASP.NET Core 需要 .pfx 憑證來啟用 HTTPS,請執行:

dotnet dev-certs https -ep aspnetapp.pfx -p YourPfxPassword

這將建立 aspnetapp.pfx,並將其放入專案目錄。


4️⃣ 建立 docker-compose.yml

在專案目錄內建立 docker-compose.yml 檔案。

🔹 適用於標準 80/443 端口

version: "3.8"

services:
  tablespecweb:
    image: waydosoft.moldplan.tablespecweb-image
    container_name: waydosoft.moldplan.tablespecweb-container
    restart: always
    ports:
      - "5000:80"
      - "5001:443"
    environment:
      ASPNETCORE_URLS: "https://+:443;http://+:80"
      ASPNETCORE_HTTPS_PORT: 443
      ASPNETCORE_Kestrel__Certificates__Default__Path: "/https/aspnetapp.pfx"
      ASPNETCORE_Kestrel__Certificates__Default__Password: "YourPfxPassword"
    volumes:
      - "./aspnetapp.pfx:/https/aspnetapp.pfx"

🔹 若要使用 8080/8081 端口

version: "3.8"

services:
  tablespecweb:
    image: waydosoft.moldplan.tablespecweb-image
    container_name: waydosoft.moldplan.tablespecweb-container
    restart: always
    ports:
      - "5000:8080"
      - "5001:8081"
    environment:
      ASPNETCORE_URLS: "https://+:8081;http://+:8080"
      ASPNETCORE_HTTPS_PORT: 8081
      ASPNETCORE_Kestrel__Certificates__Default__Path: "/https/aspnetapp.pfx"
      ASPNETCORE_Kestrel__Certificates__Default__Password: "YourPfxPassword"
    volumes:
      - "./aspnetapp.pfx:/https/aspnetapp.pfx"

5️⃣ 執行與測試

🔹 啟動容器

執行以下指令來建置並啟動容器:

docker-compose up --build -d

🔹 檢查運行狀態

docker-compose ps

🔹 檢查容器日誌

docker-compose logs -f

🔹 測試應用程式

  • HTTP: http://localhost:5000

  • HTTPS: https://localhost:5001

🔹 停止並移除容器

docker-compose down

6️⃣ 常見錯誤與解決方案

❌ 錯誤 1:The system cannot find the path specified.

原因:指定的 docker-compose.yml 路徑錯誤。解決方案

cd C:\Users\zihao\source\repos\waydosoft.moldplan.backend\03.Presentation\WayDoSoft.MoldPlan.TableSpecWeb
docker-compose up --build -d

❌ 錯誤 2:Error mounting aspnetapp.pfx: not a directory

原因

  • aspnetapp.pfx 不存在或未正確掛載。

解決方案

  • 檢查檔案是否存在

    ls -l "C:\Users\zihao\source\repos\waydosoft.moldplan.backend\03.Presentation\WayDoSoft.MoldPlan.TableSpecWeb\aspnetapp.pfx"
  • 確保 volumes 使用完整路徑

    volumes:
      - "C:/Users/zihao/source/repos/waydosoft.moldplan.backend/03.Presentation/WayDoSoft.MoldPlan.TableSpecWeb/aspnetapp.pfx:/https/aspnetapp.pfx"

❌ 錯誤 3:環境變數內含敏感資訊

解決方案: 在 docker run 時傳入:

docker run -d -p 5000:80 -p 5001:443 \
  --env ASPNETCORE_Kestrel__Certificates__Default__Password=YourPfxPassword \
  -v $(pwd)/aspnetapp.pfx:/https/aspnetapp.pfx \
  waydosoft.moldplan.tablespecweb-image

🎯 總結

  • 建立 .NET 8 Web App 並撰寫 Dockerfile

  • 建立 aspnetapp.pfx 來啟用 HTTPS。

  • 使用 docker-compose.yml 進行管理。

  • 使用 docker-compose up --build -d 啟動應用程式。

  • 修正常見錯誤,確保應用程式順利運行。

這樣,你的 .NET 8 Web App 就可以 成功運行於 Docker 並支援 HTTPS!

Last updated