Visual Studio 2017 и более поздних версий поддерживает сборку, отладку и запуск контейнерных приложений ASP.NET Core для работы с .NET Core. Поддерживаются контейнеры Windows и Linux.
Просмотреть или скачать образец кода
Предварительные требования
- Docker для Windows
- Visual Studio 2019 с рабочей нагрузкой Кроссплатформенная разработка .NET Core
Установка и настройка
Перед установкой Docker ознакомьтесь со статьей о Docker для Windows и том, что следует знать перед установкой. Затем установите Docker для Windows.
Нужно настроить Общие диски в Docker для Windows, чтобы обеспечить поддержку сопоставления тома и отладки. Щелкните правой кнопкой мыши значок Docker на панели задач и выберите пункт Параметры, а затем — Общие диски. Выберите диск, на котором Docker сохраняет файлы. Нажмите кнопку Применить.
Совет
Visual Studio 2017 версии 15.6 и более поздней выдает предупреждение, если Общие диски не настроены.
Добавление проекта в контейнер Docker
Чтобы сделать проект ASP.NET Core контейнерным, этот проект должен быть предназначен для .NET Core. Поддерживаются как контейнеры Linux, так и контейнеры Windows.
При добавлении в проект поддержки Docker выберите контейнер Windows или Linux. Узел Docker должен работать на контейнерах такого же типа. Чтобы изменить тип контейнера для работающего экземпляра Docker, щелкните правой кнопкой мыши значок Docker в области уведомлений и выберите Переключение на контейнеры Windows или Переключение на контейнеры Linux.
Новое приложение
При создании приложения с помощью шаблонов проектов веб-приложения ASP.NET Core установите флажок Enable Docker Support (Включение поддержки Docker):
Если целевой платформой является .NET Core, в раскрывающемся списке ОС можно выбрать тип контейнера.
Существующее приложение
Для проектов ASP.NET Core, ориентированных на .NET Core, добавить поддержку Docker через средства можно двумя способами. Откройте проект в Visual Studio и выберите один из следующих параметров:
- Выберите пункт Поддержка Docker в меню Проект.
- В Обозревателе решений щелкните проект правой кнопкой мыши и выберите пункты Добавить>Поддержка Docker.
Средства Visual Studio для контейнеров не поддерживают добавление Docker в существующий проект ASP.NET Core, предназначенный для .NET Framework.
Общие сведения о Dockerfile
Dockerfile с инструкциями по созданию окончательного образа Docker добавляется в корень проекта. См. справочник по Dockerfile для получения сведений о других доступных в нем командах. Этот конкретный Dockerfile использует многоэтапную сборку из четырех раздельных именованных этапов:
DockerfileКопировать
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS base WORKDIR /app EXPOSE 59518 EXPOSE 44364
FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build WORKDIR /src COPY HelloDockerTools/HelloDockerTools.csproj HelloDockerTools/ RUN dotnet restore HelloDockerTools/HelloDockerTools.csproj COPY . . WORKDIR /src/HelloDockerTools RUN dotnet build HelloDockerTools.csproj -c Release -o /app
FROM build AS publish RUN dotnet publish HelloDockerTools.csproj -c Release -o /app
FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]
Предыдущий Dockerfile основан на образе microsoft/dotnet. Этот базовый образ содержит среду выполнения ASP.NET Core и пакеты NuGet. Пакеты скомпилированы JIT-компилятором для повышения производительности запуска.
Если в диалоговом окне создания проекта установлен флажок Configure for HTTPS (Настроить для трафика HTTPS), Dockerfile будет предоставлять два порта. Один порт используется для трафика HTTP, другой — для HTTPS. Если флажок не установлен, для трафика HTTP будет предоставляться один порт (80).
Добавление поддержки оркестратора контейнеров в приложение
Visual Studio 2017 версии 15.7 или более ранние версии поддерживают Docker Compose как единственное решение для оркестрации контейнеров. Для добавления артефактов Docker Compose необходимо последовательно выбрать Добавить>Поддержка Docker.
Visual Studio 2017 версии 15.8 или более поздние версии поддерживают решение для оркестрации только когда это указано отдельно. В Обозревателе решений щелкните проект правой кнопкой мыши и выберите пункты Добавить>Поддержка оркестратора контейнеров. Доступны следующие варианты:
- Docker Compose
- Service Fabric
- Kubernetes/Helm
Docker Compose
Средства Visual Studio для контейнеров добавляют в решение проект docker-compose со следующими файлами:
- docker-compose.dcproj. Файл, представляющий проект. Включает в себя элемент <DockerTargetOS>, указывающий используемую ОС.
- .dockerignore. Содержит список шаблонов файлов и каталогов для исключения при создании контекста сборки.
- docker-compose.yml. Базовый файл Docker Compose, который служит для определения коллекции образов, сборка и запуск которых выполняется с помощью команд docker-compose build и docker-compose run соответственно.
- docker-compose.override.yml. Дополнительный файл, считываемый Docker Compose и содержащий переопределения конфигурации для служб. Visual Studio выполняет docker-compose -f "docker-compose.yml" -f "docker-compose.override.yml" для объединения этих файлов.
Файл docker-compose.yml ссылается на имя образа, создаваемого при выполнении проекта:
version: '3.4'
services: hellodockertools: image: ${DOCKER_REGISTRY}hellodockertools build: context: . dockerfile: HelloDockerTools/Dockerfile
В предыдущем примере image: hellodockertools создает образ hellodockertools:dev, когда приложение выполняется в режиме отладки. Образ hellodockertools:latest создается, когда приложение запускается в режиме выпуска.
Если образ будет отправляться в реестр, добавьте имя пользователя центра Docker (например, dockerhubusername/hellodockertools) в качестве префикса к имени образа. Кроме того, в имя образа можно включить URL-адрес частного реестра (например, privateregistry.domain.com/hellodockertools) в зависимости от конфигурации.
Чтобы реализовать разное поведение в зависимости от конфигурации сборки (например, отладка или выпуск), добавьте зависящие от конфигурации файлы docker-compose. Имена файлов должны соответствовать конфигурации сборки (например, docker-compose.vs.debug.yml и docker-compose.vs.release.yml) и находиться в том же расположении, что и файл docker-compose-override.yml.
Используя зависящие от конфигурации файлы переопределения, можно указать различные параметры (например, переменные среды или точки входа) для конфигураций отладки и выпуска.
Чтобы в Docker Compose отображался параметр для запуска в Visual Studio, проект Docker должен быть запускаемым.
Service Fabric.
Помимо базовых Предварительных требований для решения по оркестрации Service Fabric необходимо выполнить следующие предварительные условия:
- Пакет SDK для Microsoft Azure Service Fabric версии 2.6 или более поздней версии
- Рабочая нагрузка Разработки Azure в Visual Studio
Service Fabric не поддерживает запуск контейнеров Linux в кластере локальной разработки в Windows. Если в проекте уже используется контейнер Linux, Visual Studio предложит переключиться на контейнеры Windows.
Средства Visual Studio для контейнеров позволяют выполнять следующие задачи:
- добавление проекта Service Fabric Application<имя_проекта>приложение в решение;
- добавление Dockerfile и файла .dockerignore в проект ASP.NET Core. Если Dockerfile уже существует в проекте ASP.NET Core, он переименовывается в Dockerfile.original. Создается новый Dockerfile, аналогичный следующему:DockerfileКопировать# See https://aka.ms/containerimagehelp for information on how to use Windows Server 1709 containers with Service Fabric. # FROM microsoft/aspnetcore:2.0-nanoserver-1709 FROM microsoft/aspnetcore:2.0-nanoserver-sac2016
ARG source
WORKDIR /app COPY ${source:-obj/Docker/publish} . ENTRYPOINT ["dotnet", "HelloDockerTools.dll"] - добавляет элемент <IsServiceFabricServiceProject> в файл .csproj проекта ASP.NET Core;XMLКопировать<IsServiceFabricServiceProject>True</IsServiceFabricServiceProject>
- добавляет папку PackageRoot в проект ASP.NET Core. Папка содержит манифест службы и параметры для новой службы.
Дополнительные сведения см. в статье Руководство по развертыванию приложения .NET в контейнере Windows в Azure Service Fabric.
Отладка
Выберите пункт Docker в раскрывающемся списке отладки на панели инструментов, чтобы начать отладку приложения. Представление Docker окна Выходные данные показывает следующие выполненные действия:
- Получение тега 2.1-aspnetcore-runtime образа среды выполнения microsoft/dotnet (если его еще нет в кэше). Образ устанавливает среды выполнения ASP.NET Core и .NET Core и связанные библиотеки. Он оптимизирован для запуска приложений ASP.NET Core в рабочей среде.
- Задание для переменной среды ASPNETCORE_ENVIRONMENT значения Development внутри контейнера.
- Предоставление двух динамически назначенных портов: для трафика HTTP и HTTPS. Отправка запроса к порту, назначенному localhost, с помощью команды docker ps.
- Копирование приложения в контейнер.
- Запуск браузера по умолчанию с подключенным отладчиком для обращения к контейнеру по динамически назначаемому порту.
Итоговый образ Docker приложения помечается как dev. Образ основан на теге 2.1-aspnetcore-runtime базового образа microsoft/dotnet. Выполните команду docker images в окне Консоль диспетчера пакетов (PMC). На компьютере отобразятся следующие образы:
REPOSITORY TAG IMAGE ID CREATED SIZE
hellodockertools dev d72ce0f1dfe7 30 seconds ago 255MB
microsoft/dotnet 2.1-aspnetcore-runtime fcc3887985bb 6 days ago 255MB
Примечание
В образе dev нет содержимого приложения, так как конфигурации Отладки используют подключение томов для удобства при итеративных процессах отладки. Чтобы отправить образ, используйте конфигурацию выпуска.
Выполните команду docker ps в PMC. Обратите внимание, что приложение выполняется с помощью контейнера:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
baf9a678c88d hellodockertools:dev "C:\\remote_debugge..." 21 seconds ago Up 19 seconds 0.0.0.0:37630->80/tcp dockercompose4642749010770307127_hellodockertools_1
Изменение и продолжение
Изменения статических полей и представлений Razor применяются автоматически без необходимости выполнять этап компиляции. Внесите изменение, сохраните его и перезагрузите страницу в браузере, чтобы увидеть обновление.
Для внесения изменений в файлы кода нужно выполнить компиляцию и перезапуск Kestrel в контейнере. После внесения изменения нажмите клавиши CTRL+F5, чтобы выполнить процесс и запустить приложение в контейнере. Контейнер Docker не перестраивается и не останавливается. Выполните команду docker ps в PMC. Обратите внимание, что исходный контейнер все еще выполняется, как и 10 минут назад:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
baf9a678c88d hellodockertools:dev "C:\\remote_debugge..." 10 minutes ago Up 10 minutes 0.0.0.0:37630->80/tcp dockercompose4642749010770307127_hellodockertools_1
Публикация образов Docker
После завершения цикла разработки и отладки приложения используйте Средства Visual Studio для контейнеров, чтобы создать рабочий образ приложения. Выберите в раскрывающемся списке конфигурации значение Выпуск и выполните сборку приложения. Инструментарий получает образ компиляции или публикации из центра Docker (если он отсутствует в кэше). Образ создается с тегом latest, который можно отправить в закрытый реестр или в центр Docker.
В PMC выполните команду docker images, чтобы просмотреть список образов. Выходные данные должны выглядеть примерно так:
REPOSITORY TAG IMAGE ID CREATED SIZE
hellodockertools latest e3984a64230c About a minute ago 258MB
hellodockertools dev d72ce0f1dfe7 4 minutes ago 255MB
microsoft/dotnet 2.1-sdk 9e243db15f91 6 days ago 1.7GB
microsoft/dotnet 2.1-aspnetcore-runtime fcc3887985bb 6 days ago 255MB
Примечание
Команда docker images возвращает промежуточные образы с именами репозитория и тегами, обозначенными как <none> (не указаны выше). Эти неименованные образы создаются Dockerfileмногоэтапной сборки. Они повышают эффективность сборки окончательного образа — при изменениях перестраиваются только необходимые слои. Когда промежуточные образы больше не требуются, удалите их с помощью команды docker rmi.
Рабочий образ или образ выпуска может быть меньше по размеру, чем образ dev. Из-за сопоставления томов отладчик и приложение запускались с локального компьютера, а не внутри контейнера. Образ с тегом latest упаковал код приложения, необходимый для запуска приложения на хост-компьютере. Таким образом, размер изменится на размер кода конкретного приложения.