Использование средств Visual Studio для контейнеров с ASP.NET Core
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 9 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 9 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 9 этой статьи.
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
Чтобы контейнеризовать проект Core ASP.NET, проект должен быть предназначен для .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 использует многоэтапную сборку из четырех раздельных именованных этапов:
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 необходимо выполнить следующие предварительные условия:
- Пакет 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, аналогичный следующему:
# 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 упаковал код приложения, необходимый для запуска приложения на хост-компьютере. Таким образом, размер изменится на размер кода конкретного приложения.
Дополнительные ресурсы
- Разработка с помощью контейнеров в Visual Studio
- Azure Service Fabric: подготовка среды разработки
- Руководство по развертыванию приложения .NET в контейнере Windows в Azure Service Fabric
- Устранение неполадок при разработке с Docker в Visual Studio
- Репозиторий GitHub со средствами Visual Studio для контейнеров
- GC с использованием DOCKER и небольших контейнеров
- System.IO.IOException: настроенное ограничение пользователя (128) на число экземпляров inotify достигнуто.
- Обновления образов Docker
ASP.NET Core