.NET 和 Docker 简介
容器是部署和托管云应用程序的最常用方法之一,包括 docker、Kubernetes和 Podman等工具。 许多开发人员选择容器,因为它直接使用其依赖项打包应用,并让该应用可靠地在任何容器主机上运行。 将 .NET 与容器配合使用具有广泛的支持。
Docker 提供了对容器的极佳概览。 Docker Desktop:Community Edition 是用于在开发人员桌面计算机上使用容器的好工具。
.NET 映像
官方 .NET 容器映像发布到 Microsoft Artifact Registry,可在 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 容器应用
在不管理服务器、业务流程或基础结构的情况下运行容器工作负载,并利用对 Dapr 和 KEDA 的本机支持来实现可观测性和缩放到零。Azure 容器实例
在云中创建单个容器,而无需任何更高级别的管理服务。Azure Batch
使用容器运行重复计算作业。Azure服务结构
使用 Windows & Linux 容器将 .NET 应用程序提升、转移和现代化到微服务。Azure 容器注册表
跨所有类型的 Azure 部署存储和管理容器映像。