添加对容器的支持

可以在受支持的 Visual Studio 项目类型中添加对 Docker 容器的支持,例如 ASP.NET Web 项目和其他项目。 有关 Visual Studio 版本中支持的项目类型的信息,请参阅 概述

可以在受支持的 Visual Studio 项目类型中添加对 Docker 或 Podman 容器的支持,例如 ASP.NET Web 项目和其他项目。 有关 Visual Studio 版本中支持的项目类型的信息,请参阅 概述

先决条件

先决条件

先决条件

创建项目时添加容器支持

可以通过在创建新项目时选择 “启用 Docker 支持” 来启用对容器的支持,如以下屏幕截图所示:

显示如何在 Visual Studio 中为新的 ASP.NET Core Web 应用启用 Docker 支持的屏幕截图。

可以通过在创建新项目时选择 “启用容器支持”来启用对容器的支持 ,如以下屏幕截图所示:

显示如何在 Visual Studio 中为新的 ASP.NET Core Web 应用启用容器支持的屏幕截图。

注释

对于 .NET Framework 项目(而不是 .NET Core),只有 Windows 容器可用。

注释

创建 .NET Framework 或 .NET Core 控制台项目时,无法 选择添加 Docker 支持。 创建 .NET Core 控制台应用程序项目后,“ 添加 Docker 支持 ”选项可用。 创建项目后,.NET Framework 控制台应用程序项目不支持 “添加 Docker 支持 ”选项。 创建后,.NET Framework 或 .NET Core 控制台项目都支持使用 Service Fabric 或 Docker Compose 的“添加容器业务流程协调程序支持 ”选项。

注释

如果使用完整的 .NET Framework 控制台项目模板,则支持的选项是创建项目后 添加容器业务流程协调程序支持 ,以及使用 Service Fabric 或 Docker Compose 的选项。 在项目创建时添加支持,以及为不包含编排的单个项目添加Docker 支持不是可用的选项。

注释

对 .NET Framework 容器的支持已在 Visual Studio 的当前版本中停止使用。 .NET Framework 容器支持到 Visual Studio 2022 17.14。

向现有项目添加容器支持

可以通过在解决方案资源管理器中选择> Docker 支持”,将Docker 支持添加到现有项目。 “ 添加 > Docker 支持 ”和 “添加 > 容器业务流程协调程序支持 ”命令位于 解决方案资源管理器中 ASP.NET 核心项目的项目节点的右键单击菜单(或上下文菜单),如以下屏幕截图所示:

可以通过在解决方案资源管理器中选择>容器支持”,将 Docker 支持添加到现有项目。 “添加>容器支持”和“添加>容器业务流程协调程序支持”命令位于解决方案资源管理器中 ASP.NET 核心项目的项目节点的右键单击菜单(或上下文菜单),如以下屏幕截图所示:

显示 Visual Studio 中的“添加 Docker 支持”菜单选项的屏幕截图。

显示 Visual Studio 中的“添加容器支持”菜单选项的屏幕截图。

添加 Docker 支持

添加或启用 Docker 支持时,Visual Studio 会将以下内容添加到项目中:

  • Dockerfile 文件
  • 一个文件.dockerignore
  • Microsoft.VisualStudio.Azure.Containers.Tools.Targets 的 NuGet 包引用

添加的 Dockerfile 类似于以下代码。 在此示例中,该项目已命名 WebApplication-Docker,你选择了 Linux 容器:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY ["WebApplication-Docker/WebApplication-Docker.csproj", "WebApplication-Docker/"]
RUN dotnet restore "WebApplication-Docker/WebApplication-Docker.csproj"
COPY . .
WORKDIR "/src/WebApplication-Docker"
RUN dotnet build "WebApplication-Docker.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebApplication-Docker.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication-Docker.dll"]

选择容器生成类型和其他选项

向 .NET 7 或更高版本项目添加或启用容器支持时,Visual Studio 会显示 “容器基架选项 ”对话框,该对话框提供作系统(Linux 或 Windows)的选择,但也能够选择容器生成类型 (Dockerfile.NET SDK)。

还可以指定 容器映像发行版容器生成上下文

显示用于添加容器支持的“容器基架选项”对话框的屏幕截图。

容器映像分发版 指定容器用作基本映像的 OS 映像。 如果在 Linux 和 Windows 之间切换作为容器类型,则此列表会更改。

以下映像可用:

窗户:

  • Windows Nano Server(建议,仅适用于 8.0 及更高版本,不适用于本地预先(AOT)部署项目)
  • Windows Server Core (仅适用于 8.0 及更高版本)

Linux:

  • 默认值(Debian,但标记与目标 .NET 版本匹配)
  • Debian
  • Ubuntu
  • 精简版 Ubuntu
  • 高山

注释

基于 Chiseled Ubuntu 映像且使用 本机提前 (AOT) 部署 的容器只能在快速模式下进行调试。 请参阅 Visual Studio 中的自定义 Docker 容器

容器生成上下文 指定用于 docker build (或 podman build) 的文件夹。 请参阅 Docker 生成上下文Podman 生成。 默认值为建议的解决方案文件夹。 生成所需的所有文件都需要在此文件夹下,如果你选择项目文件夹或其他文件夹,则情况并非如此。

Dockerfile 容器生成类型

如果选择 Dockerfile 容器生成类型,Visual Studio 会将以下内容添加到项目中:

  • Dockerfile 文件
  • 一个文件.dockerignore
  • Microsoft.VisualStudio.Azure.Containers.Tools.Targets 的 NuGet 包引用

添加的 Dockerfile 类似于以下代码。 在此示例中,该项目已命名 WebApplication-Docker,你选择了 Linux 容器:

# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

# This stage is used when running from VS in fast mode (Default for Debug configuration)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081


# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["WebApplication15-AddContainerSupport/WebApplication15-AddContainerSupport.csproj", "WebApplication15-AddContainerSupport/"]
RUN dotnet restore "./WebApplication15-AddContainerSupport/WebApplication15-AddContainerSupport.csproj"
COPY . .
WORKDIR "/src/WebApplication15-AddContainerSupport"
RUN dotnet build "./WebApplication15-AddContainerSupport.csproj" -c $BUILD_CONFIGURATION -o /app/build

# This stage is used to publish the service project to be copied to the final stage
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./WebApplication15-AddContainerSupport.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

# This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication15-AddContainerSupport.dll"]

.NET SDK 容器生成类型

可以使用 .NET SDK 对容器生成的内置支持,这意味着不需要 Dockerfile;请参阅 使用 dotnet publish 容器化 .NET 应用。 而是通过配置项目文件中的 MSBuild 属性来设置容器,并将使用 Visual Studio 启动容器的设置编写在 launchSettings.json 配置文件中。

显示用于添加 Docker 支持且选择 .NET SDK 作为容器生成类型的“容器基架选项”对话框的屏幕截图。

在这里,选择 .NET SDK 作为容器生成类型,以使用 .NET SDK 的容器管理而不是 Dockerfile。

容器映像分发版 指定容器用作基本映像的 OS 映像。 如果以容器的形式在 Linux 和 Windows 之间切换,则此列表会更改。 有关可用映像的列表,请参阅上一部分。

launchSettings.json 中的 .NET SDK 容器生成条目类似于以下代码:

"Container (.NET SDK)": {
  "commandName": "SdkContainer",
  "launchBrowser": true,
  "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
  "environmentVariables": {
    "ASPNETCORE_HTTPS_PORTS": "8081",
    "ASPNETCORE_HTTP_PORTS": "8080"
  },
  "publishAllPorts": true,
  "useSSL": true
}

.NET SDK 管理已在 Dockerfile 中编码的某些设置,例如容器基础映像和要设置的环境变量。 项目文件中可用于容器配置的设置列在自定义您的容器中。 例如,容器映像发行版 作为 ContainerBaseImage 属性保存在项目文件中。 稍后可以通过编辑项目文件来更改它。

<PropertyGroup>
    <ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:8.0-alpine-amd64</ContainerBaseImage>
</PropertyGroup>

选择容器生成类型和其他选项

向 .NET 7 或更高版本项目添加或启用 Docker 支持时,Visual Studio 会显示 “容器基架选项 ”对话框,该对话框提供了作系统(Linux 或 Windows)的选择,但也能够选择容器生成类型 (Dockerfile.NET SDK)。 此对话框不会显示在 .NET Framework 项目中。

在 17.11 及更高版本中,还可以指定 容器映像发行版Docker 生成上下文

显示用于添加 Docker 支持的容器基架选项对话框的屏幕截图。

容器映像分发版 指定容器用作基本映像的 OS 映像。 如果在 Linux 和 Windows 之间切换作为容器类型,则此列表会更改。

以下映像可用:

窗户:

  • Windows Nano Server(建议,仅适用于 8.0 及更高版本,不支持 本机提前编译(AOT)部署 项目)
  • Windows Server Core (仅适用于 8.0 及更高版本)

Linux:

  • 默认值(Debian,但标记为“8.0”)
  • Debian
  • Ubuntu
  • Chiseled Ubuntu
  • 高山

注释

基于 Chiseled Ubuntu 映像且使用 本机提前 (AOT) 部署 的容器只能在快速模式下进行调试。 请参阅 Visual Studio 中的自定义 Docker 容器

Docker 生成上下文 指定用于 Docker 生成的文件夹。 请参阅 Docker 生成上下文。 默认值为建议的解决方案文件夹。 生成所需的所有文件都需要在此文件夹下,如果你选择项目文件夹或其他文件夹,则情况并非如此。

Dockerfile 容器生成类型

如果选择 Dockerfile 容器生成类型,Visual Studio 会将以下内容添加到项目中:

  • Dockerfile 文件
  • 一个文件.dockerignore
  • Microsoft.VisualStudio.Azure.Containers.Tools.Targets 的 NuGet 包引用

添加的 Dockerfile 类似于以下代码。 在此示例中,该项目已命名 WebApplication-Docker,你选择了 Linux 容器:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["WebApplication-Docker/WebApplication-Docker.csproj", "WebApplication-Docker/"]
RUN dotnet restore "WebApplication-Docker/WebApplication-Docker.csproj"
COPY . .
WORKDIR "/src/WebApplication-Docker"
RUN dotnet build "WebApplication-Docker.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebApplication-Docker.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication-Docker.dll"]

.NET SDK 容器生成类型

安装 Visual Studio 2022 17.9 及更高版本的 .NET 7 SDK 后,在面向 .NET 6 或更高版本的 ASP.NET Core 项目中,可以选择使用 .NET SDK 的内置支持容器生成,这意味着不需要 Dockerfile;请参阅 使用 dotnet publish 容器化 .NET 应用。 而是通过配置项目文件中的 MSBuild 属性来设置容器,并将使用 Visual Studio 启动容器的设置编写在 launchSettings.json 配置文件中。

显示用于添加 Docker 支持且选择 .NET SDK 作为容器生成类型的“容器基架选项”对话框的屏幕截图。

在这里,选择 .NET SDK 作为容器生成类型,以使用 .NET SDK 的容器管理而不是 Dockerfile。

容器映像分发版 指定容器用作基本映像的 OS 映像。 如果以容器的形式在 Linux 和 Windows 之间切换,则此列表会更改。 有关可用映像的列表,请参阅上一部分。

launchSettings.json 中的 .NET SDK 容器生成条目类似于以下代码:

"Container (.NET SDK)": {
  "commandName": "SdkContainer",
  "launchBrowser": true,
  "launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
  "environmentVariables": {
    "ASPNETCORE_HTTPS_PORTS": "8081",
    "ASPNETCORE_HTTP_PORTS": "8080"
  },
  "publishAllPorts": true,
  "useSSL": true
}

.NET SDK 管理已在 Dockerfile 中编码的某些设置,例如容器基础映像和要设置的环境变量。 项目文件中可用于容器配置的设置列在自定义您的容器中。 例如,容器映像发行版 作为 ContainerBaseImage 属性保存在项目文件中。 稍后可以通过编辑项目文件来更改它。

<PropertyGroup>
    <ContainerBaseImage>mcr.microsoft.com/dotnet/runtime:8.0-alpine-amd64</ContainerBaseImage>
</PropertyGroup>

后续步骤

有关用于处理容器的服务实现和使用 Visual Studio 工具的更多详细信息,请阅读以下文章:

Visual Studio 中的 Docker

在本地容器中调试应用

使用 Visual Studio 将 ASP.NET 容器部署到容器注册表

部署到 Azure 应用程序服务

使用 Visual Studio 部署到 Azure 容器应用