Отладка приложений в локальном контейнере 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, как описано в обзоре, пропустите этот раздел.
В окне запуска Visual Studio выберите Создать проект.
Выберите ASP.NET Core Web App, а затем выберите Далее.
Введите имя нового приложения (или используйте имя по умолчанию), укажите расположение на диске, а затем нажмите кнопку Далее.
Выберите целевую версию .NET. Если вы не уверены, выберите выпуск ЛТС (долгосрочной поддержки).
Выберите, требуется ли поддержка SSL, установив или сняв флажок Настроить для HTTPS.
Установите флажок Включить поддержку Docker.
Используйте раскрывающийся список, чтобы выбрать нужный тип контейнера: Windows или Linux.
Выберите Создать, чтобы завершить процесс.
В окне запуска Visual Studio выберите Создать проект.
Выберите ASP.NET Core Web App, а затем выберите Далее.
Введите имя нового приложения (или используйте имя по умолчанию), укажите расположение на диске, а затем нажмите кнопку Далее.
Выберите целевую версию .NET. Если вы не уверены, выбрать выпуск LTS (долгосрочной поддержки).
Выберите, требуется ли поддержка SSL, установив или сняв флажок Настроить для HTTPS.
Установите флажок Включить Docker.
Используйте выпадающий список платформы Docker, чтобы выбрать нужный тип контейнера: Windows или Linux.
Выберите Создать, чтобы завершить процесс.
Отредактируйте ваши страницы Razor и обновите их.
Чтобы быстро итерировать изменения на страницах Razor, можно запустить приложение в контейнере. Затем продолжайте вносить изменения, просматривая их так же, как и в службах IIS Express.
Убедитесь, что Docker настроен для использования используемого типа контейнера (Linux или Windows). Щелкните правой кнопкой мыши на значке Docker на панели задач и выберите, соответствующим образом, перейти на контейнеры Linux или перейти на контейнеры Windows.
Изменение кода и обновление работающего сайта, как описано в этом разделе, не включено в шаблонах по умолчанию в .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. Точный код может отличаться в зависимости от целевой платформы и используемого шаблона проекта.
Задайте для конфигурации решения параметр на отладку . Затем нажмите клавиши CTRL+F5, чтобы создать образ Docker и запустить его локально.
При создании и запуске образа контейнера в контейнере Docker Visual Studio запускает веб-приложение в браузере по умолчанию.
Перейдите на страницу индекса. Мы внодем изменения на этой странице.
Вернитесь в Visual Studio и откройте Index.cshtml.
Добавьте следующее HTML-содержимое в конец файла, а затем сохраните изменения.
<h1>Hello from a Docker container!</h1>
В окне выходных данных, когда сборка .NET завершена, и вы увидите следующие строки, вернитесь в браузер и обновите страницу:
Now listening on: http://*:80 Application started. Press Ctrl+C to shut down.
Ваши изменения были применены!
Отладка с точками останова
Часто изменения требуют дальнейшего проверки. Для этой задачи можно использовать функции отладки Visual Studio.
В Visual Studio откройте Index.cshtml.cs.
Замените содержимое метода
OnGet
следующим кодом:ViewData["Message"] = "Your application description page from within a container";
Слева от строки кода установите точку останова.
Чтобы начать отладку и попасть в точку останова, нажмите клавишу F5.
Перейдите в Visual Studio, чтобы просмотреть точку останова. Проверьте значения.
Горячая перезагрузка
Кроме того, в Visual Studio 17.10 и более поздних версиях Hot Reload поддерживается в контейнерах, хотя, имейте в виду, что в контейнерах нужно обновить страницу, чтобы увидеть изменения. Если изменение выполняется в 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.
- Создайте проект консольного приложения .NET Framework.
- В обозревателе решений щелкните правой кнопкой мыши элемент проекта и выберите Добавить>поддержку оркестрации контейнеров. В появившемся диалоговом окне выберите Docker Compose. В ваш проект добавляется Dockerfile, а также добавляется проект Docker Compose со связанными файлами поддержки.
Отладка с точками останова
В обозревателе решений откройте Program.cs.
Замените содержимое метода
Main
следующим кодом:System.Console.WriteLine("Hello, world!");
Установите точку останова слева от строки кода.
Нажмите клавишу F5, чтобы начать отладку и попасть в точку останова.
Перейдите в Visual Studio, чтобы просмотреть точку останова и проверить значения.
Аутентификация в службах Azure с использованием токен-прокси
При использовании служб Azure из контейнера можно использовать DefaultAzureCredential (с включенным VisualStudioCredential) для аутентификации с Azure и учетной записью Microsoft Entra без необходимости дальнейшей настройки в контейнере. Чтобы включить это, ознакомьтесь с статьей «Как настроить средства контейнеров Visual Studio». Кроме того, необходимо настроить проверку подлинности Azure в Visual Studio, выполнив инструкции по аутентификации Visual Studio с помощью Azure. Поддержка VisualStudioCredential в контейнере доступна в Visual Studio версии 17.6 и более поздних версиях.
Функции Azure
Если вы отлаживаете интегрированный проект Azure Functions и используете прокси токена в контейнере для обработки аутентификации в службах 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) задайте для свойства 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, включая интегрированные и изолированные сценарии, см. в VisualStudioCredentialExample.
Повторное использование контейнера
При использовании быстрый режим, который Visual Studio обычно использует для конфигурации отладки, Visual Studio перестраивает только образы контейнеров и сам контейнер при изменении Файла Dockerfile. Если вы не изменяете Dockerfile, Visual Studio повторно использует контейнер из предыдущего запуска.
Если вы вручную внесли изменения в контейнер и хотите начать заново с чистым образом контейнера, используйте команду Сборка>Очистка в Visual Studio, затем выполните сборку как обычно.
Если вы не используете быстрый режим, который обычно не применяется в релизной конфигурации, Visual Studio перестраивает контейнер при каждом построении проекта.
Можно настроить использование быстрого режима; см. как настроить средства контейнеров Visual Studio.
Диагностика и устранение неисправностей
Узнайте, как устранять неполадкиразработки с Docker в Visual Studio.
Связанное содержимое
Получите больше сведений, прочитав о том, как Visual Studio создает контейнерные приложения.
Дополнительные сведения о Docker с Visual Studio, Windows и Azure
- Дополнительные сведения о разработке контейнеров с помощью Visual Studio.
- См. статью "Интеграция Docker в Azure Pipelines" для получения информации о создании и развертывании контейнера Docker.
- Для получения индекса статей по Windows Server и Nano Server, см. раздел Информация о контейнерах Windows.
- Узнайте о службе Azure Kubernetes и ознакомьтесь с документацией по службе Azure Kubernetes.