本教程重点介绍了如何在 Docker 上使用 .NET Core。 首先,我们探讨 Microsoft 维护和提供的各种不同的 Docker 映像,及其使用情况。 然后讲解了如何生成和 Docker 化 ASP.NET Core 应用。
在本教程中可学习:
为开发人员生成 Docker 映像时,侧重于以下三种主要方案:
为什么是三个映像? 因为在开发、生成和运行容器化应用程序时,具有不同的优先级。
例如,dotnet publish
输出包含:
在生产映像中包括 dotnet publish
命令输出的原因是使生产映像保持最小大小。
某些 .NET Core 映像共享不同标记之间的层,因此下载最新标记是一个相对轻量的过程。 如果计算机上已有较早版本,此体系结构会降低所需的磁盘空间。
当多个应用程序在同一计算机上使用公共映像时,在公共映像之间共享内存。 映像必须相同才可共享。
为了实现上述目标,我们在 microsoft/dotnet
下提供了映像变体。
microsoft/dotnet:<version>-sdk
(microsoft/dotnet:2.1-sdk
) 此映像包含带有 .NET Core 和命令行工具 (CLI) 的 .NET Core SDK。 此映像将映射到开发方案。 可使用此映像进行本地开发、调试和单元测试。 此映像还可用于生成方案。 使用 microsoft/dotnet:sdk
始终都提供最新版本。提示
如果不确定自己的需求,需使用 microsoft/dotnet:<version>-sdk
映像。 作为“实际”映像,它旨在用作一次性容器(装载源代码并启动容器以启动应用)以及生成其他映像的基础映像。
microsoft/dotnet:<version>-runtime
:此映像包含 .NET Core(运行时和库),并且针对在生产环境中运行 .NET Core 应用进行了优化。除了开发、生成和生产的优化方案外,我们还提供了其他映像:
microsoft/dotnet:<version>-runtime-deps
:runtime-deps 映像包括具有 .NET Core 所需的所有本机依赖项的操作系统。 此映像适用于独立应用程序。每个变体的最新版本:
microsoft/dotnet
或 microsoft/dotnet:latest
(SDK 映像的别名)microsoft/dotnet:sdk
microsoft/dotnet:runtime
microsoft/dotnet:runtime-deps
代理服务器、负载均衡器和其他网络设备通常会在请求到达容器化应用之前隐藏有关请求的信息:
此信息在请求处理中可能很重要,例如在重定向、身份验证、链接生成、策略评估和客户端地理位置中。
要将方案和原始 IP 地址转发到 ASP.NET Core 容器化应用,请使用 Forwarded Headers 中间件。 有关详细信息,请参阅配置 ASP.NET Core 以使用代理服务器和负载均衡器。
本教程对要 Docker 化的应用使用 ASP.NET Core Docker 示例应用程序。 此 ASP.NET Core Docker 示例应用程序演示了生成 ASP.NET Core 应用程序的 Docker 映像以用于生产的最佳做法模式。 此示例适用于 Linux 和 Windows 容器。
该示例 Dockerfile 基于 ASP.NET Core 运行时 Docker 基础映像创建 ASP.NET Core 应用程序 Docker 映像。
它使用 Docker 多阶段生成功能完成以下操作:
备注
生成映像包含生成应用程序所需的工具,而运行时映像不包括这些工具。
要进行生成并运行,请安装以下各项:
提示
需要安装代码编辑器? 试用 Visual Studio!
安装 Docker 18.03 或更高版本的 Docker 客户端。
可在以下位置安装 Docker 客户端:
获取该示例的最简单方法是使用以下指令克隆包含 git 的 .NET Core Docker 存储库:
1 2 |
git clone https://github.com/dotnet/dotnet-docker |
也可以从 .NET Core Docker 存储库中下载 zip 格式的存储库(其大小较小)。
对于引用点,在容器化应用程序之前,请先在本地运行应用程序。
可使用以下命令,通过 .NET Core 2.1 SDK 在本地生成和运行应用程序(这些指令假定使用存储库的根目录):
1 2 3 4 5 6 7 |
cd dotnet-docker cd samples cd aspnetapp // solution scope where the dockerfile is located cd aspnetapp // project scope dotnet run |
应用程序启动后,在 Web 浏览器中访问 http://localhost:5000。
可使用以下命令,通过 Linux 容器在 Docker 中生成和运行示例(这些指令假定使用存储库的根目录):
1 2 3 4 5 6 7 |
cd dotnet-docker cd samples cd aspnetapp // solution scope where the dockerfile is located docker build -t aspnetapp . docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp |
备注
docker run
的“-p”参数将本地计算机上的端口 5000 映射到容器中的端口 80(该端口映射形式为 host:container
)。 有关详细信息,请参阅命令行参数中的 docker run 引用。
应用程序启动后,在 Web 浏览器中访问 http://localhost:5000。
可使用以下命令,通过 Windows 容器在 Docker 中生成和运行示例(这些指令假定使用存储库的根目录):
1 2 3 4 5 6 7 |
cd dotnet-docker cd samples cd aspnetapp // solution scope where the dockerfile is located docker build -t aspnetapp . docker run -it --rm --name aspnetcore_sample aspnetapp |
重要
使用 Windows 容器时,必须直接在浏览器中转到容器 IP 地址(而不是 http://localhost))。 可通过以下步骤获取容器的 IP 地址:
docker ps
,查看正在运行的容器。 其中应包含“Aspnetcore_sample”。docker exec aspnetcore_sample ipconfig
。备注
Docker exec 支持通过名称或哈希标识容器。 示例中使用了名称 (aspnetcore_sample)。
请查看以下示例,了解如何获取正在运行的 Windows 容器的 IP 地址。
1 2 3 4 5 6 7 8 9 10 11 12 |
docker exec aspnetcore_sample ipconfig Windows IP Configuration 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 |
备注
Docker exec 在正在运行的容器中运行新命令。 有关详细信息,请参阅命令行参数中的 docker exec 引用。
可使用 dotnet publish 命令生成已准备好在本地部署到生产环境的应用程序。
1 2 |
dotnet publish -c Release -o published |
备注
-c Release 参数用于在发布模式(默认为调试模式)下生成应用程序。 有关详细信息,请参阅命令行参数中的 dotnet run 引用。
可使用以下命令在 Windows 中运行应用程序。
1 2 |
dotnet published\aspnetapp.dll |
可使用以下命令在 Linux 或 macOS 中运行应用程序。
1 2 |
dotnet published/aspnetapp.dll |
此示例的 dockerfile 中使用了以下 Docker 映像。
microsoft/dotnet:2.1-sdk
microsoft/dotnet:2.1-aspnetcore-runtime
祝贺你! 你刚才已:
后续步骤
下面是一些可以采取的后续步骤:
from:https://docs.microsoft.com/zh-cn/dotnet/core/docker/building-net-docker-images