.NET 和 Docker 简介
容器是部署和承载云应用程序的最常用方法之一,可使用 Docker、Kubernetes 和 Podman 等工具。 许多开发人员选择容器,因为用它可以直接将应用与其依赖项打包,并让该应用可靠地在任何容器主机上运行。 将 .NET 与容器配合使用具有广泛的支持。
Docker 提供了对容器的极佳概览。 Docker Desktop: Community Edition 是在开发人员桌面计算机上使用容器的好工具。
.NET 映像
官方 .NET 容器映像发布到 Microsoft 工件注册表,可在 Docker Hub 上发现。 有用于生产的运行时映像和用于生成代码的 SDK 映像,适用于 Linux(Alpine、Debian、Ubuntu、Mariner)和 Windows。 有关详细信息,请参阅 .NET 容器映像。
每当发布新的 .NET 补丁或更新操作系统基础映像时,.NET 映像都会定期更新。
Chiseled 容器映像是 Ubuntu 容器映像,其中包含 .NET 运行时所需的最小组件集。 这些映像比常规 Ubuntu 映像小约 100 MB,并且 CVE 更少,因为它们的组件较少。 具体而言,它们不包含 shell 或包管理器,这显著提高了其安全性。 它们还包含一个非根用户,并在配置中启用了该用户。
构建容器映像
可以使用 Dockerfile 生成容器映像,或者依赖于 .NET SDK 来生成映像。 有关生成映像的示例,请参阅 dotnet/dotnet-docker 和 dotnet/sdk-container-builds。
以下示例演示了如何通过几个快速步骤生成和运行容器映像(支持 .NET 8 和 .NET 7.0.300)。
$ dotnet new webapp -o webapp
$ cd webapp/
$ dotnet publish -t:PublishContainer
MSBuild version 17.8.3+195e7f5a3 for .NET
Determining projects to restore...
All projects are up-to-date for restore.
webapp -> /home/rich/webapp/bin/Release/net8.0/webapp.dll
webapp -> /home/rich/webapp/bin/Release/net8.0/publish/
Building image 'webapp' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
Pushed image 'webapp:latest' to local registry via 'docker'.
$ docker run --rm -d -p 8000:8080 webapp
7c7ad33409e52ddd3a9d330902acdd49845ca4575e39a6494952b642e584016e
$ curl -s http://localhost:8000 | grep ASP.NET
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c7ad33409e5 webapp "dotnet webapp.dll" About a minute ago Up About a minute 0.0.0.0:8000->8080/tcp, :::8000->8080/tcp jovial_shtern
$ docker kill 7c7ad33409e5
docker init
是想要使用 Dockerfiles 的开发人员的新选项。
端口
端口映射是使用容器的一个关键部分。 必须在容器外部发布端口才能响应外部 Web 请求。 .NET 8 中的 ASP.NET Core 容器映像已更改为默认在端口 8080
上侦听。 .NET 6 和 7 侦听端口 80
。
在前面的 docker run
示例中,主机端口 8000
映射到容器端口 8080
。 Kubernetes 的工作方式类似。
ASPNETCORE_HTTP_PORTS
、ASPNETCORE_HTTPS_PORTS
、ASPNETCORE_URLS
环境变量可用于配置此行为。
用户
从 .NET 8 开始,所有映像都包含一个名为 app
的非根用户。 默认情况下,chiseled 映像的配置中启用了此用户。 发布应用作为 .NET 容器功能(在“生成容器映像”部分中有演示)也会将映像配置为默认启用此用户。 在所有其他方案中,可以手动设置 app
用户,例如使用 USER
Dockerfile 指令。 如果映像已配置 app
,并且命令需要作为 root
运行,则可以使用 USER
指令将用户设置为 root
。
随时了解情况
容器相关的新闻会发布到 dotnet/dotnet-docker 讨论 和 .NET 博客“容器”类别。
Azure 服务
各种 Azure 服务都支持容器。 为应用程序创建 Docker 映像并将其部署到以下服务之一:
Azure Kubernetes 服务 (AKS)
使用 Kubernetes 缩放和编排 Windows 和 Linux 容器。Azure 应用服务
在 PaaS 环境中使用容器部署 Web 应用或 API。Azure Container Apps
在不管理服务器、业务流程或基础结构的情况下运行容器工作负载,并利用对 Dapr 和 KEDA 的本机支持来实现可观测性和缩放到零。Azure 容器实例
在云中创建单独的容器,而不使用任何高级管理服务。Azure Batch
使用容器运行重复的计算作业。Azure Service Fabric
使用 Windows 和 Linux 容器将 .NET 应用程序提升、转换并新式化为微服务。Azure 容器注册表
在所有类型的 Azure 部署中存储和管理容器映像。