在本地 Docker 容器中调试应用

Visual Studio 提供了一种一致的方式来开发 Docker 容器并在本地验证应用程序。 可以在安装了 Docker 的本地 Windows 桌面上运行的 Linux 或 Windows 容器中运行和调试应用,每次更改代码时都无需重启容器。

本文演示如何使用 Visual Studio 在本地 Docker 容器中启动应用,进行更改,然后刷新浏览器以查看更改。 本文还介绍如何为容器化应用设置用于调试的断点。 支持的项目类型包括 Web 应用、控制台应用和面向 .NET Framework 和 .NET Core 的 Azure 函数。 本文中提供的示例是 ASP.NET Core Web App 类型的项目和控制台应用(.NET Framework)类型的项目。

如果已有受支持的类型项目,Visual Studio 可以创建 Dockerfile 并将项目配置为在容器中运行。 请参阅 Visual Studio 中的容器工具

先决条件

若要调试本地 Docker 容器中的应用,必须安装以下工具:

若要在本地运行 Docker 容器,必须具有本地 Docker 客户端。 可以使用需要 Windows 10 或更高版本的 Docker Desktop

创建 Web 应用

如果有项目,并且已按 概述中所述添加了 Docker 支持,请跳过本部分。

  1. 在 Visual Studio 开始窗口中,选择“ 创建新项目”。

  2. 选择 ASP.NET 核心 Web 应用,然后选择“ 下一步”。

  3. 输入新应用程序的名称(或使用默认名称),指定磁盘上的位置,然后选择“ 下一步”。

  4. 选择要面向的 .NET 版本。 如果不确定, 请选择 LTS(长期支持)版本

    显示如何在 Visual Studio 2019 中创建新的 ASP.NET Core Web 应用项目的屏幕截图。

  5. 通过选中或清除“ 配置 HTTPS ”复选框,选择是否希望 SSL 支持。

  6. 选中“启用 Docker 支持”复选框。

  7. 使用下拉列表选择所需的容器类型: WindowsLinux

  8. 选择 创建 以完成该过程。

  1. 在 Visual Studio 开始窗口中,选择“ 创建新项目”。

  2. 选择 ASP.NET 核心 Web 应用,然后选择“ 下一步”。

  3. 输入新应用程序的名称(或使用默认名称),指定磁盘上的位置,然后选择“ 下一步”。

  4. 选择要面向的 .NET 版本。 如果不确定, 请选择 LTS(长期支持)版本

    显示如何在 Visual Studio 2022 中创建新的 ASP.NET Core Web 应用项目的屏幕截图。

  5. 通过选中或清除“ 配置 HTTPS ”复选框,选择是否希望 SSL 支持。

  6. 选中“ 启用 Docker ”复选框。

  7. 使用 Docker OS 下拉列表选择所需的容器类型: WindowsLinux

  8. 选择 创建 以完成该过程。

编辑 Razor 页面并刷新

为了快速迭代 Razor 页面中的更改,可以在容器中启动应用程序。 然后,继续进行更改,像使用 Internet Information Services (IIS) Express 一样查看它们。

  1. 确保已将 Docker 设置为使用所使用的容器类型(Linux 或 Windows)。 右键单击任务栏上的 Docker 图标,然后选择“ 切换到 Linux 容器 ”或根据需要 切换到 Windows 容器

  2. 在 .NET Core 和 .NET 5 及更高版本的默认模板中,不支持如本节中所描述的编辑代码并刷新站点的功能。 若要启用它,请 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 添加 NuGet 包。 在代码的Startup.ConfigureServices方法中添加对扩展方法AddRazorRuntimeCompilation的调用。 只需要在 DEBUG 模式下启用此功能,因此请按照以下步骤在方法 Main 中对其进行编码:

    // Add services to the container.
    var mvcBuilder = builder.Services.AddRazorPages();
    #if DEBUG
        if (Env.IsDevelopment())
        {
            mvcBuilder.AddRazorRuntimeCompilation();
        }
    #endif
    

    有关详细信息,请参阅 ASP.NET Core 中的 Razor 文件编译。 确切的代码可能会有所不同,具体取决于目标框架和所使用的项目模板。

  3. 解决方案配置 设置为 “调试”。 然后,按 Ctrl+F5 生成 Docker 映像并将其在本地运行。

    在 Docker 容器中生成并运行容器映像时,Visual Studio 会在默认浏览器中启动 Web 应用。

  4. 转到 “索引 ”页。 我们将在此页面上进行更改。

  5. 返回到 Visual Studio 并打开 Index.cshtml

  6. 将以下 HTML 内容添加到文件末尾,然后保存更改。

    <h1>Hello from a Docker container!</h1>
    
  7. 在输出窗口中,当 .NET 生成完成后,会看到以下行,切换回浏览器并刷新页面:

    Now listening on: http://*:80
    Application started. Press Ctrl+C to shut down.
    

你的更改已应用!

使用断点进行调试

通常,更改需要进一步检查。 可以将 Visual Studio 的调试功能用于此任务。

  1. 在 Visual Studio 中,打开 Index.cshtml.cs

  2. 将方法的内容 OnGet 替换为以下代码:

        ViewData["Message"] = "Your application description page from within a container";
    
  3. 在代码行左侧,设置断点。

  4. 若要开始调试并命中断点,请按 F5。

  5. 切换到 Visual Studio 以查看断点。 检查值。

    显示 Visual Studio 中 Index.cshtml.cs 的部分代码的屏幕截图,其中在以黄色突出显示的代码行的左侧设置了一个断点。

    显示 Visual Studio 中 Index.cshtml.cs 的部分代码的屏幕截图,其中在以黄色突出显示的代码行的左侧设置了一个断点。

热重载

此外,在 Visual Studio 17.10 及更高版本中,容器中支持 热重载 ,尽管请注意,在容器中,必须刷新页面才能查看更改。 如果更改是 CSS 文件,则再次必须刷新页面才能查看这些更改。 请注意,热重载不支持对限定范围的 CSS 文件(.razor.css 文件,详见 ASP.NET Core Blazor 的 CSS 隔离)进行更新。

创建 .NET Framework 控制台应用

本部分演示了如何将 Docker 支持添加到项目中,并在本地 Docker 容器中调试 .NET Framework 控制台应用项目。 请务必认识到,不同的项目类型具有不同级别的 Docker 支持。 对 .NET Core(包括 .NET 5 及更高版本)控制台应用项目和 .NET Framework 控制台应用项目的 Docker 支持级别甚至不同。

创建 .NET Framework 控制台应用项目时,无法启用 Docker 支持。 创建此类项目后,无法向项目显式添加 Docker 支持。 对于 .NET Framework 控制台应用项目,可以添加对容器业务流程的支持。 向 .NET Framework 控制台应用项目添加业务流程支持的副作用是,它将 Docker 支持添加到项目中。

以下过程演示如何将业务流程支持添加到 .NET Framework 控制台应用项目,该项目随后向项目添加 Docker 支持,并允许在本地 Docker 容器中调试项目。

  1. 创建新的 .NET Framework 控制台应用项目。
  2. 在解决方案资源管理器中,右键单击项目节点,然后选择 “添加>容器业务流程支持”。 在出现的对话框中,选择 “Docker Compose”。 Dockerfile 被添加到您的项目中,然后添加了 Docker Compose 项目及其相关支持文件。

使用断点进行调试

  1. 在解决方案资源管理器中,打开 Program.cs

  2. 将方法的内容 Main 替换为以下代码:

        System.Console.WriteLine("Hello, world!");
    
  3. 将断点设置为代码行左侧。

  4. 要启动调试并命中断点,请按 F5。

  5. 切换到 Visual Studio 以查看断点并检查值。

    Visual Studio 中的 Program.cs 代码窗口的屏幕截图,断点设置在高亮显示为黄色的代码行的左侧。

使用令牌代理向 Azure 服务进行身份验证

使用容器中的 Azure 服务时,可以使用 DefaultAzureCredential (已启用 VisualStudioCredential ),通过 Microsoft Entra 帐户对 Azure 服务进行身份验证,而无需在容器中进行任何其他配置。 若要启用此功能,请参阅 如何配置 Visual Studio 容器工具。 此外,需要按照 Visual Studio 与 Azure 进行身份验证中的说明在 Visual Studio 中设置 Azure 身份验证。 Visual Studio 版本 17.6 及更高版本中提供了对容器中的 VisualStudioCredential 的支持。

Azure Functions(Azure 功能服务)

如果要调试集成的 Azure Functions 项目并使用容器中的令牌代理来处理对 Azure 服务的身份验证,则需要将 .NET 运行时复制到容器中,以便令牌代理运行。 如果要调试独立的 Azure Functions 项目,它已具有 .NET 运行时,因此无需执行此额外步骤。

若要确保 .NET 运行时可供令牌代理使用,请在 Dockerfile 中添加或修改 debug 将 .NET 运行时复制到容器映像中的层。 对于 Linux 容器,可以将以下代码添加到 Dockerfile:

# This layer is to support debugging, VS's Token Proxy requires the runtime to be installed in the container
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS runtime
FROM base as debug
COPY --from=runtime /usr/share/dotnet /usr/share/dotnet
RUN ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

此外,在 Visual Studio 项目中,需要进行一些更改,以将其指定为快速模式下调试时要使用的层。 有关快速模式的说明,请参阅 Visual Studio 中的自定义 Docker 容器。 对于单个容器方案(而不是 Docker Compose),请将 MSBuild 属性 DockerfileFastModeStage 设置为 debug 使用该层进行调试。 对于 Docker Compose,请修改docker-compose.vs.debug.yml如下所示:

# Set the stage to debug to use an image with the .NET runtime in it
services:
  functionappintegrated:
    build:
      target: debug

有关使用 Azure Functions(包括集成和隔离方案)进行身份验证的代码示例,请参阅 VisualStudioCredentialExample

容器重用

使用 快速模式(Visual Studio 通常用于调试配置)时,Visual Studio 仅在更改 Dockerfile 时重新生成容器映像和容器本身。 如果不更改 Dockerfile,Visual Studio 将重复使用之前运行的容器。

如果手动修改了容器并想要使用干净的容器映像重启,请使用 Visual Studio 中的 “生成>清理 ”命令,然后正常生成。

如果不使用快速模式(这是发布配置的典型模式),则每次生成项目时,Visual Studio 都会重新生成容器。

可以在使用快速模式时进行配置;请参阅 如何配置 Visual Studio 容器工具

故障排除

了解如何 排查 Visual Studio Docker 开发问题

通过阅读 Visual Studio 如何生成容器化应用来获取更多详细信息。

有关使用 Visual Studio、Windows 和 Azure 的 Docker 的详细信息