在 Docker 容器中运行 ASP.NET Core 应用
注意
此版本不是本文的最新版本。 有关当前版本,请参阅本文的 .NET 9 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅此文的 .NET 8 版本。
本文演示如何在 Docker 容器中运行 ASP.NET Core 应用。
Windows Home Edition 不支持 Hyper-V,而 Docker 需要 Hyper-V。
有关使用 dotnet publish
容器化 .NET 应用的信息,请参阅使用 dotnet publish 容器化 .NET 应用。
ASP.NET Core Docker 映像
在本教程中,你下载 ASP.NET Core 示例应用并在 Docker 容器中运行它。 此示例适用于 Linux 和 Windows 容器。
示例 Dockerfile 使用 Docker 多阶段构建功能在不同的容器中生成和运行。 生成和运行容器是由 Microsoft 从 Docker 中心提供的映像中创建的:
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。
运行命令参数:
- 分配伪 TTY,即使未附加也使其保持打开状态。 (与
--interactive --tty
的效果相同。) - 容器在退出时自动删除。
- 将本地计算机上的
<port>
映射到容器中的端口 8080。 - 将容器命名为 aspnetcore_sample。
- 指定 aspnetapp 映像。
在浏览器中转到
http://localhost:<port>
以测试应用。
手动生成和部署
在某些情况下,你可能希望通过复制运行时所需的应用资产来将应用部署到容器中。 本部分演示如何手动进行部署。
导航到 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:<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
命令生成映像时,它将使用内置缓存。 如果自上次运行 docker build
命令后,*.csproj
文件未发生更改,则 dotnet restore
命令无需再次运行。 但是,将重复使用相应 dotnet restore
层的内置缓存。 有关详细信息,请参阅编写 Dockerfile 的最佳做法。
其他资源
- 使用 dotnet publish 容器化 .NET 应用
- Docker 生成命令
- Docker 运行命令
- ASP.NET Core Docker 示例(本教程中使用的示例。)
- 配置 ASP.NET Core 以使用代理服务器和负载均衡器
- 使用 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 多阶段构建功能在不同的容器中生成和运行。 生成和运行容器是由 Microsoft 从 Docker 中心提供的映像中创建的:
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。
运行命令参数:
- 分配伪 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
以查看 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
命令生成映像时,它将使用内置缓存。 如果自上次运行 docker build
命令后,*.csproj
文件未发生更改,则 dotnet restore
命令无需再次运行。 但是,将重复使用相应 dotnet restore
层的内置缓存。 有关详细信息,请参阅编写 Dockerfile 的最佳做法。
其他资源
- 使用 dotnet publish 容器化 .NET 应用
- Docker 生成命令
- Docker 运行命令
- ASP.NET Core Docker 示例(本教程中使用的示例。)
- 配置 ASP.NET Core 以使用代理服务器和负载均衡器
- 使用 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 多阶段构建功能在不同的容器中生成和运行。 生成和运行容器是由 Microsoft 从 Docker 中心提供的映像中创建的:
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。
运行命令参数:
- 分配伪 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
以查看 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
命令生成映像时,它将使用内置缓存。 如果自上次运行 docker build
命令后,*.csproj
文件未发生更改,则 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
命令生成映像时,它将使用内置缓存。 如果自上次运行 docker build
命令后,*.csproj
文件未发生更改,则 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
命令生成映像时,它将使用内置缓存。 如果自上次运行 docker build
命令后,*.csproj
文件未发生更改,则 dotnet restore
命令无需再次运行。 但是,将重复使用相应 dotnet restore
层的内置缓存。 有关详细信息,请参阅编写 Dockerfile 的最佳做法。
其他资源
- 使用 dotnet publish 容器化 .NET 应用
- Docker 生成命令
- Docker 运行命令
- ASP.NET Core Docker 示例(本教程中使用的示例。)
- 配置 ASP.NET Core 以使用代理服务器和负载均衡器
- 使用 Visual Studio Docker 工具
- 使用 Visual Studio Code 进行调试
- 使用 Docker 和小型容器的 GC
- System.IO.IOException:已达到配置的 inotify 实例数用户限制 (128)
后续步骤
包含示例应用的 Git 存储库还包括文档。 有关存储库中可用资源的概述,请参阅自述文件。 特别是,了解如何实现 HTTPS: