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

Note

Это не последняя версия этой статьи. В текущей версии см. версию .NET 10 этой статьи.

Warning

Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущей версии см. версию .NET 10 этой статьи.

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

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

Prerequisites

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

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

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

Диалоговое окно для выбора общего локального диска C для контейнеров

Tip

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

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

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

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

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

Флажок

Раскрывающийся список ОС позволяет выбрать тип контейнера.

Существующее приложение

Существует два варианта добавления поддержки 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 Hub (например, dockerhubusername/hellodockertools) в качестве префикса к имени образа. Кроме того, в имя образа можно включить URL-адрес частного реестра (например, privateregistry.domain.com/hellodockertools) в зависимости от конфигурации.

Чтобы реализовать разное поведение в зависимости от конфигурации сборки (например, отладка или выпуск), добавьте зависящие от конфигурации файлы docker-compose. Имена файлов должны соответствовать конфигурации сборки (например, docker-compose.vs.debug.yml и docker-compose.vs.release.yml) и находиться в том же расположении, что и файл docker-compose-override.yml.

Используя конфигурационно-зависимые файлы переопределения, можно указать различные параметры конфигурации (например, системные переменные окружения или точки входа) для конфигураций сборки Debug и Release.

Чтобы в Docker Compose отображался параметр для запуска в Visual Studio, проект Docker должен быть запускаемым.

Service Fabric

Помимо базовых Предварительных требований для решения по оркестрации Service Fabric необходимо выполнить следующие предварительные условия:

Service Fabric не поддерживает запуск контейнеров Linux в кластере локальной разработки в Windows. Если в проекте уже используется контейнер Linux, Visual Studio предложит переключиться на контейнеры Windows.

Средства Visual Studio для контейнеров позволяют выполнять следующие задачи:

  • Добавляет проект <>имя_проектаПриложение Service Fabric в решение.

  • добавление 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.

Debug

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

  • Получение тега 2.1-aspnetcore-runtime образа среды выполнения microsoft/dotnet (если его еще нет в кэше). Образ устанавливает среды выполнения для ASP.NET Core и .NET, а также связанные библиотеки. Он оптимизирован для запуска приложений 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

Note

В образе dev нет содержимого приложения, так как конфигурации для отладки используют подключение томов для обеспечения итеративного процесса. Чтобы загрузить образ, используйте конфигурацию Release.

Выполните команду 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 Hub (если он отсутствует в кэше). Образ создается с тегом 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.

Note

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

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

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