快速入门:Visual Studio 中的 Docker

使用 Visual Studio,可以轻松生成、调试和运行容器化 .NET、ASP.NET,以及 ASP.NET 核心应用并将其发布到 Azure 容器注册表、Docker 中心、Azure 应用服务或自己的容器注册表。 在本文中,我们将 ASP.NET 核心应用发布到 Azure 容器注册表。

先决条件

安装和设置

对于 Docker 安装,请先查看 Docker Desktop for Windows 中的信息:安装之前要了解的内容。 接下来,安装 Docker Desktop

将项目添加到 Docker 容器

  1. 使用 ASP.NET Core Web App 模板创建新项目,或者如果要使用 .NET Framework 而不是 .NET Core,请选择 ASP.NET Web 应用程序(.NET Framework)

  2. 创建新的 Web 应用程序 屏幕上,确保选中“启用 Docker 支持 ”复选框

    “启用 Docker 支持”复选框的屏幕截图。

    屏幕截图显示 .NET Core;如果使用 .NET Framework,则看起来稍有不同。

  3. 选择所需的容器类型(Windows 或 Linux),然后单击“创建

Dockerfile 概述

Dockerfile,用于创建最终 Docker 映像的方案,已在项目中创建。 若要了解其中命令,请参阅 Dockerfile 参考

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

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

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

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

前面的 Dockerfile 基于 dotnet/core/aspnet 映像,并包括通过构建项目并将其添加到容器中修改基本映像的说明。 如果使用 .NET Framework,则基本映像将有所不同。

如果选中了新建项目对话框的“为 HTTPS 配置”复选框,则 Dockerfile 公开两个端口。 一个端口用于 HTTP 流量;另一个端口用于 HTTPS。 如果未选中该复选框,则会为 HTTP 流量公开单个端口(80)。

调试

从工具栏中的调试下拉列表中选择 Docker,并开始调试应用。 你可能会看到一条消息,提示你信任证书;选择信任证书以继续。

输出 窗口中的“容器工具” 选项显示正在执行的操作。 第一次下载基础映像可能需要一段时间,但在后续运行时速度要快得多。

说明

如果需要更改端口进行调试,可以在 launchSettings.json 文件中执行此操作。 请参阅 容器启动设置

容器窗口

如果你有 Visual Studio 2019 版本 16.4 或更高版本,则可以使用 容器 窗口查看计算机上正在运行的容器,以及可用的映像。

使用 IDE 中的搜索框打开 容器 窗口(按 Ctrl+Q 使用它),键入 container,然后从列表中选择 容器 窗口。

你可以将 容器 窗口移动到一个方便的位置,比如编辑器下方,只需按照窗口放置指引进行操作即可。

在窗口中,找到容器并依次查看每个选项卡,以查看环境变量、端口映射、日志和文件系统。

“容器”窗口的屏幕截图。

有关详细信息,请参阅使用“容器”窗口

发布 Docker 映像

应用开发和调试周期完成后,可以创建应用的生产映像。

  1. 将配置下拉列表更改为 发布 并生成应用。

  2. 在解决方案资源管理器 中右键单击项目,然后选择 发布

  3. 在“发布”对话框中,选择“Docker 容器注册表” 选项卡。

    “发布”对话框的屏幕截图 - 选择“Docker 容器注册表”。

  4. 选择 创建新的 Azure 容器注册表

    “发布”对话框的屏幕截图 - 选择“创建新的 Azure 容器注册表”。

  5. 创建新的 Azure 容器注册表中填写所需的值。

    设置 建议的值 描述
    DNS 前缀 全局唯一名称 用于唯一标识容器注册表的名称。
    订阅 选择订阅 要使用的 Azure 订阅。
    资源组 myResourceGroup 要在其中创建容器注册表的资源组的名称。 选择 新建 创建新的资源组。
    SKU 标准 容器注册表的服务级别
    注册表位置 靠近你的位置 在你附近或将使用容器注册表的其他服务附近的区域中,选择位置。

    Visual Studio 的“创建 Azure 容器注册表”对话框的屏幕截图。

  6. 单击“创建”。 发布 对话框现在显示创建的注册表。

    “发布”对话框的屏幕截图,其中显示了已创建的 Azure 容器注册表。

  7. 选择 完成,以完成将容器映像发布到 Azure 中新创建的注册表的过程。

    成功发布的屏幕截图 显示成功发布的屏幕截图。

后续步骤

现在可以将容器从注册表拉取到能够运行 Docker 映像的任何主机,例如 Azure 容器实例

使用 Visual Studio,可以轻松生成、调试和运行容器化 .NET、ASP.NET,以及 ASP.NET 核心应用并将其发布到 Azure 容器注册表、Docker 中心、Azure 应用服务或自己的容器注册表。 本文介绍如何将 ASP.NET Core 应用发布到 Azure 容器注册表。

先决条件

安装和设置

对于 Docker 安装,请先查看 Docker Desktop for Windows 中的信息:安装之前要了解的内容。 接下来,安装 Docker Desktop

将项目添加到 Docker 容器

  1. 在创建 Visual Studio 项目之前,请确保 Docker Desktop 正在运行想要在 Visual Studio 项目中使用的容器类型(Windows 或 Linux)。

    若要更改 Docker Desktop 使用的容器类型,请在任务栏中右键单击 Docker 图标(鲸鱼),然后选择 切换到 Linux 容器切换到 Windows 容器

    警告

    如果在创建 Visual Studio 项目后切换容器类型,Docker 映像文件可能无法加载。

  2. 使用 ASP.NET Core Web App 模板创建新项目,或者如果要使用 .NET Framework 而不是 .NET Core,请选择 ASP.NET Web 应用程序(.NET Framework)

  3. 创建新的 Web 应用程序 屏幕上,确保选中“启用 Docker 支持 ”复选框

    “启用 Docker 支持”复选框的屏幕截图。

    屏幕截图显示了 .NET 8.0 的最新版本。 如果使用 .NET Framework,对话框看起来有点不同。

  4. 选择所需的容器类型(Windows 或 Linux),然后选择 创建

Dockerfile 概述

Visual Studio 会在项目中创建一个 Dockerfile,它提供了有关如何创建最终 Docker 映像的配方。 有关详细信息,请参阅 Dockerfile 参考,了解有关 Dockerfile 中使用的命令的详细信息。

#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-nanoserver-1809 AS base
WORKDIR /app
EXPOSE 8080
EXPOSE 8081

# This stage is used to build the service project
FROM mcr.microsoft.com/dotnet/sdk:8.0-nanoserver-1809 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["MyWepApp/MyWebApp.csproj", "MyWebApp/"]
RUN dotnet restore "./MyWebApp/./MyWebApp.csproj"
COPY . .
WORKDIR "/src/MyWebApp"
RUN dotnet build "./MyWebApp.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 "./MyWebApp.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", "MyWebApp.dll"]

上述 Dockerfile 基于 Microsoft 容器注册表 (MCR) .NET 8 映像,并包含有关通过生成名为 MyWebApp 的项目并将其添加到容器来修改基础映像的说明。 如果使用 .NET Framework,则基本映像不同。

当新项目对话框中的 “配置 HTTPS” 复选框被选中时,Dockerfile 会暴露两个端口。 一个端口用于 HTTP 流量;另一个端口用于 HTTPS。 如果未选中该复选框,则会为 HTTP 流量公开单个端口(80)。

使用 Visual Studio 2022 版本 17.7 或更高版本,您可以开发针对 .NET 8的应用程序。 在这种情况下,你可以以普通用户的身份(而不是提升的权限)更安全地运行应用。 Visual Studio for .NET 8 项目生成的默认 Dockerfile 配置为以普通用户身份运行。 若要对现有项目启用此行为,请将行 USER app 添加到基础映像中的 Dockerfile。 此外,由于端口 80 仅限于普通用户,因此公开端口 8080 和 8081,而不是 80 和 443。 端口 8080 用于 HTTP 流量,端口 8081 用于 HTTPS。 若要以普通用户身份运行,容器必须使用 .NET 8 基础映像,并且应用必须作为 .NET 8 应用运行。 正确配置后,Dockerfile 应包含代码,如以下示例所示:

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

调试

从工具栏中的调试下拉列表中选择 Docker,并开始调试应用。 你可能会看到一条消息,提示你信任证书;选择信任证书以继续。

输出 窗口中的“容器工具” 选项显示正在执行的操作。 第一次下载基础映像可能需要一段时间,但在后续运行时会更快。

生成完成后,浏览器将打开并显示应用的主页。 在浏览器地址栏中,可以看到用于调试的 localhost URL 和端口号。

备注

如果需要更改端口进行调试,可以在 launchSettings.json 文件中执行此操作。 请参阅 容器启动设置

容器窗口

可以使用 容器 窗口查看您的计算机上正在运行的容器,以及您拥有的其他可用映像。

使用 IDE 中的搜索框打开 容器 窗口(按 Ctrl+Q 使用它),键入 container,然后从列表中选择 容器 窗口。

可以将容器 窗口安装在方便的位置,例如编辑器下方,通过遵循窗口放置指导来移动它。

在窗口中,找到容器并逐一查看每个选项卡,以查看环境变量、端口映射、日志和文件系统。

“容器”窗口的屏幕截图。

有关详细信息,请参阅使用“容器”窗口

发布 Docker 映像

应用开发和调试周期完成后,可以创建应用的生产映像。

  1. 将配置下拉列表更改为 发布 并生成应用。

  2. 在解决方案资源管理器 中右键单击项目,然后选择 发布

  3. 在“发布”对话框中,选择“Docker 容器注册表” 选项卡。

    “发布”对话框的屏幕截图 - 选择“Docker 容器注册表”。

  4. 选择 创建新的 Azure 容器注册表

    “发布”对话框的屏幕截图 - 选择“创建新的 Azure 容器注册表”。

  5. 创建新的 Azure 容器注册表中填写所需的值。

    设置 建议的值 描述
    DNS 前缀 全局唯一名称 用于唯一标识容器注册表的名称。
    订阅 选择订阅 要使用的 Azure 订阅。
    资源组 myResourceGroup 要在其中创建容器注册表的资源组的名称。 选择 新建 创建新的资源组。
    SKU 标准 容器注册表的服务等级
    注册表位置 靠近你的位置 在你附近或可使用容器注册表的其他服务附近的区域中,选择位置。

    Visual Studio 的“创建 Azure 容器注册表”对话框的屏幕截图。

  6. 选择 创建发布 对话框现在显示创建的注册表。

    “发布”对话框的屏幕截图,其中显示了已创建的 Azure 容器注册表。

  7. 选择 完成,以完成将容器映像发布到 Azure 中新创建的注册表的过程。

    显示成功发布的屏幕截图。

后续步骤

现在可以将容器从注册表拉取到能够运行 Docker 映像的任何主机,例如 Azure 容器实例

其他资源