對本機 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 Core Web 應用程式],然後選取 [下一步]

  3. 輸入新應用程式的名稱 (或使用預設名稱),接著指定磁碟上的位置,然後選取 [下一步]

  4. 選擇您想要設為目標的 .NET 版本。 如果您不知道,請選擇 LTS (長期支援) 版本

    建立 Web 專案 - 其他資訊畫面

  5. 選取或清除 [設定 HTTPS] 核取方塊,以選擇您是否想要 SSL 支援。

  6. 選取 [啟用 Docker 支援] 核取方塊。

  7. 選取您想要的容器類型 (Windows 或 Linux),然後選取 [建立]

  1. 在 Visual Studio 的開始視窗中,選取 [建立新專案]

  2. 選取 [ASP.NET Core Web 應用程式],然後選取 [下一步]

  3. 輸入新應用程式的名稱 (或使用預設名稱),接著指定磁碟上的位置,然後選取 [下一步]

  4. 選擇您想要設為目標的 .NET 版本。 如果您不知道,請選擇 LTS (長期支援) 版本

    建立 Web 專案 - 其他資訊畫面

  5. 選取或清除 [設定 HTTPS] 核取方塊,以選擇您是否想要 SSL 支援。

  6. 選取 [啟用 Docker] 核取方塊。

  7. 在 [Docker OS] 文字方塊中,選取您想要的容器類型 (Windows 或 Linux),然後選取 [建立]

編輯您的 Razor 頁面並重新整理

若要在 Razor 頁面中快速逐一查看變更,您可以在容器中啟動應用程式。 然後,繼續進行變更,如同使用 IIS Express 一樣進行檢視。

  1. 請確定 Docker 已設定為使用您所使用的容器類型 (Linux 或 Windows)。 以滑鼠右鍵按一下工作列上的 Docker 圖示,然後選擇 [切換至 Linux 容器] 或 [視需要切換至 Windows 容器]

  2. 如本節所述編輯您的程式碼並重新整理執行中網站的功能在 .NET Core 和 .NET 5 的預設範本中並未啟用。 若要啟用它,請新增 NuGet 封裝 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation。 將擴充方法 AddRazorRuntimeCompilation 的呼叫新增至 方法中的 Startup.ConfigureServices 程序代碼。 您只需要在偵錯模式中啟用此功能,因此請依照 Main 方法撰寫程式碼:

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

    如需詳細資訊,請參閱 ASP.NET Core 中的 Razor 檔案編譯。 確切的程式代碼可能會根據您所使用的目標 Framework 和專案範本而有所不同。

  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 部分程式碼的螢幕擷取畫面,其中斷點設定為黃色醒目提示的程式碼行左側。

建立 .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 以檢視中斷點並檢查值。

    Visual Studio 中 Program.cs 程式碼視窗的螢幕擷取畫面,其中斷點設定為黃色醒目提示的程式碼行左側。

使用權杖 Proxy 向 Azure 服務進行驗證

當您從容器使用 Azure 服務時,可以使用 DefaultAzureCredential (已啟用 VisualStudioCredential) 並搭配 Microsoft Entra 帳戶向 Azure 服務進行驗證,而不需要容器中任何其他設定。 若要啟用此功能,請參閱如何設定 Visual Studio 容器工具。 此外,您必須遵循使用 Azure 驗證 Visual Studio 中的 指示,在 Visual Studio 中設定 Azure 驗證。 Visual Studio 17.6 版和更新版本中提供容器中 VisualStudioCredential 的支援。

Azure Functions

如果您要對整合式 Azure Functions 專案進行偵錯,並使用容器中的權杖 Proxy 來處理對 Azure 服務的驗證,則必須將 .NET 執行階段複製到容器,讓權杖 Proxy 得以執行。 如果您要對隔離式 Azure Functions 專案進行偵錯,其已有 .NET 執行階段,因此不需要這個額外的步驟。

若要確保 .NET 執行階段可供權杖 Proxy 使用,請在 Dockerfile 中新增或修改將 .NET 執行階段複製到容器映像中的 debug 階層。 針對 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