從零到部署:用 ASP.NET Core 8 + Docker + Nginx 打造一個現代化後台網站
2025-07-05 19:01:57 網站開發

身為一個開發者,最開心的時刻莫過於看到自己的作品成功上線。但從寫完程式碼到成功部署,中間的過程有時候比寫程式還令人頭痛。
本文將展示一個小專案:一個使用 ASP.NET Core 8 和 AdminLTE 打造的後台管理系統。同時,為了讓部署過程更順暢、更可靠,選擇容器化技術 Docker,並搭配 Nginx 作為反向代理。
這篇文章會分享這個 Demo 網站的技術堆疊,並詳細記錄如何一步步將它部署到一台全新的 Ubuntu 主機上。不管你是 .NET 新手還是想學習 Docker 部署的朋友,相信這篇文章都能帶給你一些啟發。
專案速覽:技術堆疊
這個 Demo 網站的核心功能很單純,就是一個常見的「文章管理」系統,用來展示基本的 CRUD(增、刪、改、查)操作。麻雀雖小,五臟俱全,這裡選擇了以下這套兼具現代化與高效能的技術組合:
- 後端框架: ASP.NET Core 8,微軟最新的 LTS 版本,效能強大且跨平台。
- 前端樣式: AdminLTE 3,一個基於 Bootstrap 5 的開源後台儀表板模板,能快速打造出專業且美觀的 UI。
- 資料庫: PostgreSQL,功能強大、穩定可靠的開源關聯式資料庫。
- 容器化: Docker & Docker Compose,這是整個部署流程的靈魂。它能將應用程式與其依賴的環境打包在一起,確保「在本機可以跑,在伺服器上就一定可以跑」。
- 反向代理: Nginx,高效能的 Web 伺服器,負責接收所有外部請求,並安全地轉發給在 Docker 容器中運行的應用程式。
部署實戰:一步步帶你上線
理論說再多,不如直接動手做。接下來,將會展示如何將這個專案部署到一台 Ubuntu 主機上。整個流程的核心就是三個檔案:Dockerfile
、docker-compose.yml
和 Nginx 設定檔。
1. Dockerfile
:應用程式的標準化打包清單
Dockerfile
就像一份食譜,它告訴 Docker 如何一步步建置你的應用程式映像 (Image)。使用「多階段建置 (Multi-stage build)」,這麼做的好處是最終產生的映像檔非常小,只包含必要的執行檔,乾淨又安全。
# --- Stage 1: Build ---
# 使用包含 .NET 8 SDK 的映像來建置專案
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# 先還原 NuGet 套件,利用 Docker 的快取機制加速後續建置
COPY ["YourProject.csproj", "."]
RUN dotnet restore "./YourProject.csproj"
# 複製所有原始碼並進行發佈
COPY . .
WORKDIR "/src/."
RUN dotnet publish "YourProject.csproj" -c Release -o /app/publish
# --- Stage 2: Final ---
# 使用僅包含 ASP.NET Runtime 的輕量級映像
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final
WORKDIR /app
COPY --from=build /app/publish .
# 指定容器內應用程式監聽的端口
EXPOSE 8080
# 容器啟動時執行的指令
ENTRYPOINT ["dotnet", "YourProject.dll"]
2. docker-compose.yml
:多個服務的指揮家
如果你的專案還需要資料庫(例如 PostgreSQL),docker-compose.yml
就是你的好幫手。它可以一次定義並啟動多個互相依賴的服務。在這個 Demo 中,為了簡化,只定義了 Web 應用程式本身。
它會根據上面的 Dockerfile
來建置映像,並設定端口映射與環境變數。
version: '3.8'
services:
my-web-app:
build: .
container_name: my-aspnet-app-container
restart: always
# 端口映射: <主機端口>:<容器端口>
# 將主機的 EXPOSED_PORT 端口對應到容器內部的 8080 端口
ports:
- "EXPOSED_PORT:8080" # 你可以把 EXPOSED_PORT 換成任何你喜歡且未被佔用的端口
environment:
- ASPNETCORE_ENVIRONMENT=Production
# 讓容器內的 Kestrel 監聽 8080 端口
- ASPNETCORE_URLS=http://+:8080
# 資料庫連線字串,可以透過這裡傳入
- ConnectionStrings__DefaultConnection=Host=your_db_host;Database=your_db;Username=user;Password=pass
3. Nginx 設定:網站的門面與守衛
Nginx 負責處理所有來自外部的流量,並將其轉發到我們在主機上暴露的 EXPOSED_PORT
端口。它同時也處理 SSL 加密,讓我們的網站能透過 https://
訪問。
# /etc/nginx/sites-available/your-domain.com
server {
server_name your-domain.com; # 你的網域
location / {
# 將請求轉發到在本機 EXPOSED_PORT 端口運行的 Docker 容器
proxy_pass http://127.0.0.1:EXPOSED_PORT;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# SSL 憑證相關設定 (通常由 Certbot 自動產生)
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# ... 其他 SSL 設定
}
server {
if ($host = your-domain.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name your-domain.com;
return 404;
}
4. 部署指令
準備好以上三個檔案後,實際的部署指令就非常簡單了:
- 將整個專案(包含
Dockerfile
和docker-compose.yml
)上傳到你的 Ubuntu 主機。 - SSH 登入主機,進入專案目錄。
- 執行以下指令:
# 一鍵建置映像並在背景啟動容器
sudo docker compose up --build -d
就這樣,你的 ASP.NET Core 網站就成功運行在 Docker 容器裡了!最後,設定好 Nginx 並用 Certbot 申請一個免費的 SSL 憑證,你的網站就能正式對外服務。
5. Certbot 申請一個免費的 SSL 憑證
執行以下指令:
# sudo certbot --nginx --expand -d [YOUR_DOMAIN]
sudo certbot --nginx --expand -d dotnetdemo.sodomcode.com
結語
透過 Docker,我們實現了開發與生產環境的高度一致性,大大降低了「在我電腦上可以跑」的窘境。整個部署流程變得標準化、自動化且極具擴展性。
希望這次的分享能幫助你對 ASP.NET Core 的跨平台部署有更深的認識。自己動手部署一次,你會發現這其中的樂趣遠超想像!