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

При запуске существующего приложения на основе .NET Framework в контейнере Windows не требуется вносить изменения в приложение.Running an existing .NET Framework-based application in a Windows container doesn't require any changes to your app. Чтобы запустить приложение в контейнере Windows, создайте образ Docker с приложением и запустите контейнер.To run your app in a Windows container you create a Docker image containing your app and start the container. В этом разделе показано, как получить существующее приложение ASP.NET MVC и развернуть его в контейнере Windows.This topic explains how to take an existing ASP.NET MVC application and deploy it in a Windows container.

Начните с существующего приложения ASP.NET MVC и выполните сборку опубликованных ресурсов с помощью Visual Studio.You start with an existing ASP.NET MVC app, then build the published assets using Visual Studio. Docker используется для создания образа, который содержит и запускает ваше приложение.You use Docker to create the image that contains and runs your app. Вы перейдете на сайт, запущенный в контейнере Windows, и проверите, работает ли приложение.You'll browse to the site running in a Windows container and verify the app is working.

Для работы с этой статьей необходимо знание основных понятий Docker.This article assumes a basic understanding of Docker. Чтобы ознакомиться с Docker, см. этот обзор Docker.You can learn about Docker by reading the Docker Overview.

Приложение, которое будет работать в контейнере — это простой веб-сайт, который случайным образом отвечает на вопросы.The app you'll run in a container is a simple website that answers questions randomly. Это базовое приложение MVC без проверки подлинности и хранилища базы данных. Оно позволяет сосредоточиться на перемещении веб-уровня в контейнер.This app is a basic MVC application with no authentication or database storage; it lets you focus on moving the web tier to a container. В дальнейших темах показано, как перемещать постоянное хранилище и управлять им в контейнерных приложениях.Future topics will show how to move and manage persistent storage in containerized applications.

Перемещение приложения состоит из следующих действий.Moving your application involves these steps:

  1. Создание задачи публикации для сборки ресурсов образа.Creating a publish task to build the assets for an image.
  2. Создание образа Docker, в котором будет запускаться приложение.Building a Docker image that will run your application.
  3. Запуск контейнера Docker, в котором будет запускаться образ.Starting a Docker container that runs your image.
  4. Проверка приложения с помощью браузера.Verifying the application using your browser.

Готовое приложение находится на GitHub.The finished application is on GitHub.

Предварительные требованияPrerequisites

Машина разработки должна иметь следующее программное обеспечение:The development machine must have the following software:

Important

При использовании Windows Server 2016 выполните инструкции по развертыванию узла контейнеров в Windows Server.If you are using Windows Server 2016, follow the instructions for Container Host Deployment - Windows Server.

После установки и запуска Docker щелкните правой кнопкой мыши значок в области уведомлений и выберите Switch to Windows containers (Переключиться на контейнеры Windows).After installing and starting Docker, right-click on the tray icon and select Switch to Windows containers. Это необходимо для запуска образов Docker на базе Windows.This is required to run Docker images based on Windows. На выполнение этой команды требуется несколько секунд:This command takes a few seconds to execute:

Контейнер WindowsWindows Container

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

Соберите в одном месте все ресурсы, которые нужно загрузить в образ Docker.Collect all the assets that you need to load into a Docker image in one place. Для создания профиля публикации приложения в Visual Studio есть команда Опубликовать.You can use the Visual Studio Publish command to create a publish profile for your app. В этом профиле все ресурсы будут собраны в одном дереве каталогов, которое далее в этом учебнике вам нужно будет скопировать в свой целевой образ.This profile will put all the assets in one directory tree that you copy to your target image later in this tutorial.

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

  1. Щелкните правой кнопкой мыши веб-проект в Visual Studio и выберите Publish (Публикация).Right click on the web project in Visual Studio, and select Publish.
  2. Нажмите кнопку пользовательский профиль, а затем выберите файловую систему в качестве метода.Click the Custom profile button, and then select File System as the method.
  3. Выберите каталог.Choose the directory. По правилам загруженный образец использует bin\Release\PublishOutput.By convention, the downloaded sample uses bin\Release\PublishOutput.

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

Откройте раздел Параметры публикации файлов вкладки «Настройки. Выберите precompile во время публикации.Open the File Publish Options section of the Settings tab. Select Precompile during publishing. Эта оптимизация означает, что представления не будут компилироваться в контейнере Docker, вместо этого будут копироваться предварительно скомпилированные представления.This optimization means that you'll be compiling views in the Docker container, you are copying the precompiled views.

Настройки публикацииPublish Settings

Нажмите кнопку Publish (Публикация), и Visual Studio скопирует все необходимые ресурсы в целевую папку.Click Publish, and Visual Studio will copy all the needed assets to the destination folder.

Создание образаBuild the image

Создайте новый файл под названием Dockerfile для определения изображения Docker.Create a new file named Dockerfile to define your Docker image. Dockerfile содержит инструкции по созданию окончательного изображения и включает в себя любые имена базовых изображений, необходимые компоненты, приложение, которым вы хотите запускать, и другие изображения конфигурации.Dockerfile contains instructions to build the final image and includes any base image names, required components, the app you want to run, and other configuration images. Dockerfile — это вход docker build в команду, создающий изображение.Dockerfile is the input to the docker build command that creates the image.

Для этого упражнения вы создаме microsoft/aspnet изображение на основе изображения, расположенного на Docker Hub.For this exercise, you will build an image based on the microsoft/aspnet image located on Docker Hub. Базовый образ microsoft/aspnet — это образ Windows Server.The base image, microsoft/aspnet, is a Windows Server image. Он содержит ядро сервера Windows, IIS и ASP.NET 4.7.2.It contains Windows Server Core, IIS, and ASP.NET 4.7.2. При запуске этого образа в контейнере он автоматически использует IIS и установленные веб-сайты.When you run this image in your container, it will automatically start IIS and installed websites.

Dockerfile, который создает образ, выглядит следующим образом:The Dockerfile that creates your image looks like this:

# The `FROM` instruction specifies the base image. You are
# extending the `microsoft/aspnet` image.

FROM microsoft/aspnet

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

В этом файле Dockerfile нет команды ENTRYPOINT.There is no ENTRYPOINT command in this Dockerfile. Она не нужна здесь.You don't need one. При запуске Windows Server с IIS процесс IIS является точкой входа, которая настроена для запуска в базовом изображении aspnet.When running Windows Server with IIS, the IIS process is the entrypoint, which is configured to start in the aspnet base image.

Выполните команду сборки Docker, чтобы создать образ, который запускает приложение ASP.NET.Run the Docker build command to create the image that runs your ASP.NET app. Для этого откройте окно PowerShell в каталоге проекта и введите следующую команду в каталоге решений:To do this, open a PowerShell window in the directory of your project and type the following command in the solution directory:

docker build -t mvcrandomanswers .

Эта команда будет строить новое изображение, используя инструкции в Dockerfile, называя (т пометки) изображение как mvcrandomanswers.This command will build the new image using the instructions in your Dockerfile, naming (-t tagging) the image as mvcrandomanswers. Это может включать получение базового образа из Docker Hub. После этого в образ будет добавлено приложение.This may include pulling the base image from Docker Hub, and then adding your app to that image.

После выполнения этой команды можно выполнить команду docker images для просмотра сведений о новом образе:Once that command completes, you can run the docker images command to see information on the new image:

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

Идентификатор IMAGE ID на вашем компьютере будет другим.The IMAGE ID will be different on your machine. Теперь запустим приложение.Now, let's run the app.

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

Чтобы запустить контейнер, нужно выполнить следующую команду docker run:Start a container by executing the following docker run command:

docker run -d --name randomanswers mvcrandomanswers

Аргумент -d предписывает Docker запустить образ в отсоединенном режиме.The -d argument tells Docker to start the image in detached mode. Это значит, что образ Docker запускается в отрыве от текущей оболочки.That means the Docker image runs disconnected from the current shell.

Во многих примерах докеров можно увидеть -p для картирования контейнеров и портов-хостелей.In many docker examples, you may see -p to map the container and host ports. Изображение aspnet по умолчанию уже настроило контейнер для прослушивания на порту 80 и его обнажения.The default aspnet image has already configured the container to listen on port 80 and expose it.

Аргумент --name randomanswers содержит имя запущенного контейнера.The --name randomanswers gives a name to the running container. Это имя можно использовать вместо идентификатора контейнера в большинстве команд.You can use this name instead of the container ID in most commands.

mvcrandomanswers — это имя запускаемого образа.The mvcrandomanswers is the name of the image to start.

Проверка в браузереVerify in the browser

Как только контейнер запускается, подключитесь к бегущей таре, используя http://localhost в приведенном примере.Once the container starts, connect to the running container using http://localhost in the example shown. Введите этот URL-адрес в адресной строке браузера, и вы увидите работающий сайт.Type that URL into your browser, and you should see the running site.

Note

Некоторые программы VPN или прокси-серверы могут препятствовать переходу на ваш узел.Some VPN or proxy software may prevent you from navigating to your site. Их можно временно отключить, чтобы убедиться, что контейнер работает.You can temporarily disable it to make sure your container is working.

Каталог образцов на GitHub содержит Сценарий PowerShell, который выполняет эти команды за вас.The sample directory on GitHub contains a PowerShell script that executes these commands for you. Откройте окно PowerShell, перейдите в каталог решения и введите команду:Open a PowerShell window, change directory to your solution directory, and type:

./run.ps1

Команда выше строит изображение, отображает список изображений на вашей машине, и запускает контейнер.The command above builds the image, displays the list of images on your machine, and starts a container.

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

docker stop randomanswers

Чтобы удалить контейнер, выполните команду docker rm:To remove the container, issue a docker rm command:

docker rm randomanswers