在本地 Docker 容器中调试应用

适用范围:yesVisual Studio noVisual Studio for Mac

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

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

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

先决条件

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

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

创建 Web 应用

如果你有一个项目,并且已按照概述中的说明添加了 Docker 支持,请跳过此部分。

  1. 在 Visual Studio“启动”窗口,选择“创建新项目”

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

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

  4. 选择要作为目标的 .NET 版本。 如果你不确定具体版本,请选择 LTS(长期支持)版本

    Create a web project - Additional information screen

  5. 通过选择或清除“HTTPS 配置”复选框,选择是否需要 SSL 支持

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

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

  1. 在 Visual Studio“启动”窗口,选择“创建新项目”

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

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

  4. 选择要作为目标的 .NET 版本。 如果你不确定具体版本,请选择 LTS(长期支持)版本

    Create a web project - Additional information screen

  5. 通过选择或清除“HTTPS 配置”复选框,选择是否需要 SSL 支持

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

  7. 在“Docker OS”文本框中,选择所需的容器类型(Windows 或 Linux),然后选择“创建”。

编辑 Razor 页面并刷新

若要在 Razor 页面中快速循环访问所做的更改,可以在容器中启动应用程序。 然后,继续进行更改,就像查看 IIS Express 一样查看这些更改。

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

  2. (仅限 .NET Core 3 及更高版本)在 3.0 及以上版本的 .NET Core 中的默认模板不支持按此部分所述的方式编辑代码和刷新运行的站点。 为了启用此功能,请添加 NuGet 包 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 在 Startup.cs 中,在 ConfigureServices 方法的代码中添加对扩展方法 IMvcBuilder.AddRazorRuntimeCompilation 的调用。 由于你只需在调试模式中启用此功能,因此请按如下所示的方法进行编码:

    public IWebHostEnvironment Env { get; set; }
    
    public void ConfigureServices(IServiceCollection services)
    {
        IMvcBuilder builder = services.AddRazorPages();
    
    #if DEBUG
        if (Env.IsDevelopment())
        {
            builder.AddRazorRuntimeCompilation();
        }
    #endif
    
        // code omitted for brevity
    }
    

    按如下所示修改 Startup 方法:

    public Startup(IConfiguration configuration, IWebHostEnvironment webHostEnvironment)
    {
        Configuration = configuration;
        Env = webHostEnvironment;
    }
    

    有关详细信息,请参阅 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 以查看断点。 检查值。

    Screenshot showing part of the code for Index.cshtml.cs in Visual Studio with a breakpoint set to the left of a code line that is highlighted in yellow.

    Screenshot showing part of the code for Index.cshtml.cs in Visual Studio with a breakpoint set to the left of a code line that is highlighted in yellow.

创建 .NET Framework 控制台应用

本部分介绍如何在本地 Docker 容器中调试 .NET Framework 控制台应用项目,首先演示如何向项目添加 Docker 支持。 必须认识到不同的项目类型具有不同级别的 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 以查看断点,并检查值。

    Screenshot of the code window for Program.cs in Visual Studio with a breakpoint set to the left of a code line that is highlighted in yellow.

容器重复使用

在开发周期中,Visual Studio 在你更改 Dockerfile 后仅重新生成容器映像和容器本身。 如果不更改 Dockerfile,Visual Studio 将重复使用以前运行的容器。

如果你手动修改了容器,并希望使用干净的容器映像重启,请使用 Visual Studio 中的“Build”>“Clean”命令,然后按常规操作生成 。

疑难解答

了解如何对 Visual Studio Docker 开发进行故障排除

后续步骤

有关更多详细信息,请参阅 Visual Studio 如何构建容器化应用

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