ASP.NET Core 的 Docker 映像
本文說明如何在 Docker 容器中執行 ASP.NET Core應用程式。
Windows Home 版本不支援 Hyper-V,而且 Docker 需要 Hyper-V。
如需使用 容器化 .NET 應用程式的詳細資訊,請參閱 使用 dotnet publish 將 .NET 應用程式dotnet publish
容器化。
ASP.NET Core Docker 映像
針對本教學課程,您可以下載 ASP.NET Core 範例應用程式,並在 Docker 容器中執行它。 該範例可與 Linux 或 Windows 容器搭配使用。
範例 Dockerfile 會使用 Docker 多階段建置功能 \(英文\),在不同容器中建置並執行。 建置和執行容器會從 Docker Hub 中 Microsoft 所提供的映像來建置:
dotnet/sdk
範例會使用此映像來建置應用程式。 映射包含 .NET SDK,其中包含命令列工具 (CLI) 。 此映像會最佳化來進行本機開發、偵錯和單元測試。 安裝用於開發和編譯的工具會使映射變得相當大。
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
命令引數:
- 在發行模式中建置應用程式, (預設值為偵錯模式) 。
- 在 已發佈 的資料夾中建立資產。
執行應用程式。
Windows:
dotnet published\aspnetapp.dll
Linux:
dotnet published/aspnetapp.dll
瀏覽至
http://localhost:5000
以查看首頁。
若要在 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"]
在上述 Dockerfile中,檔案 *.csproj
會複製並還原為相異 層。 docker build
當命令建置映射時,它會使用內建快取。 *.csproj
如果檔案自上次執行後 docker build
尚未變更,命令 dotnet restore
就不需要再次執行。 相反地,會重複使用對應 dotnet restore
圖層的內建快取。 如需詳細資訊,請參閱 撰寫 Dockerfiles 的最佳做法。
其他資源
- 使用 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:
ASP.NET Core Docker 映像
針對本教學課程,您可以下載 ASP.NET Core 範例應用程式,並在 Docker 容器中執行它。 該範例可與 Linux 或 Windows 容器搭配使用。
範例 Dockerfile 會使用 Docker 多階段建置功能 \(英文\),在不同容器中建置並執行。 建置和執行容器會從 Docker Hub 中 Microsoft 所提供的映像來建置:
dotnet/sdk
範例會使用此映像來建置應用程式。 映射包含 .NET SDK,其中包含命令列工具 (CLI) 。 此映像會最佳化來進行本機開發、偵錯和單元測試。 安裝用於開發和編譯的工具會使映射變得相對大。
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
命令引數:
- 以發行模式建置應用程式, (預設值為偵錯模式) 。
- 在 已發佈 的資料夾中建立資產。
執行應用程式。
Windows:
dotnet published\aspnetapp.dll
Linux:
dotnet published/aspnetapp.dll
瀏覽至
http://localhost:5000
以查看首頁。
若要在 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
圖層的內建快取。 如需詳細資訊,請參閱 撰寫 Dockerfiles 的最佳做法。
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
圖層的內建快取。 如需詳細資訊,請參閱 撰寫 Dockerfiles 的最佳做法。
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
圖層的內建快取。 如需詳細資訊,請參閱 撰寫 Dockerfiles 的最佳做法。
其他資源
- 使用 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: