Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Note
Это не последняя версия этой статьи. В текущей версии см. версию .NET 10 этой статьи.
Warning
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущей версии см. версию .NET 10 этой статьи.
Visual Studio 2017 или более поздней версии поддерживают создание, отладку и запуск контейнерных приложений ASP.NET Core. Поддерживаются контейнеры Windows и Linux.
Просмотреть или скачать образец кода (описание загрузки)
Prerequisites
- Docker для Windows
- Visual Studio 2019 с рабочей нагрузкой Кроссплатформенная разработка .NET Core
Установка и настройка
Чтобы установить Docker, сначала ознакомьтесь с разделом Docker для Windows: что следует знать перед установкой. Затем установите Docker для Windows.
Нужно настроить Общие диски в Docker для Windows, чтобы обеспечить поддержку сопоставления тома и отладки. Щелкните правой кнопкой мыши значок Docker на панели задач и выберите пункт Параметры, а затем — Общие диски. Выберите диск, на котором Docker сохраняет файлы. Нажмите кнопку "Применить".
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 необходимо выполнить следующие предварительные условия:
- Пакет SDK для Microsoft Azure Service Fabric версии 2.6 или более поздней версии
- Рабочая нагрузка Разработки Azure в Visual Studio
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 упаковал код приложения, необходимый для запуска приложения на хост-компьютере. Размер дельты соответствует размеру кода приложения.
Дополнительные ресурсы
- Разработка с помощью контейнеров в 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