本教程演示如何在 Docker 容器中运行 ASP.NET Core 应用。
在本教程中,你将了解:
在本教程中,你下载 ASP.NET Core 示例应用并在 Docker 容器中运行它。 此示例适用于 Linux 和 Windows 容器。
示例 Dockerfile 使用 Docker 多阶段构建功能在不同的容器中生成和运行。 生成和运行容器是由 Microsoft 从 Docker 中心提供的映像中创建的:
dotnet/core/sdk
此示例将此映像用于生成应用。 此映像包含带有命令行工具 (CLI) 的 .NET Core SDK。 此映像对本地开发、调试和单元测试进行了优化。 为开发和编译而安装的工具使其成为一个相对较大的映像。
dotnet/core/aspnet
此示例将此映像用于运行应用。 此映像包含 ASP.NET Core 运行时和库,并针对在生产中运行应用进行了优化。 此映像专为部署和应用启动的速度而设计,相对较小,因此优化了从 Docker 注册表到 Docker 主机的网络性能。 仅将运行应用所需的二进制文件和内容复制到容器。 已准备运行内容,以此实现从 Docker run
到应用启动的最快时间。 Docker 模型中不需要动态代码编译。
1 2 |
git clone https://github.com/dotnet/dotnet-docker |
1 2 |
<span class="hljs-keyword">dotnet</span> <span class="hljs-keyword">run</span> |
http://localhost:5000
以测试应用。
1 2 3 |
docker build -t aspnetapp . docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp |
build
命令参数:
运行命令参数:
--interactive --tty
的效果相同。)http://localhost:5000
以测试应用。导航到 dotnet-docker/samples/aspnetapp
下的 docker 文件文件夹。
1 2 3 |
docker build -t aspnetapp . docker run -it --rm --name aspnetcore_sample aspnetapp |
http://localhost:5000
不起作用):
docker ps
以查看正在运行的容器。 验证其中是否包含“aspnetcore_sample”容器。docker exec aspnetcore_sample ipconfig
以显示容器的 IP 地址。 该命令的输出如以下示例所示:
1 2 3 4 5 6 7 8 |
Ethernet adapter Ethernet: Connection-specific DNS Suffix . : contoso.com Link-local IPv6 Address . . . . . : fe80::1967:6598:124:cfa3%4 IPv4 Address. . . . . . . . . . . : 172.29.245.43 Subnet Mask . . . . . . . . . . . : 255.255.240.0 Default Gateway . . . . . . . . . : 172.29.240.1 |
在某些情况下,你可能希望通过将运行时所需的应用程序文件复制到容器来将应用部署到容器。 本部分演示如何手动进行部署。
1 2 |
<span class="hljs-keyword">dotnet</span> <span class="hljs-keyword">publish</span><span class="hljs-parameter"> -c</span> Release<span class="hljs-parameter"> -o</span> published |
命令参数:
1 2 |
<span class="hljs-keyword">dotnet</span> published\aspnetapp.dll |
1 2 |
<span class="hljs-keyword">dotnet</span> published/aspnetapp.dll |
http://localhost:5000
以查看主页。要在 Docker 容器中使用手动发布的应用程序,请创建新的 Dockerfile,并使用 docker build .
命令构建容器。
1 2 3 4 5 |
<span class="hljs-keyword">FROM</span> mcr.microsoft.com/dotnet/core/aspnet:<span class="hljs-number">3.0</span> AS runtime <span class="hljs-keyword">WORKDIR</span><span class="bash"> /app</span> <span class="hljs-keyword">COPY</span><span class="bash"> published/aspnetapp.dll ./</span> <span class="hljs-keyword">ENTRYPOINT</span><span class="bash"> [<span class="hljs-string">"dotnet"</span>, <span class="hljs-string">"aspnetapp.dll"</span>]</span> |
下面是先前运行的 docker build
命令使用的 Dockerfile 。 它以本部分中所用的方式使用 dotnet publish
进行生成和部署。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span class="hljs-keyword">FROM</span> mcr.microsoft.com/dotnet/core/sdk:<span class="hljs-number">3.0</span> AS build <span class="hljs-keyword">WORKDIR</span><span class="bash"> /app</span> <span class="hljs-comment"># copy csproj and restore as distinct layers</span> <span class="hljs-keyword">COPY</span><span class="bash"> *.sln .</span> <span class="hljs-keyword">COPY</span><span class="bash"> aspnetapp/*.csproj ./aspnetapp/</span> <span class="hljs-keyword">RUN</span><span class="bash"> dotnet restore</span> <span class="hljs-comment"># copy everything else and build app</span> <span class="hljs-keyword">COPY</span><span class="bash"> aspnetapp/. ./aspnetapp/</span> <span class="hljs-keyword">WORKDIR</span><span class="bash"> /app/aspnetapp</span> <span class="hljs-keyword">RUN</span><span class="bash"> dotnet publish -c Release -o out</span> <span class="hljs-keyword">FROM</span> mcr.microsoft.com/dotnet/core/aspnet:<span class="hljs-number">3.0</span> AS runtime <span class="hljs-keyword">WORKDIR</span><span class="bash"> /app</span> <span class="hljs-keyword">COPY</span><span class="bash"> --from=build /app/aspnetapp/out ./</span> <span class="hljs-keyword">ENTRYPOINT</span><span class="bash"> [<span class="hljs-string">"dotnet"</span>, <span class="hljs-string">"aspnetapp.dll"</span>]</span> |
如前面的 Dockerfile 中所述,将 *.csproj
文件作为不同的层进行复制和还原 。 当 docker build
命令生成映像时,它将使用内置缓存。 如果自上次运行 docker build
命令后,*.csproj
文件未发生更改,则 dotnet restore
命令无需再次运行。 但是,将重复使用相应 dotnet restore
层的内置缓存。 有关详细信息,请参阅编写 Dockerfile 的最佳做法。
包含示例应用的 Git 存储库还包括文档。 有关存储库中可用资源的概述,请参阅自述文件。 特别是,了解如何实现 HTTPS:
from:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-3.1