在 Docker 容器中執行 ASP.NET Core 應用程式
注意
這不是這篇文章的最新版本。 如需目前版本,請參閱本文的 .NET 8 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支援原則。 如需目前版本,請參閱本文的 .NET 8 版本。
本文示範如何在 Docker 容器中執行 ASP.NET Core 應用程式。
Windows Home 版本不支援 Hyper-V,而 Docker 需要 Hyper-V。
如需使用 dotnet publish
將 .NET 應用程式容器化的相關資訊,請參閱使用 dotnet publish 將 .NET 應用程式容器化。
ASP.NET Core Docker 映像
針對本教學課程,您可以下載 ASP.NET Core 範例應用程式,並在 Docker 容器中執行它。 該範例可與 Linux 或 Windows 容器搭配使用。
範例 Dockerfile 會使用 Docker 多階段建置功能 \(英文\),在不同容器中建置並執行。 建置和執行容器會從 Docker Hub 中 Microsoft 所提供的映像來建置:
dotnet/sdk
範例會使用此映像來建置應用程式。 此映像包含隨附命令列工具 (CLI) 的 .NET SDK。 此映像會最佳化來進行本機開發、偵錯和單元測試。 為了開發和編譯而安裝的工具會使此映像成為相對較大的檔案。
dotnet/aspnet
範例會使用此映像來執行應用程式。 此映像包含 ASP.NET Core 執行階段和程式庫,並會進行最佳化,以在生產環境中執行應用程式。 專為部署和應用程式啟動速度而設計的映像相對較小,因此,已將從 Docker 登錄到 Docker 主機的網路效能最佳化。 只會將執行應用程式所需的程式庫和內容複製到容器中。 內容已準備好執行,可用最短的時間從
docker run
到應用程式啟動。 在 Docker 模型中,不需要動態程式碼編譯。
必要條件
下載範例應用程式
藉由複製 .NET Docker 存放庫來下載範例:
git clone https://github.com/dotnet/dotnet-docker
在本機執行應用程式
瀏覽至 dotnet-docker/samples/aspnetapp/aspnetapp 中的專案資料夾。
執行下列命令,在本機建置並執行應用程式:
dotnet run
在瀏覽器中移至
http://localhost:<port>
以測試應用程式。在命令提示字元中按 Ctrl + C 以停止應用程式。
在 Linux 容器或 Windows 容器中執行
若要在 Linux 容器中執行,請以滑鼠右鍵按一下系統匣的 Docker 用戶端圖示,然後選取 [切換至 Linux 容器]。
若要在 Windows 容器中執行,請以滑鼠右鍵按一下系統匣的 Docker 用戶端圖示,然後選取 [切換至 Windows 容器]。
瀏覽至 dotnet-docker/samples/aspnetapp 中的 Dockerfile 資料夾。
執行下列命令,在 Docker 中建置並執行範例:
docker build -t aspnetapp . docker run -it --rm -p <port>:8080 --name aspnetcore_sample aspnetapp
build
命令引數:- 將映像命名為 aspnetapp。
- 在目前的資料夾 (結束期間) 中尋找 Dockerfile。
run 命令引數:
- 配置虛擬 TTY,即使未連接,還是要使其保持開啟 (與
--interactive --tty
的效果相同)。 - 結束時自動移除容器。
- 將本機電腦上的
<port>
對應至容器中的連接埠 8080。 - 將容器命名為 aspnetcore_sample。
- 指定 aspnetapp 映像。
在瀏覽器中移至
http://localhost:<port>
以測試應用程式。
手動建置並部署
在某些情況下,您可能想藉由複製執行階段所需的應用程式資產,將應用程式部署至容器。 本節示範如何手動部署。
瀏覽至 dotnet-docker/samples/aspnetapp/aspnetapp 中的專案資料夾。
執行 dotnet publish 命令:
dotnet publish -c Release -o published
命令引數:
- 以發行模式建置應用程式 (預設為偵錯模式)。
- 在 [published] 資料夾中建立資產。
執行應用程式。
Windows:
dotnet published\aspnetapp.dll
Linux:
dotnet published/aspnetapp.dll
瀏覽至
http://localhost:<port>
以查看 home 頁面。
若要在 Docker 容器內使用手動發佈的應用程式,請建立新的 Dockerfile 並使用 docker build .
命令來建置映像。
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
若要查看新的映像,請使用 docker images
命令。
Dockerfile
以下是您先前執行的 docker build
命令所使用的 Dockerfile。 它會以您在本節所做的相同方式,使用 dotnet publish
進行建置及部署。
# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /source
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore
# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
在上面的 Dockerfile 中,檔案 *.csproj
會複製並還原為不同的層級。 docker build
命令建置映像時,會使用內建快取。 如果 *.csproj
檔案自上次執行 docker build
命令後未曾變更,則 dotnet restore
命令就不需再次執行。 相對地,會重複使用對應 dotnet restore
層的內建快取。 如需詳細資訊,請參閱撰寫 Dockerfile 的最佳做法。
其他資源
- 使用 dotnet publish 將 .NET 應用程式容器化
- Docker build 命令列 \(英文\)
- Docker run 命令列 \(英文\)
- ASP.NET Core Docker 範例 \(英文\) (本教學課程中所使用的範例。)
- 設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器
- 使用 Visual Studio Docker 工具
- 使用 Visual Studio Code 進行偵錯 \(英文\)
- 使用 Docker 和小型容器的 GC
- System.IO.IOException:已達到 Inotify 執行個體數目的已設定使用者限制 (128)
- Docker 映像的更新
下一步
包含範例應用程式的 Git 存放庫也會包含文件。 如需存放庫中可用資源的概觀,請參閱讀我檔案 \(英文\)。 特別是了解如何實作 HTTPS:
ASP.NET Core Docker 映像
針對本教學課程,您可以下載 ASP.NET Core 範例應用程式,並在 Docker 容器中執行它。 該範例可與 Linux 或 Windows 容器搭配使用。
範例 Dockerfile 會使用 Docker 多階段建置功能 \(英文\),在不同容器中建置並執行。 建置和執行容器會從 Docker Hub 中 Microsoft 所提供的映像來建置:
dotnet/sdk
範例會使用此映像來建置應用程式。 此映像包含隨附命令列工具 (CLI) 的 .NET SDK。 此映像會最佳化來進行本機開發、偵錯和單元測試。 為了開發和編譯而安裝的工具會使此映像成為相對較大的檔案。
dotnet/aspnet
範例會使用此映像來執行應用程式。 此映像包含 ASP.NET Core 執行階段和程式庫,並會進行最佳化,以在生產環境中執行應用程式。 專為部署和應用程式啟動速度而設計的映像相對較小,因此,已將從 Docker 登錄到 Docker 主機的網路效能最佳化。 只會將執行應用程式所需的程式庫和內容複製到容器中。 內容已準備好執行,可用最短的時間從
docker run
到應用程式啟動。 在 Docker 模型中,不需要動態程式碼編譯。
必要條件
下載範例應用程式
藉由複製 .NET Docker 存放庫來下載範例:
git clone https://github.com/dotnet/dotnet-docker
在本機執行應用程式
瀏覽至 dotnet-docker/samples/aspnetapp/aspnetapp 中的專案資料夾。
執行下列命令,在本機建置並執行應用程式:
dotnet run
在瀏覽器中移至
http://localhost:5000
以測試應用程式。在命令提示字元中按 Ctrl + C 以停止應用程式。
在 Linux 容器或 Windows 容器中執行
若要在 Linux 容器中執行,請以滑鼠右鍵按一下系統匣的 Docker 用戶端圖示,然後選取 [切換至 Linux 容器]。
若要在 Windows 容器中執行,請以滑鼠右鍵按一下系統匣的 Docker 用戶端圖示,然後選取 [切換至 Windows 容器]。
瀏覽至 dotnet-docker/samples/aspnetapp 中的 Dockerfile 資料夾。
執行下列命令,在 Docker 中建置並執行範例:
docker build -t aspnetapp . docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp
build
命令引數:- 將映像命名為 aspnetapp。
- 在目前的資料夾 (結束期間) 中尋找 Dockerfile。
run 命令引數:
- 配置虛擬 TTY,即使未連接,還是要使其保持開啟 (與
--interactive --tty
的效果相同)。 - 結束時自動移除容器。
- 將本機電腦上的連接埠 5000 對應至容器中的連接埠 80。
- 將容器命名為 aspnetcore_sample。
- 指定 aspnetapp 映像。
在瀏覽器中移至
http://localhost:5000
以測試應用程式。
手動建置並部署
在某些情況下,您可能想藉由複製執行階段所需的應用程式資產,將應用程式部署至容器。 本節示範如何手動部署。
瀏覽至 dotnet-docker/samples/aspnetapp/aspnetapp 中的專案資料夾。
執行 dotnet publish 命令:
dotnet publish -c Release -o published
命令引數:
- 以發行模式建置應用程式 (預設為偵錯模式)。
- 在 [published] 資料夾中建立資產。
執行應用程式。
Windows:
dotnet published\aspnetapp.dll
Linux:
dotnet published/aspnetapp.dll
瀏覽至
http://localhost:5000
以查看 home 頁面。
若要在 Docker 容器內使用手動發佈的應用程式,請建立新的 Dockerfile 並使用 docker build .
命令來建置映像。
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
若要查看新的映像,請使用 docker images
命令。
Dockerfile
以下是您先前執行的 docker build
命令所使用的 Dockerfile。 它會以您在本節所做的相同方式,使用 dotnet publish
進行建置及部署。
# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /source
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore
# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:7.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
在上面的 Dockerfile 中,檔案 *.csproj
會複製並還原為不同的層級。 docker build
命令建置映像時,會使用內建快取。 如果 *.csproj
檔案自上次執行 docker build
命令後未曾變更,則 dotnet restore
命令就不需再次執行。 相對地,會重複使用對應 dotnet restore
層的內建快取。 如需詳細資訊,請參閱撰寫 Dockerfile 的最佳做法。
其他資源
- 使用 dotnet publish 將 .NET 應用程式容器化
- Docker build 命令列 \(英文\)
- Docker run 命令列 \(英文\)
- ASP.NET Core Docker 範例 \(英文\) (本教學課程中所使用的範例。)
- 設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器
- 使用 Visual Studio Docker 工具
- 使用 Visual Studio Code 進行偵錯 \(英文\)
- 使用 Docker 和小型容器的 GC
- System.IO.IOException:已達到 Inotify 執行個體數目的已設定使用者限制 (128)
- Docker 映像的更新
下一步
包含範例應用程式的 Git 存放庫也會包含文件。 如需存放庫中可用資源的概觀,請參閱讀我檔案 \(英文\)。 特別是了解如何實作 HTTPS:
ASP.NET Core Docker 映像
針對本教學課程,您可以下載 ASP.NET Core 範例應用程式,並在 Docker 容器中執行它。 該範例可與 Linux 或 Windows 容器搭配使用。
範例 Dockerfile 會使用 Docker 多階段建置功能 \(英文\),在不同容器中建置並執行。 建置和執行容器會從 Docker Hub 中 Microsoft 所提供的映像來建置:
dotnet/sdk
範例會使用此映像來建置應用程式。 此映像包含隨附命令列工具 (CLI) 的 .NET SDK。 此映像會最佳化來進行本機開發、偵錯和單元測試。 為了開發和編譯而安裝的工具會使此映像成為相對較大的檔案。
dotnet/core/sdk
範例會使用此映像來建置應用程式。 此映像包含隨附命令列工具 (CLI) 的 .NET Core SDK。 此映像會最佳化來進行本機開發、偵錯和單元測試。 為了開發和編譯而安裝的工具會使此映像成為相對較大的檔案。
dotnet/aspnet
範例會使用此映像來執行應用程式。 此映像包含 ASP.NET Core 執行階段和程式庫,並會進行最佳化,以在生產環境中執行應用程式。 專為部署和應用程式啟動速度而設計的映像相對較小,因此,已將從 Docker 登錄到 Docker 主機的網路效能最佳化。 只會將執行應用程式所需的程式庫和內容複製到容器中。 內容已準備好執行,可用最短的時間從
docker run
到應用程式啟動。 在 Docker 模型中,不需要動態程式碼編譯。
dotnet/core/aspnet
範例會使用此映像來執行應用程式。 此映像包含 ASP.NET Core 執行階段和程式庫,並會進行最佳化,以在生產環境中執行應用程式。 專為部署和應用程式啟動速度而設計的映像相對較小,因此,已將從 Docker 登錄到 Docker 主機的網路效能最佳化。 只會將執行應用程式所需的程式庫和內容複製到容器中。 內容已準備好執行,可用最短的時間從
docker run
到應用程式啟動。 在 Docker 模型中,不需要動態程式碼編譯。
必要條件
下載範例應用程式
藉由複製 .NET Docker 存放庫來下載範例:
git clone https://github.com/dotnet/dotnet-docker
在本機執行應用程式
瀏覽至 dotnet-docker/samples/aspnetapp/aspnetapp 中的專案資料夾。
執行下列命令,在本機建置並執行應用程式:
dotnet run
在瀏覽器中移至
http://localhost:5000
以測試應用程式。在命令提示字元中按 Ctrl + C 以停止應用程式。
在 Linux 容器或 Windows 容器中執行
若要在 Linux 容器中執行,請以滑鼠右鍵按一下系統匣的 Docker 用戶端圖示,然後選取 [切換至 Linux 容器]。
若要在 Windows 容器中執行,請以滑鼠右鍵按一下系統匣的 Docker 用戶端圖示,然後選取 [切換至 Windows 容器]。
瀏覽至 dotnet-docker/samples/aspnetapp 中的 Dockerfile 資料夾。
執行下列命令,在 Docker 中建置並執行範例:
docker build -t aspnetapp . docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp
build
命令引數:- 將映像命名為 aspnetapp。
- 在目前的資料夾 (結束期間) 中尋找 Dockerfile。
run 命令引數:
- 配置虛擬 TTY,即使未連接,還是要使其保持開啟 (與
--interactive --tty
的效果相同)。 - 結束時自動移除容器。
- 將本機電腦上的連接埠 5000 對應至容器中的連接埠 80。
- 將容器命名為 aspnetcore_sample。
- 指定 aspnetapp 映像。
在瀏覽器中移至
http://localhost:5000
以測試應用程式。
手動建置並部署
在某些情況下,您可能想藉由複製執行階段所需的應用程式資產,將應用程式部署至容器。 本節示範如何手動部署。
瀏覽至 dotnet-docker/samples/aspnetapp/aspnetapp 中的專案資料夾。
執行 dotnet publish 命令:
dotnet publish -c Release -o published
命令引數:
- 以發行模式建置應用程式 (預設為偵錯模式)。
- 在 [published] 資料夾中建立資產。
執行應用程式。
Windows:
dotnet published\aspnetapp.dll
Linux:
dotnet published/aspnetapp.dll
瀏覽至
http://localhost:5000
以查看 home 頁面。
若要在 Docker 容器內使用手動發佈的應用程式,請建立新的 Dockerfile 並使用 docker build .
命令來建置映像。
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
若要查看新的映像,請使用 docker images
命令。
Dockerfile
以下是您先前執行的 docker build
命令所使用的 Dockerfile。 它會以您在本節所做的相同方式,使用 dotnet publish
進行建置及部署。
# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /source
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore
# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
若要查看新的映像,請使用 docker images
命令。
Dockerfile
以下是您先前執行的 docker build
命令所使用的 Dockerfile。 它會以您在本節所做的相同方式,使用 dotnet publish
進行建置及部署。
# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /source
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore
# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
在上面的 Dockerfile 中,檔案 *.csproj
會複製並還原為不同的層級。 docker build
命令建置映像時,會使用內建快取。 如果 *.csproj
檔案自上次執行 docker build
命令後未曾變更,則 dotnet restore
命令就不需再次執行。 相對地,會重複使用對應 dotnet restore
層的內建快取。 如需詳細資訊,請參閱撰寫 Dockerfile 的最佳做法。
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
Dockerfile
以下是您先前執行的 docker build
命令所使用的 Dockerfile。 它會以您在本節所做的相同方式,使用 dotnet publish
進行建置及部署。
FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /app/aspnetapp
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app/aspnetapp/out ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
如上面的 Dockerfile 所顯示,檔案 *.csproj
會複製並還原為不同的層級。 docker build
命令建置映像時,會使用內建快取。 如果 *.csproj
檔案自上次執行 docker build
命令後未曾變更,則 dotnet restore
命令就不需再次執行。 相對地,會重複使用對應 dotnet restore
層的內建快取。 如需詳細資訊,請參閱撰寫 Dockerfile 的最佳做法。
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
WORKDIR /app
COPY published/ ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
Dockerfile
以下是您先前執行的 docker build
命令所使用的 Dockerfile。 它會以您在本節所做的相同方式,使用 dotnet publish
進行建置及部署。
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /app
# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore
# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /app/aspnetapp
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
WORKDIR /app
COPY --from=build /app/aspnetapp/out ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
在上面的 Dockerfile 中,檔案 *.csproj
會複製並還原為不同的層級。 docker build
命令建置映像時,會使用內建快取。 如果 *.csproj
檔案自上次執行 docker build
命令後未曾變更,則 dotnet restore
命令就不需再次執行。 相對地,會重複使用對應 dotnet restore
層的內建快取。 如需詳細資訊,請參閱撰寫 Dockerfile 的最佳做法。
其他資源
- 使用 dotnet publish 將 .NET 應用程式容器化
- Docker build 命令列 \(英文\)
- Docker run 命令列 \(英文\)
- ASP.NET Core Docker 範例 \(英文\) (本教學課程中所使用的範例。)
- 設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器
- 使用 Visual Studio Docker 工具
- 使用 Visual Studio Code 進行偵錯 \(英文\)
- 使用 Docker 和小型容器的 GC
- System.IO.IOException:已達到 Inotify 執行個體數目的已設定使用者限制 (128)
下一步
包含範例應用程式的 Git 存放庫也會包含文件。 如需存放庫中可用資源的概觀,請參閱讀我檔案 \(英文\)。 特別是了解如何實作 HTTPS: