Контейнеризация приложений .NET CoreContainerize a .NET Core App

В этом разделе описывается упаковка существующего примера приложения .NET для развертывания в качестве контейнера Windows после настройки среды, как описано в разделе Начало работы: подготовка Windows для контейнеров, и запуска первого контейнера, как описано в разделе Запуск первого контейнера Windows.This topic describes how to package an existing sample .NET app for deployment as a Windows container, after setting up your environment as described in Get started: Prep Windows for containers, and running your first container as described in Run your first Windows container.

Кроме того, на компьютере должна быть установлена система управления исходным кодом Git.You'll also need the Git source control system installed on your computer. Чтобы установить его, перейдите на Git.To install it, visit Git.

Клонирование примера кода из GitHubClone the sample code from GitHub

Весь исходный код примера контейнера хранится в папке репозитория Git Virtualization-Documentation в папку с именем windows-container-samples.All container sample source code is kept under the Virtualization-Documentation git repository (known informally as a repo) in a folder called windows-container-samples.

  1. Откройте сеанс PowerShell и перейдите в папку, в которой вы хотите сохранить этот репозиторий.Open a PowerShell session and change directories to the folder in which you want to store this repository. (Можно использовать и другие инструменты командной строки, но здесь в примерах команд используется PowerShell.)(Other command prompt window types work as well, but our example commands use PowerShell.)

  2. Клонируйте репозиторий в текущий рабочий каталог:Clone the repo to your current working directory:

    git clone https://github.com/MicrosoftDocs/Virtualization-Documentation.git
    
  3. Перейдите к каталогу примеров в разделе Virtualization-Documentation\windows-container-samples\asp-net-getting-started и создайте Dockerfile с помощью следующих команд.Navigate to the sample directory found under Virtualization-Documentation\windows-container-samples\asp-net-getting-started and create a Dockerfile, using the following commands.

    Dockerfile похож на файл makefile — это список инструкций, указывающих обработчику контейнеров, как создать образ контейнера.A Dockerfile is like a makefile—it's a list of instructions that tell the container engine how to build the container image.

    # Navigate into the sample directory
    Set-Location -Path Virtualization-Documentation\windows-container-samples\asp-net-getting-started
    
    # Create the Dockerfile for our project
    New-Item -Name Dockerfile -ItemType file
    

Запись DockerfileWrite the Dockerfile

Откройте только что созданный Dockerfile в любом текстовом редакторе, а затем добавьте в него следующее:Open the Dockerfile you just created with whichever text editor you like and then add the following content:

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

Давайте построчно рассмотрим содержимое и объясним, что делает каждая инструкция.Let's break it down line-by-line and explain what each instructions does.

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

В первой группе строк объявляется базовый образ, который будет использоваться для создания контейнера.The first group of lines declares from which base image we will use to build our container on top of. Если в локальной системе еще нет этого образа, Docker автоматически попробует извлечь его.If the local system does not have this image already, then docker will automatically try and fetch it. mcr.microsoft.com/dotnet/core/sdk:2.1 поставляется с установленным пакетом SDK для .NET Core 2.1, поэтому нужно создавать проект ASP .NET Core, предназначенный для версии 2.1.The mcr.microsoft.com/dotnet/core/sdk:2.1 comes packaged with the .NET core 2.1 SDK installed, so it's up to the task of building ASP .NET core projects targeting version 2.1. Следующая инструкция изменяет рабочий каталог в контейнере на /app, поэтому все команды, следующие за этой командой, выполняются в этом контексте.The next instruction changes the working directory in our container to be /app, so all commands following this one execute under this context.

COPY *.csproj ./
RUN dotnet restore

Затем эти инструкции копируют CSPROJ-файлы в каталог /app контейнера build-env.Next, these instructions copy over the .csproj files into the build-env container's /app directory. После копирования этого файла платформа .NET считает из него данные и извлечет все зависимые компоненты и средства для этого проекта.After copying this file, .NET will read from it and then to go out and fetch all the dependencies and tools needed by our project.

COPY . ./
RUN dotnet publish -c Release -o out

После того как .NET извлекают все зависимости в контейнер build-env, следующая инструкция копирует все исходные файлы проекта в контейнер.Once .NET has pulled all the dependencies into the build-env container, the next instruction copies all project source files into the container. Затем мы дадим .NET команду опубликовать приложение с финальной конфигурацией и укажем путь вывода.We then tell .NET to publish our application with a release configuration and specify the output path in the .

После этого должна начаться компиляция.The compilation should succeed. Теперь необходимо создать окончательный образ.Now we must build the final image.

Совет

В этом кратком руководстве выполняется сборка проекта .NET Core из источника.This quickstart builds a .NET core project from source. При создании образов контейнеров в образ рекомендуется включать только рабочие нагрузки и зависимые компоненты.When building container images, it's good practice to include only the production payload and its dependencies in the container image. Нам не нужно, чтобы пакет SDK для .NET Core включался в окончательный образ, так как нам нужна лишь среда выполнения .NET Core, поэтому для создания приложения в dockerfile определяется использование временного контейнера, упакованного с помощью пакета SDK build-env.We don't want the .NET core SDK included in our final image because we only need the .NET core runtime, so the dockerfile is written to use a temporary container that is packaged with the SDK called build-env to build the app.

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

Так как наше приложение — ASP.NET, мы задаем образ, в состав которого входит среда выполнения.Since our application is ASP.NET, we specify an image with this runtime included. Затем мы скопируем все файлы из выходного каталога временного контейнера в финальный контейнер.We then copy over all files from the output directory of our temporary container into our final container. Контейнер настраивается для работы с этим новым приложением в качестве точки входа при запуске контейнера.We configure our container to run with our new app as its entrypoint when the container starts

Файл dockerfile предусматривает выполнение многоэтапной сборки.We have written the dockerfile to perform a multi-stage build. При выполнении dockerfile будет использоваться временный контейнер build-env, пакет SDK для .NET Core 2.1 будет использоваться для создания примера приложения, а затем введенные двоичные файлы будут скопированы в другой контейнер, содержащий только среду выполнения .NET Core 2.1, чтобы максимально сократить размер окончательного контейнера.When the dockerfile is executed, it will use the temporary container, build-env, with the .NET core 2.1 SDK to build the sample app and then copy the outputted binaries into another container containing only the .NET core 2.1 runtime so that we minimized the size of the final container.

Сборка и запуск приложенияBuild and run the app

После написания Dockerfile можно указать Docker в нашем Dockerfile и дать ему команду сборки и запуска образа:With the Dockerfile written, we can point Docker at our Dockerfile and tell it to build and then run our image:

  1. В окне командной строки перейдите в каталог, в котором находится dockerfile, а затем выполните команду docker build, чтобы создать контейнер из Dockerfile.In a command prompt window, navigate to the directory where the dockerfile resides and then run the docker build command to build the container from the Dockerfile.

    docker build -t my-asp-app .
    
  2. Чтобы запустить только что созданный контейнер, выполните команду docker run.To run the newly built container, run the docker run command.

    docker run -d -p 5000:80 --name myapp my-asp-app
    

    Давайте изучим эту команду:Let's dissect this command:

    • -d сообщает Docker, что нужно запустить контейнер в режиме "отсоединен", что означает, что консоль не подключена к консоли в контейнере.-d tells Docker to run the container 'detached', meaning no console is hooked up to the console inside the container. Контейнер запускается в фоновом режиме.The container runs in the background.
    • -p 5000:80 сообщает Docker о сопоставлении порта 5000 на узле с портом 80 в контейнере.-p 5000:80 tells Docker to map port 5000 on the host to port 80 in the container. Каждый контейнер получает свой собственный IP-адрес.Each container gets its own IP address. По умолчанию ASP .NET прослушивает порт 80.ASP .NET listens by default on port 80. Сопоставление портов позволяет переходить на IP-адрес узла на сопоставленном порте, и Docker будет пересылать весь трафик на целевой порт в контейнере.Port mapping allows us to go to the host's IP address at the mapped port and Docker will forward all traffic to the destination port inside the container.
    • --name myapp сообщает Docker о необходимости предоставить этому контейнеру удобное имя для отправки запросов (вместо того, чтобы искать идентификатор контейнера, назначенного в среде выполнения Docker).--name myapp tells Docker to give this container a convenient name to query by (instead of having to look up the container ID assigned at runtime by Docker).
    • my-asp-app — это образ, который должен запустить Docker.my-asp-app is the image we want Docker to run. Это образ контейнера, созданный в результате процесса docker build.This is the container image produced as the culmination of the docker build process.
  3. Откройте веб-браузер и перейдите к http://localhost:5000, чтобы просмотреть контейнерное приложение, как показано на снимке экрана ниже:Open a web browser and navigate to http://localhost:5000 to be see your containerized application, as shown in this screenshot:

    Веб-страница ASP.NET Core, открытая с локального узла в контейнере

Дальнейшие действияNext steps

  1. Следующим шагом является публикация контейнерного веб-приложения ASP.NET в частном реестре с помощью реестра контейнеров Azure.The next step is to publish your containerized ASP.NET web app to a private registry using Azure Container Registry. Это позволяет развернуть его в вашей организации.This allows you to deploy it in your org.

    В этом разделе рассматривается отправка образа контейнера в реестр, указание имени только что упакованного приложения ASP.NET (my-asp-app) и реестра контейнеров (например: contoso-container-registry):When you get to the section where you push your container image to the registry, specify the name of the ASP.NET app you just packaged (my-asp-app) along with your container registry (for example: contoso-container-registry):

    docker tag my-asp-app contoso-container-registry.azurecr.io/my-asp-app:v1
    

    Дополнительные примеры приложений и связанные с ними файлы dockerfile см. здесь.To see more app samples and their associated dockerfiles, see additional container samples.

  2. После публикации приложения в реестре контейнеров следующим шагом будет развертывание приложения в кластере Kubernetes, созданном с помощью службы Kubernetes в Azure.Once you've published your app to the container registry, the next step would be to deploy the app to a Kubernetes cluster that you create with Azure Kubernetes Service.