Использование средств Visual Studio для контейнеров с ASP.NET Core

Visual Studio 2017 и более поздних версий поддерживает сборку, отладку и запуск контейнерных приложений ASP.NET Core для работы с .NET Core. Поддерживаются контейнеры Windows и Linux.

Просмотреть или скачать образец кода (описание загрузки)

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

Установка и настройка

Чтобы установить Docker, сначала ознакомьтесь с разделом Docker для Windows: что следует знать перед установкой. Затем установите Docker для Windows.

Нужно настроить Общие диски в Docker для Windows, чтобы обеспечить поддержку сопоставления тома и отладки. Щелкните правой кнопкой мыши значок Docker на панели задач и выберите пункт Параметры, а затем — Общие диски. Выберите диск, на котором Docker сохраняет файлы. Щелкните Применить.

Dialog to select local C drive sharing for containers

Совет

Visual Studio 2017 версии 15.6 и более поздней выдает предупреждение, если Общие диски не настроены.

Добавление проекта в контейнер Docker

Чтобы контейнеризовать проект Core ASP.NET, проект должен быть предназначен для .NET Core. Поддерживаются как контейнеры Linux, так и контейнеры Windows.

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

Новое приложение

При создании приложения с помощью шаблонов проектов веб-приложения ASP.NET Core установите флажок Enable Docker Support (Включение поддержки Docker):

Enable Docker Support checkbox

Если целевой платформой является .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 использует многоэтапную сборку из четырех раздельных именованных этапов:

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 включает пакеты ASP.NET Core и NuGet. Пакеты скомпилированы JIT-компилятором для повышения производительности запуска.

Если в диалоговом окне создания проекта установлен флажок Configure for HTTPS (Настроить для трафика HTTPS), Dockerfile будет предоставлять два порта. Один порт используется для трафика HTTP, другой — для HTTPS. Если флажок не установлен, для трафика HTTP будет предоставляться один порт (80).

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 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 включает пакеты NuGet ASP.NET Core, которые компилируются jIT для повышения производительности запуска.

Добавление поддержки оркестратора контейнеров в приложение

Visual Studio 2017 версии 15.7 или более ранние версии поддерживают Docker Compose как единственное решение для оркестрации контейнеров. Для добавления артефактов Docker Compose необходимо последовательно выбрать Добавить>Поддержка Docker.

Visual Studio 2017 версии 15.8 или более поздние версии поддерживают решение для оркестрации только когда это указано отдельно. В Обозревателе решений щелкните проект правой кнопкой мыши и выберите пункты Добавить>Поддержка оркестратора контейнеров. Доступны следующие варианты:

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 необходимо выполнить следующие предварительные условия:

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, аналогичный следующему:

    # 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;

    <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
  • Получение образа среды выполнения microsoft/aspnetcore (если его еще нет в кэше).
  • Задание для переменной среды ASPNETCORE_ENVIRONMENT значения Development внутри контейнера.
  • Порт 80 открыт и сопоставлен с динамически назначаемым портом для localhost. Порт определяется узлом Docker и может запрашиваться с помощью команды docker ps.
  • Копирование приложения в контейнер.
  • Запуск браузера по умолчанию с подключенным отладчиком для обращения к контейнеру по динамически назначаемому порту.

Итоговый образ Docker приложения помечается как dev. Образ основан на базовом образе microsoft/aspnetcore. Выполните команду docker images в окне Консоль диспетчера пакетов (PMC). На компьютере отобразятся следующие образы:

REPOSITORY            TAG  IMAGE ID      CREATED        SIZE
hellodockertools      dev  5fafe5d1ad5b  4 minutes ago  347MB
microsoft/aspnetcore  2.0  c69d39472da9  13 days ago    347MB

Примечание.

В образе 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
REPOSITORY                  TAG     IMAGE ID      CREATED         SIZE
hellodockertools            latest  cd28f0d4abbd  12 seconds ago  349MB
hellodockertools            dev     5fafe5d1ad5b  23 minutes ago  347MB
microsoft/aspnetcore-build  2.0     7fed40fbb647  13 days ago     2.02GB
microsoft/aspnetcore        2.0     c69d39472da9  13 days ago     347MB

Начиная с .NET Core 2.1, образы microsoft/aspnetcore-build и microsoft/aspnetcore, указанные в предыдущих выходных данных, заменяются образами microsoft/dotnet. Дополнительные сведения см. в объявлении о миграции репозиториев Docker.

Примечание.

Команда docker images возвращает промежуточные образы с именами репозитория и тегами, обозначенными как <none> (не указаны выше). Эти неименованные образы создаются Dockerfileмногоэтапной сборки. Они повышают эффективность сборки окончательного образа — при изменениях перестраиваются только необходимые слои. Когда промежуточные образы больше не требуются, удалите их с помощью команды docker rmi.

Рабочий образ или образ выпуска может быть меньше по размеру, чем образ dev. Из-за сопоставления томов отладчик и приложение запускались с локального компьютера, а не внутри контейнера. Образ с тегом latest упаковал код приложения, необходимый для запуска приложения на хост-компьютере. Таким образом, размер изменится на размер кода конкретного приложения.

Дополнительные ресурсы