Перенос приложений ASP.NET MVC в контейнеры Windows

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

Начните с существующего приложения ASP.NET MVC и выполните сборку опубликованных ресурсов с помощью Visual Studio. Docker используется для создания образа, который содержит и запускает ваше приложение. Вы перейдете на сайт, запущенный в контейнере Windows, и проверите, работает ли приложение.

Для работы с этой статьей необходимо знание основных понятий Docker. Чтобы ознакомиться с Docker, см. этот обзор Docker.

Приложение, которое будет работать в контейнере — это простой веб-сайт, который случайным образом отвечает на вопросы. Это базовое приложение MVC без проверки подлинности и хранилища базы данных. Оно позволяет сосредоточиться на перемещении веб-уровня в контейнер. В дальнейших темах показано, как перемещать постоянное хранилище и управлять им в контейнерных приложениях.

Перемещение приложения состоит из следующих действий.

  1. Создание задачи публикации для сборки ресурсов образа.
  2. Создание образа Docker, в котором будет запускаться приложение.
  3. Запуск контейнера Docker, в котором будет запускаться образ.
  4. Проверка приложения с помощью браузера.

Готовое приложение находится на GitHub.

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

Компьютер разработки должен иметь следующее программное обеспечение:

Внимание

При использовании Windows Server 2016 выполните инструкции по развертыванию узла контейнеров в Windows Server.

После установки и запуска Docker щелкните правой кнопкой мыши значок в области уведомлений и выберите Switch to Windows containers (Переключиться на контейнеры Windows). Это необходимо для запуска образов Docker на базе Windows. На выполнение этой команды требуется несколько секунд:

Контейнер Windows

Публикация скрипта

Соберите в одном месте все ресурсы, которые нужно загрузить в образ Docker. Для создания профиля публикации приложения в Visual Studio есть команда Опубликовать. В этом профиле все ресурсы будут собраны в одном дереве каталогов, которое далее в этом учебнике вам нужно будет скопировать в свой целевой образ.

Этапы публикации

  1. Щелкните правой кнопкой мыши веб-проект в Visual Studio и выберите Publish (Публикация).
  2. Нажмите кнопку Пользовательский профиль, а затем выберите Файловая система в качестве метода.
  3. Выберите каталог. По правилам загруженный образец использует bin\Release\PublishOutput.

Публикация: подключение

Откройте раздел "Параметры публикации файлов" на вкладке "Параметры". Выберите предварительную компиляцию во время публикации. Эта оптимизация означает, что представления не будут компилироваться в контейнере Docker, вместо этого будут копироваться предварительно скомпилированные представления.

Параметры публикации

Нажмите кнопку Publish (Публикация), и Visual Studio скопирует все необходимые ресурсы в целевую папку.

Создание образа

Создайте файл с именем Dockerfile , чтобы определить образ Docker. Dockerfile содержит инструкции по сборке окончательного образа и содержит все имена базовых образов, обязательные компоненты, приложение, которое вы хотите запустить, и другие образы конфигурации. Dockerfile — это входные данные docker build команды, создающей образ.

В этом упражнении вы создадите образ на основе образа, расположенного microsoft/aspnet в Docker Hub. Базовый образ mcr.microsoft.com/dotnet/framework/aspnet:4.8 — это образ Windows Server. Он содержит Windows Server Core, IIS и ASP.NET 4.8. При запуске этого образа в контейнере он автоматически использует IIS и установленные веб-сайты.

Dockerfile, который создает образ, выглядит следующим образом:

# The `FROM` instruction specifies the base image. You are
# extending the `mcr.microsoft.com/dotnet/framework/aspnet:4.8` image.

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.8

# The final instruction copies the site you published earlier into the container.
COPY ./bin/Release/PublishOutput/ /inetpub/wwwroot

В этом файле Dockerfile нет команды ENTRYPOINT. Она не нужна здесь. При запуске Windows Server с IIS процесс IIS — это точка входа, настроенная для запуска в базовом образе aspnet.

Выполните команду сборки Docker, чтобы создать образ, который запускает приложение ASP.NET. Для этого откройте окно PowerShell в каталоге проекта и введите следующую команду в каталоге решения:

docker build -t mvcrandomanswers .

Эта команда создаст новый образ с помощью инструкций в Dockerfile, именования (-t тегов) изображения в виде mvcrandomanswers. Это может включать получение базового образа из Docker Hub. После этого в образ будет добавлено приложение.

После выполнения этой команды можно выполнить команду docker images для просмотра сведений о новом образе:

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
mvcrandomanswers              latest              86838648aab6        2 minutes ago       10.1 GB

Идентификатор IMAGE ID на вашем компьютере будет другим. Теперь запустим приложение.

Запуск контейнера

Чтобы запустить контейнер, нужно выполнить следующую команду docker run:

docker run -d --name randomanswers mvcrandomanswers

Аргумент -d предписывает Docker запустить образ в отсоединенном режиме. Это значит, что образ Docker запускается в отрыве от текущей оболочки.

Во многих примерах docker можно увидеть -p для сопоставления портов контейнера и узла. Образ aspnet по умолчанию уже настроил контейнер для прослушивания порта 80 и предоставления его.

Аргумент --name randomanswers содержит имя запущенного контейнера. Это имя можно использовать вместо идентификатора контейнера в большинстве команд.

mvcrandomanswers — это имя запускаемого образа.

Проверка в браузере

После запуска контейнера подключитесь к работающему контейнеру, используя http://localhost в примере ниже. Введите этот URL-адрес в адресной строке браузера, и вы увидите работающий сайт.

Примечание.

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

Каталог образцов на GitHub содержит Сценарий PowerShell, который выполняет эти команды за вас. Откройте окно PowerShell, перейдите в каталог решения и введите команду:

./run.ps1

Приведенная выше команда создает образ, отображает список образов на компьютере и запускает контейнер.

Чтобы остановить контейнер, выполните команду docker stop:

docker stop randomanswers

Чтобы удалить контейнер, выполните команду docker rm:

docker rm randomanswers