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

Область применения: Windows Server 2022, Windows Server 2019, Windows Server 2016

В этом разделе описывается упаковка существующего примера приложения .NET для развертывания в качестве контейнера Windows после настройки среды, как описано в разделе Начало работы: подготовка Windows для контейнеров, и запуска первого контейнера, как описано в разделе Запуск первого контейнера Windows.

Кроме того, на компьютере должна быть установлена система управления исходным кодом Git. Чтобы установить его, перейдите на Git.

Клонирование примера кода из GitHub

Весь исходный код примера контейнера хранится в папке репозитория Git Virtualization-Documentation в папку с именем windows-container-samples.

  1. Откройте сеанс PowerShell и перейдите в папку, в которой вы хотите сохранить этот репозиторий. (Можно использовать и другие инструменты командной строки, но здесь в примерах команд используется PowerShell.)

  2. Клонируйте репозиторий в текущий рабочий каталог:

    git clone https://github.com/MicrosoftDocs/Virtualization-Documentation.git
    
  3. Перейдите к каталогу примеров в разделе Virtualization-Documentation\windows-container-samples\asp-net-getting-started и создайте Dockerfile с помощью следующих команд.

    Dockerfile похож на файл makefile — это список инструкций, указывающих обработчику контейнеров, как создать образ контейнера.

    # 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
    

Запись Dockerfile

Откройте только что созданный Dockerfile в любом текстовом редакторе, а затем добавьте в него следующее:

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"]

Давайте построчно рассмотрим содержимое и объясним, что делает каждая инструкция.

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

В первой группе строк объявляется базовый образ, который будет использоваться для создания контейнера. Если в локальной системе еще нет этого образа, Docker автоматически попробует извлечь его. mcr.microsoft.com/dotnet/core/sdk:2.1 поставляется с установленным пакетом SDK для .NET Core 2.1, поэтому нужно создавать проект ASP .NET Core, предназначенный для версии 2.1. Следующая инструкция изменяет рабочий каталог в контейнере на /app, поэтому все команды, следующие за этой командой, выполняются в этом контексте.

COPY *.csproj ./
RUN dotnet restore

Затем эти инструкции копируют CSPROJ-файлы в каталог /app контейнера build-env. После копирования этого файла платформа .NET считает из него данные и извлечет все зависимые компоненты и средства для этого проекта.

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

После того как .NET извлекают все зависимости в контейнер build-env, следующая инструкция копирует все исходные файлы проекта в контейнер. Затем мы дадим .NET команду опубликовать приложение с финальной конфигурацией и укажем путь вывода.

После этого должна начаться компиляция. Теперь необходимо создать окончательный образ.

Совет

В этом кратком руководстве выполняется сборка проекта .NET Core из источника. При создании образов контейнеров в образ рекомендуется включать только рабочие нагрузки и зависимые компоненты. Нам не нужно, чтобы пакет SDK для .NET Core включался в окончательный образ, так как нам нужна лишь среда выполнения .NET Core, поэтому для создания приложения в dockerfile определяется использование временного контейнера, упакованного с помощью пакета SDK build-env.

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, мы задаем образ, в состав которого входит среда выполнения. Затем мы скопируем все файлы из выходного каталога временного контейнера в финальный контейнер. Контейнер настраивается для работы с этим новым приложением в качестве точки входа при запуске контейнера.

Файл dockerfile предусматривает выполнение многоэтапной сборки. При выполнении dockerfile будет использоваться временный контейнер build-env, пакет SDK для .NET Core 2.1 будет использоваться для создания примера приложения, а затем введенные двоичные файлы будут скопированы в другой контейнер, содержащий только среду выполнения .NET Core 2.1, чтобы максимально сократить размер окончательного контейнера.

Сборка и запуск приложения

После написания Dockerfile можно указать Docker в нашем Dockerfile и дать ему команду сборки и запуска образа:

  1. В окне командной строки перейдите в каталог, в котором находится dockerfile, а затем выполните команду docker build, чтобы создать контейнер из Dockerfile.

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

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

    Давайте изучим эту команду:

    • -d сообщает Docker, что нужно запустить контейнер в режиме "отсоединен", что означает, что консоль не подключена к консоли в контейнере. Контейнер запускается в фоновом режиме.
    • -p 5000:80 сообщает Docker о сопоставлении порта 5000 на узле с портом 80 в контейнере. Каждый контейнер получает свой собственный IP-адрес. По умолчанию ASP .NET прослушивает порт 80. Сопоставление портов позволяет переходить на IP-адрес узла на сопоставленном порте, и Docker будет пересылать весь трафик на целевой порт в контейнере.
    • --name myapp сообщает Docker о необходимости предоставить этому контейнеру удобное имя для отправки запросов (вместо того, чтобы искать идентификатор контейнера, назначенного в среде выполнения Docker).
    • my-asp-app — это образ, который должен запустить Docker. Это образ контейнера, созданный в результате процесса docker build.
  3. Откройте веб-браузер и перейдите по адресу http://localhost:5000, чтобы просмотреть контейнерное приложение, как показано на снимке экрана ниже:

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

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

  1. Следующим шагом является публикация контейнерного веб-приложения ASP.NET в частном реестре с помощью реестра контейнеров Azure. Это позволяет развернуть его в вашей организации.

    В этом разделе рассматривается отправка образа контейнера в реестр, указание имени только что упакованного приложения ASP.NET (my-asp-app) и реестра контейнеров (например: contoso-container-registry):

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

    Дополнительные примеры приложений и связанные с ними файлы dockerfile см. здесь.

  2. После публикации приложения в реестре контейнеров следующим шагом будет развертывание приложения в кластере Kubernetes, созданном с помощью службы Kubernetes в Azure.