Visual Studio Container Tools for Docker
Visual Studio 中用于使用 Docker 容器进行开发的工具易于使用,并大大简化了生成、调试和部署容器化应用程序的过程。 可以将容器用于单个项目,也可以将容器业务流程与 Docker Compose 或 Service Fabric 结合使用,以便使用容器中的多个服务。
先决条件
- Docker Desktop
- 安装了“Web 开发”、“Azure 工具”工作负载和/或“.NET Core 跨平台开发”工作负载的 Visual Studio 2019
- 用于使用 .NET Core 进行开发的 .NET Core 开发工具。
- 若要发布到 Azure 容器注册表,需要 Azure 订阅。 注册免费试用版。
Visual Studio 中的 Docker 支持
Docker 支持适用于 ASP.NET 项目、ASP.NET Core 项目,以及 .NET Core 和 .NET Framework 控制台项目。
Visual Studio 中的 Docker 支持因版本而异,以响应客户需求。 可以向项目添加两个级别的 Docker 支持,并且受支持的选项因项目类型和 Visual Studio 版本而异。 借助某些受支持的项目类型,如果只想将容器用于单个项目,而不使用业务流程,则可以通过添加 Docker 支持来完成。 下一级别是容器业务流程支持,该支持可为所选的特定业务流程协调程序添加相应的支持文件。
借助 Visual Studio 2019,可以将 Docker Compose、Kubernetes 和 Service Fabric 用作容器业务流程服务。
注意
创建 .NET Framework 或 .NET Core 控制台项目时,没有“添加 Docker 支持”选项。 创建 .NET Core 控制台应用程序项目后,“添加 Docker 支持”选项将可用。 创建项目后,.NET Framework 控制台应用程序项目不支持“添加 Docker 支持”选项。 创建 .NET Framework 或 .NET Core 控制台项目后,使用 Service Fabric 或 Docker Compose 支持“添加容器业务流程协调程序支持”选项。
在 Visual Studio 2019 版本 16.4 及更高版本中,提供了“容器”窗口,你可用它来查看正在运行的容器,浏览可用的映像,查看环境变量、日志和端口映射,检查文件系统,附加调试器,或者在容器环境中打开终端窗口。 请参阅使用“容器”窗口。
先决条件
- Docker Desktop
- 安装了“Web 开发”、“Azure 工具”工作负载和/或“.NET 桌面开发”工作负载的 Visual Studio 2022
- 若要发布到 Azure 容器注册表,需要 Azure 订阅。 注册免费试用版。
Visual Studio 中的 Docker 支持
Docker 支持适用于 ASP.NET 项目、ASP.NET Core 项目,以及 .NET Core 和 .NET Framework 控制台项目。
Visual Studio 中的 Docker 支持因版本而异,以响应客户需求。 有几个选项可用于向项目添加 Docker 支持,并且受支持的选项因项目类型和 Visual Studio 版本而异。 借助某些受支持的项目类型,如果只想将容器用于单个项目,而不使用业务流程,则可以通过添加 Docker 支持来完成。 下一级别是容器业务流程支持,该支持可为所选的特定业务流程协调程序添加相应的支持文件。
在使用 Visual Studio 2022 版本 17.9 及更高版本的情况下,当你向 .NET 7 或更高版本的项目添加 Docker 支持时,有两种容器生成类型可供选择用来添加 Docker 支持。 可以选择添加 Dockerfile 以指定如何生成容器映像,也可以选择使用 .NET SDK 提供的内置容器支持。
在使用 Visual Studio 2022 及更高版本的情况下,当你选择容器业务流程时,可将 Docker Compose 或 Service Fabric 用作容器业务流程服务。
注意
如果你使用完整的 .NET Framework 控制台项目模板,则在创建项目后,支持的选项是“添加容器业务流程协调程序支持”,它包括使用 Service Fabric 或 Docker Compose 的选项。 对于没有业务流程的单个项目,无法在项目创建时添加支持,也无法添加 Docker 支持。
在 Visual Studio 2022 中,提供了“容器”窗口,你可用它来查看正在运行的容器,浏览可用的映像,查看环境变量、日志和端口映射,检查文件系统,附加调试器,或者在容器环境中打开终端窗口。 请参阅使用“容器”窗口。
注意
对于不同版本的 Docker Desktop,Docker 的许可要求可能有所不同。 请参阅 Docker 文档,了解在你的情况下使用 Docker Desktop 版本进行开发的当前许可要求。
添加 Docker 支持
可以通过在创建新项目时选择“启用 Docker 支持”来在项目创建期间启用 Docker 支持,如以下屏幕截图所示:
注意
对于 .NET Framework 项目(而不是 .NET Core),只有 Windows 容器可用。
可以通过在“解决方案资源管理器”中选择“添加”>“Docker 支持”来向现有项目添加 Docker 支持。 “添加”>“Docker 支持”和“添加”>“容器业务流程协调程序支持”命令位于“解决方案资源管理器”中 ASP.NET Core 项目的项目节点的右键单击菜单(或上下文菜单)上,如以下屏幕截图所示:
添加 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"]
使用 Dockerfile 容器生成类型添加 Docker 支持
为 .NET 7 或更高版本的项目添加或启用 Docker 支持时,Visual Studio 会显示 “容器基架选项”对话框,该对话框不仅可以让你选择操作系统(Linux 或 Windows),而且还可以让你选择容器生成类型(Dockerfile 或 .NET SDK)。 此对话框不会出现在 .NET Framework 项目或 Azure Functions 项目中。
在 17.11 及更高版本中,还可以指定容器映像发行版和 Docker 生成上下文。
容器映像分发版指定容器使用哪个 OS 映像作为基础映像。 如果在 Linux 和 Windows 之间切换容器类型,则此列表会发生变化。
有以下几个映像可供选择:
Windows:
- Windows Nano Server(推荐,仅适用于 8.0 及更高版本,未为本机预先 (AOT) 部署项目预设)
- Windows Server Core(仅适用于 8.0 及更高版本)
Linux :
- 默认值(Debian,但标记为“8.0”)
- Debian
- Ubuntu
- Chiseled Ubuntu
- Alpine
注意
基于 Chiseled Ubuntu 映像且使用本机预先 (AOT) 部署 的容器只能在快速模式下进行调试。 请参阅在 Visual Studio 中自定义 Docker 容器。
Docker 生成上下文指定用于 Docker 生成的文件夹。 请参阅 Docker 生成上下文。 默认值为解决方案文件夹,强烈建议使用。 生成所需的所有文件都需要位于此文件夹下;如果选择项目文件夹或其他文件夹,通常情况并非如此。
如果选择 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:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.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"]
在不使用 Dockerfile 的情况下容器化 .NET 应用
使用安装了 .NET 7 SDK 的 Visual Studio 2022 17.9 及更高版本时,在面向 .NET 6 或更高版本的 ASP.NET Core 项目中,可以选择使用 .NET SDK 对容器生成提供的内置支持,这意味着不需要 Dockerfile;请参阅使用 dotnet publish 容器化 .NET 应用。 但是,你要使用该项目文件中的 MSBuild 属性配置容器,并且,用于使用 Visual Studio 启动容器的设置会编码在 .json
配置文件 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>
使用“容器”窗口
使用“容器”窗口可以查看计算机上的容器和映像及其运行情况。 可以查看文件系统、装载的卷、环境变量、使用的端口,以及检查日志文件。
通过使用快速启动 (Ctrl+Q) 并键入 containers
来打开“容器”窗口 。 可以使用停靠控件将该窗口固定在某个位置。 由于窗口的宽度,将其停靠在屏幕底部时是最好用的。
选择一个容器,然后使用选项卡查看可用的信息。 若要查看,请运行启用了 Docker 的应用,打开“文件”选项卡,然后展开“应用”文件夹以查看容器上已部署的应用 。
有关详细信息,请参阅使用“容器”窗口。
Docker Compose 支持
当你想要使用 Docker Compose 撰写多容器解决方案时,请向项目添加容器业务流程协调程序支持。 这样就可以同时运行和调试一组容器(整个解决方案或项目组)(如果已在同一个 docker-compose.yml 文件中定义这些容器)。
若要使用 Docker Compose 添加容器业务流程协调程序支持,请右键单击“解决方案资源管理器”中的项目节点,然后选择“添加”>“容器业务流程协调程序支持”。 然后,选择“Docker Compose”以管理容器。
向项目添加容器业务流程协调程序支持后,会看到添加到项目的 Dockerfile(如果尚无)以及添加到“解决方案资源管理器”中的解决方案的 docker-compose 文件夹,如下所示:
如果 docker-compose.yml 已存在,Visual Studio 只需向其添加配置代码所需的行。
对要使用 Docker Compose 控制的其他项目重复该过程。
如果使用大量服务,可以通过选择要在调试会话中启动的服务子集来节省时间和计算资源。 请参阅启动 Compose 服务的子集。
注意
请注意,Visual Studio 工具不支持远程 Docker 主机。
Service Fabric 支持
借助 Visual Studio 中的 Service Fabric 工具,可以开发和调试 Azure Service Fabric、进行本地运行和调试并部署到 Azure。
Visual Studio 2019 及更高版本支持使用 Windows 容器和 Service Fabric 业务流程来开发容器化微服务。
有关详细教程,请参阅教程:将 Windows 容器中的 .NET 应用程序部署到 Azure Service Fabric。
有关 Azure Service Fabric 的详细信息,请参阅 Service Fabric。
持续交付和持续集成 (CI/CD)
Visual Studio 与 Azure Pipelines 轻松集成,以便自动完成服务代码和配置更改的持续集成和交付。 若要开始使用,请参阅创建第一个管道。
有关 Service Fabric 的信息,请参阅教程:使用 Azure DevOps Projects 将 ASP.NET Core 应用部署到 Azure Service Fabric。
后续步骤
有关服务实现以及将 Visual Studio 工具用于容器的更多详细信息,请阅读以下文章:
在本地 Docker 容器中调试应用