.NET 和 Docker 简介

容器是部署和承载云应用程序的最常用方法之一,可使用 DockerKubernetesPodman 等工具。 许多开发人员选择容器,因为用它可以直接将应用与其依赖项打包,并让该应用可靠地在任何容器主机上运行。 将 .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-dockerdotnet/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_PORTSASPNETCORE_HTTPS_PORTSASPNETCORE_URLS 环境变量可用于配置此行为。

用户

从 .NET 8 开始,所有映像都包含一个名为 app 的非根用户。 默认情况下,chiseled 映像的配置中启用了此用户。 发布应用作为 .NET 容器功能(在“生成容器映像”部分中有演示)也会将映像配置为默认启用此用户。 在所有其他方案中,可以手动设置 app 用户,例如使用 USERDockerfile 指令。 如果映像已配置 app,并且命令需要作为 root 运行,则可以使用 USER 指令将用户设置为 root

随时了解情况

容器相关的新闻会发布到 dotnet/dotnet-docker 讨论.NET 博客“容器”类别

Azure 服务

各种 Azure 服务都支持容器。 为应用程序创建 Docker 映像并将其部署到以下服务之一:

后续步骤