可以在受支持的 Visual Studio 项目类型中添加对 Docker 容器的支持,例如 ASP.NET Web 项目和其他项目。 有关 Visual Studio 版本中支持的项目类型的信息,请参阅 概述 。
可以在受支持的 Visual Studio 项目类型中添加对 Docker 或 Podman 容器的支持,例如 ASP.NET Web 项目和其他项目。 有关 Visual Studio 版本中支持的项目类型的信息,请参阅 概述 。
先决条件
- Docker Desktop
- 安装了 ASP.NET 和 Web 开发、Azure 开发工作负载和/或 .NET Core 跨平台开发工作负载的 Visual Studio 2019 或更高版本。
- 用于使用 .NET Core 进行开发的 .NET Core 开发工具 。
- 若要发布到 Azure 容器注册表,需要一个 Azure 订阅。 注册免费试用版。
先决条件
- Docker Desktop
- 安装了 ASP.NET 和 Web 开发、Azure 开发工作负载和/或 .NET 桌面开发工作负载的 Visual Studio。
- 要发布到 Azure 容器注册表,您需要一个 Azure 订阅。 注册免费试用版。
先决条件
- Docker Desktop 或 Podman Desktop。
- Visual Studio 或,对于 Podman 支持,已安装 Visual Studio(内部预览版) 的 ASP.NET 和 Web 开发、Azure 开发 工作负载和/或 .NET 桌面开发 工作负载。
- 发布到 Azure 容器注册表需要 Azure 订阅。 注册免费试用版。
创建项目时添加容器支持
可以通过在创建新项目时选择 “启用 Docker 支持” 来启用对容器的支持,如以下屏幕截图所示:
可以通过在创建新项目时选择 “启用容器支持”来启用对容器的支持 ,如以下屏幕截图所示:
注释
对于 .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 核心项目的项目节点的右键单击菜单(或上下文菜单),如以下屏幕截图所示:
添加 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 配置文件中。
在这里,选择 .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 生成上下文。
容器映像分发版 指定容器用作基本映像的 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 配置文件中。
在这里,选择 .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 将 ASP.NET 容器部署到容器注册表
使用 Visual Studio 部署到 Azure 容器应用