快速入门:Visual Studio 中的 Docker

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

先决条件

安装和设置

要安装 Docker,请先查看用于 Windows 的 Docker Desktop:安装须知了解相关信息。 然后安装用于 Windows 的 Docker Desktop

向 Docker 容器添加项目

  1. 使用“ASP.NET Core Web 应用”模板创建新项目,或如果要使用 .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 基于 microsoft/aspnetcore 映像,并包括通过构建项目并将其添加到容器中修改基本映像的说明 。 如果使用的是 .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 Core 应用并将其发布到 Azure 容器注册表、Docker Hub、Azure 应用服务或你自己的容器注册表。 在本文中,你将一个 ASP.NET Core 应用发布到 Azure 容器注册表。

先决条件

安装和设置

要安装 Docker,请先查看用于 Windows 的 Docker Desktop:安装须知了解相关信息。 然后安装用于 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 应用”模板创建新项目,或如果要使用 .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.

#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed.
#For more information, please see https://aka.ms/containercompat

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

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

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./MyWebApp.csproj" -c %BUILD_CONFIGURATION% -o /app/publish /p:UseAppHost=false

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 容器实例

其他资源