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 необходимо установить следующие средства:
Для локального запуска контейнеров Docker необходимо иметь локальный клиент Docker. Вы можете использовать Docker Desktop, для которой требуется Windows 10 или более поздней версии.
Создание веб-приложения
Если у вас есть проект и вы добавили поддержку Docker, как описано в обзоре, пропустите этот раздел.
В окне запуска Visual Studio выберите Создать проект.
Выберите ASP.NET Core Web App, а затем выберите Далее.
Введите имя нового приложения (или используйте имя по умолчанию), укажите расположение на диске, а затем нажмите кнопку Далее.
Выберите, требуется ли поддержка 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:
C#
// Add services to the container.var mvcBuilder = builder.Services.AddRazorPages();
#if DEBUGif (Env.IsDevelopment())
{
mvcBuilder.AddRazorRuntimeCompilation();
}
#endif
Дополнительные сведения см. в разделе о компиляции файлов Razor в ASP.NET Core. Точный код может отличаться в зависимости от целевой платформы и используемого шаблона проекта.
Задайте для конфигурации решения параметр на отладку . Затем нажмите клавиши CTRL+F5, чтобы создать образ Docker и запустить его локально.
При создании и запуске образа контейнера в контейнере Docker Visual Studio запускает веб-приложение в браузере по умолчанию.
Перейдите на страницу индекса. Мы внодем изменения на этой странице.
Вернитесь в Visual Studio и откройте Index.cshtml.
Добавьте следующее HTML-содержимое в конец файла, а затем сохраните изменения.
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 следующим кодом:
C#
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 следующим кодом:
C#
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:
Dockerfile
# This layer is to support debugging, VS's Token Proxy requires the runtime to be installed in the containerFROM mcr.microsoft.com/dotnet/runtime:8.0 AS runtime
FROM base as debug
COPY --from=runtime /usr/share/dotnet /usr/share/dotnetRUN 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 следующим образом:
yml
# Set the stage to debug to use an image with the .NET runtime in itservices: functionappintegrated: build: target:debug
Пример кода проверки подлинности с помощью Функций Azure, включая интегрированные и изолированные сценарии, см. в VisualStudioCredentialExample.
Повторное использование контейнера
При использовании быстрый режим, который Visual Studio обычно использует для конфигурации отладки, Visual Studio перестраивает только образы контейнеров и сам контейнер при изменении Файла Dockerfile. Если вы не изменяете Dockerfile, Visual Studio повторно использует контейнер из предыдущего запуска.
Если вы вручную внесли изменения в контейнер и хотите начать заново с чистым образом контейнера, используйте команду Сборка>Очистка в Visual Studio, затем выполните сборку как обычно.
Если вы не используете быстрый режим, который обычно не применяется в релизной конфигурации, Visual Studio перестраивает контейнер при каждом построении проекта.
Создайте и настройте полнофункциональную среду разработки на основе контейнеров Visual Studio Code. Откройте любую папку или репозиторий в контейнере и воспользуйтесь полным набором функций Visual Studio Code, например IntelliSense (завершение), навигация по коду и отладка.
Создавайте комплексные решения в Microsoft Azure для создания Функции Azure, реализации веб-приложений и управления ими, разработке решений, использующих службу хранилища Azure, и т. д.