Docker for Dotnet and share
1 | ## 建立專案 |
一開始怎麼知道要這樣寫?
首先,我們要從這個問題開始:我的程式要跑起來,需要哪些步驟?
1 | dotnet restore |

而其實 Dockerfile 只是把這些步驟搬進 container 裡,並且我們可以一段一段作
- 本機 dotnet run 成功
- 本機 dotnet publish 成功
- 本機 dotnet ./publish/MyMvcApp.dll 成功
- 寫 SDK-only Dockerfile
- docker build 成功
- docker run 成功
- 改成 multi-stage Dockerfile
- 再 docker build / docker run

撰寫 dockerfile
1 | ## 在 csproj 層 |
1 | # 1. 建立 build 環境 (用 SDK) |
SDK only

假設想先測非 multi-stage 版本也可以先測試
1 | FROM mcr.microsoft.com/dotnet/sdk:9.0 |
雖然它只有一個 stage,但它同時做了 build + runtime,只是 runtime 也繼續用 SDK image,假設現在在 MyMvcApp 專案資料夾,也就是有 .csproj 的那一層
1 | docker build -t mymvcapp-sdk-only . |
成功後執行
1 | docker run -it -p 5000:8080 mymvcapp-sdk-only |
然後打開瀏覽器 http://localhost:5000,如果畫面出現 MVC 首頁,就代表成功
因為 一個 stage 可以跑起來,但 multi-stage 是為了讓正式部署的 image 更乾淨、更小、更安全、更像正式環境
一個 stage 的問題是這種 SDK-only 版本正式部署時,container 裡會包含很多其實不需要的東西
- .NET SDK
- 原始碼
- NuGet restore/build 工具
- 編譯工具
- 可能還有測試檔案、Dockerfile、README、.git 內容
可是網站真正執行時,其實只需要
- .NET Runtime
- publish 出來的 dll
- appsettings
- wwwroot
- 相關相依檔案
Multi-stage 把「建置」和「執行」分開
build stage:負責編譯
1 | FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build |
runtime stage:負責執行
1 | FROM mcr.microsoft.com/dotnet/aspnet:8.0 |
意思是第一段 SDK image 用來 restore / build / publis,而第二段 ASP.NET Runtime image 只拿 publish 結果來跑網站,最後真的留下來的 image 只有第二段,第一段 build stage 不會被帶進正式 image 裡


1 | ## -t 是 --tag 的縮寫 |
執行容器
1 | ## 電腦的 5000 port 轉到 container 裡面的 8080 |
推到 Docker Hub
1 | docker login |
PO 執行
1 | docker run -it -p 5000:8080 yourdockerhubid/mymvcapp:v1 |

https://chi-keke.github.io/2026/05/04/DeepType-Docker-%E5%8C%85-NET-%E7%B5%A6-PO-%E4%BD%BF%E7%94%A8/
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.



