Отладка приложений в локальном контейнере Docker

Visual Studio обеспечивает согласованную разработку контейнеров Docker и локальную проверку приложения. Вы можете запускать и отлаживать свои приложения в контейнерах Linux или Windows, работающих на локальном рабочем столе Windows с установленным Docker. При этом вам не нужно перезапускать контейнер каждый раз, когда вы вносите изменения в код.

В этой статье рассказывается, как запускать приложение в локальном контейнере Docker с помощью Visual Studio, вносить изменения и обновлять браузер для их отображения. В ней также показано, как устанавливать точки останова для отладки контейнерных приложений. Поддерживаемые типы проектов включают веб-приложение, консольное приложение и функцию Azure, предназначенные для платформа .NET Framework и .NET Core. Примеры, представленные в этой статье, — это проект типа ASP.NET Core Web App и проект консольного приложения (платформа .NET Framework).

Если у вас уже есть проект поддерживаемого типа, Visual Studio может создать Dockerfile и настроить проект для запуска в контейнере. Ознакомьтесь со статьей Средства для контейнеров в Visual Studio.

Необходимые компоненты

Для отладки приложений в локальном контейнере Docker необходимо установить следующие средства:

  • Visual Studio 2019 с установленной рабочей нагрузкой "Веб-разработка".
  • Visual Studio 2022 с установленной рабочей нагрузкой "Веб-разработка".

Для запуска контейнеров Docker локально требуется локальный клиент Docker. Вы можете использовать Docker Desktop. Для этого требуется Windows 10 или более поздней версии.

Создание веб-приложения.

Пропустите этот раздел, если у вас есть проект и вы добавили поддержку Docker, как описано в обзоре.

  1. В начальном окне Visual Studio выберите Создать проект.

  2. Выберите пункт Веб-приложение ASP.NET Core и нажмите кнопку Далее.

  3. Введите имя нового приложения (или оставьте имя по умолчанию), укажите расположение на диске и нажмите кнопку ОК.

  4. Выберите целевую версию .NET. Если вы не уверены, выберите выпуск LTS (долгосрочной поддержки).

    Снимок экрана: создание нового проекта веб-приложения ASP.NET Core в Visual Studio 2019.

  5. Выберите, требуется ли поддержка SSL, выбрав или снимите флажок "Настроить для HTTPS ".

  6. Установите флажок "Включить поддержку Docker".

  7. Используйте раскрывающийся список, чтобы выбрать нужный тип контейнера: Windows или Linux.

  8. Выберите Создать, чтобы завершить процесс.

  1. В начальном окне Visual Studio выберите Создать проект.

  2. Выберите пункт Веб-приложение ASP.NET Core и нажмите кнопку Далее.

  3. Введите имя нового приложения (или оставьте имя по умолчанию), укажите расположение на диске и нажмите кнопку ОК.

  4. Выберите целевую версию .NET. Если вы не уверены, выберите выпуск LTS (долгосрочной поддержки).

    Снимок экрана: создание нового проекта веб-приложения ASP.NET Core в Visual Studio 2022.

  5. Выберите, требуется ли поддержка SSL, выбрав или снимите флажок "Настроить для HTTPS ".

  6. Установите флажок "Включить Docker".

  7. Используйте раскрывающийся список ОС Docker, чтобы выбрать нужный тип контейнера: Windows или Linux.

  8. Выберите Создать, чтобы завершить процесс.

Изменение страниц Razor и обновление

Для быстрого изменения страниц Razor можно запустить приложение в контейнере. Затем продолжайте вносить изменения, просматривая их так же, как и в службы IIS (IIS).

  1. Убедитесь, что Docker настроен для применения типа контейнера (Linux или Windows), который вы используете. На панели задач щелкните правой кнопкой мыши значок Docker и выберите пункт Switch to Linux containers (Переключиться на контейнеры Linux) или Switch to Windows containers (Переключиться на контейнеры 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
    

    Дополнительные сведения см. в статье Компиляция файла Razor в ASP.NET Core. Точный код может отличаться в зависимости от целевой платформы и используемого шаблона проекта.

  3. В качестве конфигурации решения выберите Отладка. Затем нажмите клавиши CTRL+F5, чтобы создать образ Docker и запустить его локально.

    После сборки и запуска образа контейнера в контейнере Docker среда Visual Studio запустит веб-приложение в вашем браузере по умолчанию.

  4. Перейдите на страницу Index (Индекс). Мы будем вносить на ней изменения.

  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, чтобы просмотреть точку останова. Проверьте значения.

    Снимок экрана: часть кода для Index.cshtml.cs в Visual Studio, для которого точка останова установлена слева от строки кода, выделенной желтым цветом.

    Снимок экрана: часть кода для Index.cshtml.cs в Visual Studio, для которого точка останова установлена слева от строки кода, выделенной желтым цветом.

Горячая перезагрузка

Кроме того, в Visual Studio 17.10 и более поздних версиях Горячая перезагрузка поддерживается в контейнерах, хотя помните, что в контейнере необходимо обновить страницу, чтобы увидеть изменения. Если изменение выполняется в CSS-файле, необходимо обновить страницу, чтобы увидеть эти изменения. Обратите внимание также, что обновления для файлов CSS с областью действия (.razor.css файлы см. ASP.NET изоляции Core Blazor CSS) не поддерживаются как часть горячей перезагрузки.

Создание консольного приложения .NET Framework

Этот раздел содержит сведения о том, как выполнять отладку для проекта консольного приложения .NET Framework в локальном контейнере Docker, вначале описывая, как обеспечить поддержку Docker в проекте. Важно понимать, что проекты разных типов имеют разные уровни поддержки Docker. Существуют даже различные уровни поддержки Docker для проектов консольного приложения .NET Core (включая .NET 5 и более поздних версий) и для проектов консольного приложения .NET Framework.

При создании проекта консольного приложения .NET Framework нет возможности включить поддержку Docker. После создания такого проекта невозможно явно добавить поддержку Docker в проект. Для проекта консольного приложения .NET Framework можно обеспечить поддержку оркестрации контейнеров. Побочным эффектом добавления поддержки оркестрации в проект консольного приложения платформа .NET Framework является добавление поддержки Docker в проект.

Следующая процедура демонстрирует, как добавить поддержку оркестрации в проект консольного приложения .NET Framework, что впоследствии обеспечивает поддержку Docker и позволяет отлаживать проект в локальном контейнере Docker.

  1. Создайте проект консольного приложения .NET Framework.
  2. В обозревателе решений щелкните правой кнопкой мыши узел проекта и выберите Добавить>Container Orchestration Support (Поддержка оркестрации контейнеров). В появившемся диалоговом окне выберите Docker Compose. Файл Dockerfile будет добавлен в проект, а проект Docker Compose со вспомогательными файлами будет добавлен в решение.

Отладка с использованием точек останова

  1. В обозревателе решений откройте файл Program.cs.

  2. Замените содержимое метода Main следующим кодом:

        System.Console.WriteLine("Hello, world!");
    
  3. Установите точку останова слева от строки кода.

  4. Чтобы начать отладку и достичь точки останова, нажмите клавишу F5.

  5. Переключитесь в Visual Studio, чтобы просмотреть точку останова и проверить значения.

    Снимок экрана: окно кода для Program.cs в Visual Studio, для которого точка останова установлена слева от строки кода, выделенной желтым цветом.

Проверка подлинности в службах Azure с помощью прокси-сервера маркера

При использовании служб Azure из контейнера можно использовать DefaultAzureCredential (с включенным VisualStudioCredential) для проверки подлинности со службами Azure с учетной записью Microsoft Entra без дополнительной конфигурации в контейнере. Чтобы включить эту функцию, см. инструкции по настройке средств контейнеров Visual Studio. Кроме того, необходимо настроить проверку подлинности Azure в Visual Studio, выполнив инструкции по проверке подлинности Visual Studio в Azure. Поддержка VisualStudioCredential в контейнере доступна в Visual Studio версии 17.6 и более поздних версиях.

Функции Azure

Если вы выполняете отладку интегрированного проекта Функции Azure и используете прокси-сервер маркера в контейнере для обработки проверки подлинности в службах Azure, необходимо скопировать среду выполнения .NET в контейнер для запуска прокси-сервера маркера. Если вы выполняете отладку изолированного проекта Функции Azure, он уже имеет среду выполнения .NET, поэтому для этого дополнительного шага нет необходимости.

Чтобы обеспечить доступность среды выполнения .NET для прокси-сервера маркера, добавления или изменения debug слоя в Dockerfile, копирующий среду выполнения .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 необходимо внести некоторые изменения, чтобы указать этот уровень, используемый при отладке в быстром режиме. Описание быстрого режима см. в разделе "Настройка контейнеров Docker" в Visual Studio. Для сценариев одного контейнера (не Docker Compose) задайте для свойства DockerfileFastModeStage debug MSBuild значение, чтобы использовать этот уровень для отладки. Для 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, включая интегрированные и изолированные сценарии, см. в разделе VisualStudioCredentialExample.

Повторное использование контейнеров

При использовании быстрого режима, который Visual Studio обычно использует для конфигурации отладки, Visual Studio перестраивает только образы контейнеров и сам контейнер при изменении Файла Dockerfile. Если файл Dockerfile не изменяется, Visual Studio повторно использует контейнер из предыдущего запуска.

Если вы вручную изменили контейнер и хотите выполнить перезапуск с чистым образом контейнера, выберите команду Сборка>Очистить, а затем выполните сборку как обычную.

Если вы не используете быстрый режим, типичный для конфигурации выпуска, Visual Studio перестраивает контейнер при каждом построении проекта.

Можно настроить, когда используется быстрый режим; См. инструкции по настройке средств контейнеров Visual Studio.

Устранение неполадок

Узнайте, как устранять неполадки при разработке Docker в Visual Studio.

Дополнительные сведения см. в статье Как Visual Studio создает контейнерные приложения.

Дополнительные сведения об использовании Docker с Visual Studio, Windows и Azure