Руководство. Создание и развертывание образов контейнера в облаке с помощью службы "Задачи Реестра контейнеров Azure"Tutorial: Build and deploy container images in the cloud with Azure Container Registry Tasks

Задачи ACR — это набор компонентов в Реестре контейнеров Azure, предоставляющий упрощенные и эффективные сборки образов контейнера Docker в Azure.ACR Tasks is a suite of features within Azure Container Registry that provides streamlined and efficient Docker container image builds in Azure. В этой статье вы узнаете, как использовать функцию быстрой задачи решения "Задачи ACR".In this article, you learn how to use the quick task feature of ACR Tasks.

Цикл разработки "внутреннего цикла" — это итеративный процесс написания кода, сборки и тестирования приложения перед фиксацией в системе управления версиями.The "inner-loop" development cycle is the iterative process of writing code, building, and testing your application before committing to source control. Функция "Быстрая задача" расширяет внутренний цикл разработки в облако, предоставляя успешную проверку сборки и автоматическую отправку успешно созданных образов в реестр контейнеров.A quick task extends your inner-loop to the cloud, providing you with build success validation and automatic pushing of successfully built images to your container registry. Образы изначально создаются в облаке, ближе к вашему реестру, что обеспечивает быстрое развертывание.Your images are built natively in the cloud, close to your registry, enabling faster deployment.

Все знания о файле Dockerfile можно использовать в решении "Задачи ACR".All your Dockerfile expertise is directly transferrable to ACR Tasks. Вам не нужно менять файлы Dockerfile для выполнения сборки в облаке с помощью решения "Задачи ACR", а только выполняемые команды.You don't have to change your Dockerfiles to build in the cloud with ACR Tasks, just the command you run.

В этом руководстве, которое является первой частью серии, вы:In this tutorial, part one of a series:

  • получите исходный код примера приложения;Get the sample application source code
  • создадите образ контейнера в Azure;Build a container image in Azure
  • Развертывание контейнера в службе "Экземпляры контейнеров Azure"Deploy a container to Azure Container Instances

В последующих руководствах вы узнаете, как использовать задачи сборки решения "Задачи ACR" для автоматической сборки образов контейнеров при фиксации кода и обновлении базового образа.In subsequent tutorials, you learn to use ACR Tasks for automated container image builds on code commit and base image update. С помощью решения "Задачи ACR" можно также запускать многошаговые задачи, используя файл YAML для определения действий по созданию, отправке и тестированию (при необходимости) нескольких контейнеров.ACR Tasks can also run multi-step tasks, using a YAML file to define steps to build, push, and optionally test multiple containers.

Использование Azure Cloud ShellUse Azure Cloud Shell

В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell.You can use either Bash or PowerShell with Cloud Shell to work with Azure services. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.You can use the Cloud Shell preinstalled commands to run the code in this article without having to install anything on your local environment.

Начало работы с Azure Cloud ShellTo start Azure Cloud Shell:

ПараметрOption Пример и ссылкаExample/Link
Нажмите кнопку Попробовать в правом верхнем углу блока с кодом.Select Try It in the upper-right corner of a code block. При нажатии кнопки Попробовать код не копируется в Cloud Shell автоматически.Selecting Try It doesn't automatically copy the code to Cloud Shell. Открытие Azure Cloud Shell с помощью кнопки "Попробовать"
Перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell, чтобы открыть Cloud Shell в браузере.Go to https://shell.azure.com, or select the Launch Cloud Shell button to open Cloud Shell in your browser. Запуск Cloud Shell в новом окнеLaunch Cloud Shell in a new window
На портале Azure в правом верхнем углу в строке меню нажмите кнопку Cloud Shell.Select the Cloud Shell button on the top-right menu bar in the Azure portal. Кнопка "Cloud Shell" на портале Azure

Чтобы выполнить код из этой статьи в Azure Cloud Shell, выполните следующие действия:To run the code in this article in Azure Cloud Shell:

  1. Запустите Cloud Shell.Start Cloud Shell.

  2. В блоке кода нажмите кнопку Копировать, чтобы скопировать код.Select the Copy button on a code block to copy the code.

  3. Вставьте код в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.Paste the code into the Cloud Shell session by selecting Ctrl+Shift+V on Windows and Linux or by selecting Cmd+Shift+V on macOS.

  4. Нажмите клавишу ВВОД, чтобы выполнить код.Select Enter to run the code.

Если вы хотите использовать Azure CLI локально, установите Azure CLI 2.0.46 или более поздней версии и выполните вход с помощью команды az login.If you'd like to use the Azure CLI locally, you must have Azure CLI version 2.0.46 or later installed and logged in with az login. Чтобы узнать версию, выполните команду az --version.Run az --version to find the version. Если вам необходимо установить или обновить CLI, см. статью Установка Azure CLI.If you need to install or upgrade the CLI, see Install Azure CLI.

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

Учетная запись GitHubGitHub account

Создайте учетную запись на сайте https://github.com, если у вас ее еще нет.Create an account on https://github.com if you don't already have one. В этой серии руководств репозиторий GitHub используется для демонстрации автоматического создания образов в решении "Задачи ACR".This tutorial series uses a GitHub repository to demonstrate automated image builds in ACR Tasks.

Создание вилки примера репозиторияFork sample repository

Затем с помощью пользовательского интерфейса GitHub создайте вилку примера хранилища в своей учетной записи GitHub.Next, use the GitHub UI to fork the sample repository into your GitHub account. В этом руководстве создается образ контейнера из источника в репозитории, а в следующем выполняется отправка фиксации в вилку репозитория для запуска автоматической задачи.In this tutorial, you build a container image from the source in the repo, and in the next tutorial, you push a commit to your fork of the repo to kick off an automated task.

Создайте вилку этого репозитория: https://github.com/Azure-Samples/acr-build-helloworld-node.Fork this repository: https://github.com/Azure-Samples/acr-build-helloworld-node

Снимок экрана с выделенной кнопкой "Fork" (Создать вилку) в GitHub

Клонирование вилкиClone your fork

После создания вилки репозитория клонируйте свою вилку и войдите в каталог, содержащий локальный клон.Once you've forked the repo, clone your fork and enter the directory containing your local clone.

Клонируйте репозиторий с помощью git, замените <your-github-username> своим именем пользователя GitHub:Clone the repo with git, replace <your-github-username> with your GitHub username:

git clone https://github.com/<your-github-username>/acr-build-helloworld-node

Введите каталог, содержащий исходный код:Enter the directory containing the source code:

cd acr-build-helloworld-node

Оболочка BashBash shell

Команды в данной серии руководств отформатированы для оболочки Bash.The commands in this tutorial series are formatted for the Bash shell. Если вы предпочитаете использовать PowerShell, командную строку или другую оболочку, может потребоваться скорректировать продолжение строки и формат переменной среды соответствующим образом.If you prefer to use PowerShell, Command Prompt, or another shell, you may need to adjust the line continuation and environment variable format accordingly.

Сборка в Azure с использованием решения "Задачи ACR"Build in Azure with ACR Tasks

Теперь, когда исходный код извлечен на компьютер, выполните следующие действия, чтобы создать реестр контейнеров и образ контейнера с помощью решения "Задачи ACR".Now that you've pulled the source code down to your machine, follow these steps to create a container registry and build the container image with ACR Tasks.

Чтобы упростить выполнение примеров команд, руководства из этой серии используют переменные среды оболочки.To make executing the sample commands easier, the tutorials in this series use shell environment variables. Выполните следующую команду, чтобы задать переменную ACR_NAME.Execute the following command to set the ACR_NAME variable. Замените <registry-name> уникальным именем нового реестра контейнеров.Replace <registry-name> with a unique name for your new container registry. Имя реестра должно быть уникальным в пределах Azure и состоять только из строчных букв и содержать от 5 до 50 буквенно-цифровых знаков.The registry name must be unique within Azure, contain only lower case letters, and contain 5-50 alphanumeric characters. Другие ресурсы, создаваемые в руководстве, основаны на этом имени, поэтому вам требуется изменить только первую переменную.The other resources you create in the tutorial are based on this name, so you should need to modify only this first variable.

ACR_NAME=<registry-name>

Теперь, когда переменная среды реестра контейнеров заполнена, можно копировать оставшиеся команды и вставлять их в руководство без изменения каких-либо значений.With the container registry environment variable populated, you should now be able to copy and paste the remainder of the commands in the tutorial without editing any values. Для создания группы ресурсов и реестра контейнеров выполните следующие команды:Execute the following commands to create a resource group and container registry:

RES_GROUP=$ACR_NAME # Resource Group name

az group create --resource-group $RES_GROUP --location eastus
az acr create --resource-group $RES_GROUP --name $ACR_NAME --sku Standard --location eastus

Теперь, когда у вас есть реестр, используйте решение "Задачи ACR" для создания образа контейнера из примера кода.Now that you have a registry, use ACR Tasks to build a container image from the sample code. Выполните команду az acr build, чтобы запустить быструю задачу:Execute the az acr build command to perform a quick task:

az acr build --registry $ACR_NAME --image helloacrtasks:v1 .

Результат выполнения команды az acr build будет аналогичен следующему примеру.Output from the az acr build command is similar to the following. Вы можете просмотреть сведения об отправке исходного кода ("контекста") в Azure и дополнительные сведения об операции docker build, которую решение "Задача ACR" выполняет в облаке.You can see the upload of the source code (the "context") to Azure, and the details of the docker build operation that the ACR task runs in the cloud. Так как решение "Задачи ACR" использует docker build для создания образов, чтобы начать немедленно использовать это решение, изменения в файлах Dockerfiles не требуются.Because ACR tasks use docker build to build your images, no changes to your Dockerfiles are required to start using ACR Tasks immediately.

$ az acr build --registry $ACR_NAME --image helloacrtasks:v1 .
Packing source code into tar file to upload...
Sending build context (4.813 KiB) to ACR...
Queued a build with build ID: da1
Waiting for build agent...
2018/08/22 18:31:42 Using acb_vol_01185991-be5f-42f0-9403-a36bb997ff35 as the home volume
2018/08/22 18:31:42 Setting up Docker configuration...
2018/08/22 18:31:43 Successfully set up Docker configuration
2018/08/22 18:31:43 Logging in to registry: myregistry.azurecr.io
2018/08/22 18:31:55 Successfully logged in
Sending build context to Docker daemon   21.5kB
Step 1/5 : FROM node:9-alpine
9-alpine: Pulling from library/node
Digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
Status: Image is up to date for node:9-alpine
 ---> a56170f59699
Step 2/5 : COPY . /src
 ---> 88087d7e709a
Step 3/5 : RUN cd /src && npm install
 ---> Running in e80e1263ce9a
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN helloworld@1.0.0 No repository field.

up to date in 0.1s
Removing intermediate container e80e1263ce9a
 ---> 26aac291c02e
Step 4/5 : EXPOSE 80
 ---> Running in 318fb4c124ac
Removing intermediate container 318fb4c124ac
 ---> 113e157d0d5a
Step 5/5 : CMD ["node", "/src/server.js"]
 ---> Running in fe7027a11787
Removing intermediate container fe7027a11787
 ---> 20a27b90eb29
Successfully built 20a27b90eb29
Successfully tagged myregistry.azurecr.io/helloacrtasks:v1
2018/08/22 18:32:11 Pushing image: myregistry.azurecr.io/helloacrtasks:v1, attempt 1
The push refers to repository [myregistry.azurecr.io/helloacrtasks]
6428a18b7034: Preparing
c44b9827df52: Preparing
172ed8ca5e43: Preparing
8c9992f4e5dd: Preparing
8dfad2055603: Preparing
c44b9827df52: Pushed
172ed8ca5e43: Pushed
8dfad2055603: Pushed
6428a18b7034: Pushed
8c9992f4e5dd: Pushed
v1: digest: sha256:b038dcaa72b2889f56deaff7fa675f58c7c666041584f706c783a3958c4ac8d1 size: 1366
2018/08/22 18:32:43 Successfully pushed image: myregistry.azurecr.io/helloacrtasks:v1
2018/08/22 18:32:43 Step ID acb_step_0 marked as successful (elapsed time in seconds: 15.648945)
The following dependencies were found:
- image:
    registry: myregistry.azurecr.io
    repository: helloacrtasks
    tag: v1
    digest: sha256:b038dcaa72b2889f56deaff7fa675f58c7c666041584f706c783a3958c4ac8d1
  runtime-dependency:
    registry: registry.hub.docker.com
    repository: library/node
    tag: 9-alpine
    digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
  git: {}

Run ID: da1 was successful after 1m9.970148252s

В конце выходных данных решения "Задачи ACR" отображаются зависимости, обнаруженные для образа.Near the end of the output, ACR Tasks displays the dependencies it's discovered for your image. Таким образом решение может автоматизировать создание образов при обновлении базовых образов, например, когда базовый образ обновляется в связи с установкой исправлений ОС или платформы.This enables ACR Tasks to automate image builds on base image updates, such as when a base image is updated with OS or framework patches. Вы узнаете о том, как решение "Задачи ACR" поддерживает обновления базовых образов, позже в этом цикле руководств.You learn about ACR Tasks support for base image updates later in this tutorial series.

Развертывание в службу "Экземпляры контейнеров Azure"Deploy to Azure Container Instances

Решение "Задачи ACR" по умолчанию автоматически отправляет успешно созданные образы в реестр, позволяя сразу развертывать их из реестра.ACR tasks automatically push successfully built images to your registry by default, allowing you to deploy them from your registry immediately.

В этом разделе создается Azure Key Vault и субъект-служба, после чего в службу "Экземпляры контейнеров Azure" развертывается контейнер с использованием учетных данных субъекта-службы.In this section, you create an Azure Key Vault and service principal, then deploy the container to Azure Container Instances (ACI) using the service principal's credentials.

Настройка проверки подлинности в реестреConfigure registry authentication

Все производственные сценарии должны использовать субъекты-службы для получения доступа к реестру контейнеров Azure.All production scenarios should use service principals to access an Azure container registry. Субъекты-службы позволяют вам предоставлять контроль доступа на основе ролей к образам вашего контейнера.Service principals allow you to provide role-based access control to your container images. Например, вы можете настроить субъект-службу с доступом только на извлечение к реестру.For example, you can configure a service principal with pull-only access to a registry.

Создайте хранилище ключей.Create a key vault

Если у вас еще нет хранилища в Azure Key Vault, создайте его с помощью Azure CLI, используя следующие команды.If you don't already have a vault in Azure Key Vault, create one with the Azure CLI using the following commands.

AKV_NAME=$ACR_NAME-vault

az keyvault create --resource-group $RES_GROUP --name $AKV_NAME

Создание учетной записи субъекта-службы и сохранение учетных данныхCreate a service principal and store credentials

Теперь вам нужно создать субъект-службу и сохранить его учетные данные в хранилище ключей.You now need to create a service principal and store its credentials in your key vault.

Используйте команду az ad sp create-for-rbac для создания субъекта-службы и az keyvault secret set для сохранения пароля субъекта-службы в хранилище:Use the az ad sp create-for-rbac command to create the service principal, and az keyvault secret set to store the service principal's password in the vault:

# Create service principal, store its password in AKV (the registry *password*)
az keyvault secret set \
  --vault-name $AKV_NAME \
  --name $ACR_NAME-pull-pwd \
  --value $(az ad sp create-for-rbac \
                --name $ACR_NAME-pull \
                --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
                --role acrpull \
                --query password \
                --output tsv)

Аргумент --role в предыдущей команде настраивает субъект-службу с ролью acrpull, которая предоставляет доступ только для извлечения к реестру.The --role argument in the preceding command configures the service principal with the acrpull role, which grants it pull-only access to the registry. Чтобы предоставить доступ для отправки и извлечения данных, измените аргумент --role на acrpush.To grant both push and pull access, change the --role argument to acrpush.

Затем сохраните в хранилище appId субъекта-службы, который является именем пользователя, переданным в реестр контейнеров Azure для проверки подлинности:Next, store the service principal's appId in the vault, which is the username you pass to Azure Container Registry for authentication:

# Store service principal ID in AKV (the registry *username*)
az keyvault secret set \
    --vault-name $AKV_NAME \
    --name $ACR_NAME-pull-usr \
    --value $(az ad sp show --id http://$ACR_NAME-pull --query appId --output tsv)

Вы создали хранилище ключей Azure и сохранили в нем два секрета:You've created an Azure Key Vault and stored two secrets in it:

  • $ACR_NAME-pull-usr: идентификатор субъекта-службы для использования в качестве имени пользователя реестра контейнеров.$ACR_NAME-pull-usr: The service principal ID, for use as the container registry username.
  • $ACR_NAME-pull-pwd: пароль субъекта-службы для использования в качестве пароля реестра контейнеров.$ACR_NAME-pull-pwd: The service principal password, for use as the container registry password.

Теперь вы можете ссылаться на эти секреты по имени, когда вы или ваши приложения и службы извлекают образы из реестра.You can now reference these secrets by name when you or your applications and services pull images from the registry.

Развертывание контейнера с помощью Azure CLIDeploy a container with Azure CLI

Теперь, когда учетные данные субъекта-службы хранятся в секретах Аzure Key Vault, ваши приложения и службы могут использовать их для доступа к вашему частному реестру.Now that the service principal credentials are stored as Azure Key Vault secrets, your applications and services can use them to access your private registry.

Выполните следующую команду az container create, чтобы развернуть экземпляр контейнера.Execute the following az container create command to deploy a container instance. Команда использует учетные данные субъекта-службы, хранящиеся в Azure Key Vault, для проверки подлинности в вашем реестре контейнеров.The command uses the service principal's credentials stored in Azure Key Vault to authenticate to your container registry.

az container create \
    --resource-group $RES_GROUP \
    --name acr-tasks \
    --image $ACR_NAME.azurecr.io/helloacrtasks:v1 \
    --registry-login-server $ACR_NAME.azurecr.io \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-usr --query value -o tsv) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-pwd --query value -o tsv) \
    --dns-name-label acr-tasks-$ACR_NAME \
    --query "{FQDN:ipAddress.fqdn}" \
    --output table

Значение --dns-name-label должно быть уникальным в пределах Azure, поэтому предыдущая команда добавляет имя реестра контейнеров к метке DNS-имени контейнера.The --dns-name-label value must be unique within Azure, so the preceding command appends your container registry's name to the container's DNS name label. В выходных данных команды содержится полное доменное имя (FQDN) контейнера, например:The output from the command displays the container's fully qualified domain name (FQDN), for example:

$ az container create \
>     --resource-group $RES_GROUP \
>     --name acr-tasks \
>     --image $ACR_NAME.azurecr.io/helloacrtasks:v1 \
>     --registry-login-server $ACR_NAME.azurecr.io \
>     --registry-username $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-usr --query value -o tsv) \
>     --registry-password $(az keyvault secret show --vault-name $AKV_NAME --name $ACR_NAME-pull-pwd --query value -o tsv) \
>     --dns-name-label acr-tasks-$ACR_NAME \
>     --query "{FQDN:ipAddress.fqdn}" \
>     --output table
FQDN
----------------------------------------------
acr-tasks-myregistry.eastus.azurecontainer.io

Запишите имя FQDN контейнера. Оно будет использоваться в следующем разделе.Take note of the container's FQDN, you'll use it in the next section.

Проверка развертыванияVerify the deployment

Для контроля процесса запуска контейнера используйте команду az container attach:To watch the startup process of the container, use the az container attach command:

az container attach --resource-group $RES_GROUP --name acr-tasks

Выходные данные az container attach сначала отображают состояние контейнера, когда он извлекает образ и запускается, а затем связывает STDOUT и STDERR вашей локальной консоли с аналогичным содержимым контейнера.The az container attach output first displays the container's status as it pulls the image and starts, then binds your local console's STDOUT and STDERR to that of the container's.

$ az container attach --resource-group $RES_GROUP --name acr-tasks
Container 'acr-tasks' is in state 'Running'...
(count: 1) (last timestamp: 2018-08-22 18:39:10+00:00) pulling image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2018-08-22 18:39:15+00:00) Successfully pulled image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2018-08-22 18:39:17+00:00) Created container
(count: 1) (last timestamp: 2018-08-22 18:39:17+00:00) Started container

Start streaming logs:
Server running at http://localhost:80

После появления Server running at http://localhost:80 перейдите к FQDN контейнера в браузере, чтобы просмотреть работающее приложение.When Server running at http://localhost:80 appears, navigate to the container's FQDN in your browser to see the running application. Полное доменное имя должно появиться в выходных данных команды az container create, которую вы выполнили в предыдущем разделе.The FQDN should have been displayed in the output of the az container create command you executed in the previous section.

Снимок экрана примера приложения, отображаемого в браузере

Чтобы окончательно отсоединить консоль от контейнера, нажмите клавиши Control+C.To detach your console from the container, hit Control+C.

Очистка ресурсовClean up resources

Остановите экземпляр контейнера с помощью команды az container delete:Stop the container instance with the az container delete command:

az container delete --resource-group $RES_GROUP --name acr-tasks

Чтобы удалить все ресурсы, созданные в этом руководстве, включая реестр контейнеров, хранилище ключей и субъект-службу, выполните следующие команды.To remove all resources you've created in this tutorial, including the container registry, key vault, and service principal, issue the following commands. Однако эти ресурсы используются в следующем руководстве цикла, поэтому их можно оставить, если вы хотите перейти напрямую к следующему руководству.These resources are used in the next tutorial in the series, however, so you might want to keep them if you move on directly to the next tutorial.

az group delete --resource-group $RES_GROUP
az ad sp delete --id http://$ACR_NAME-pull

Дополнительная информацияNext steps

Теперь, когда вы протестировали внутренний цикл с быстрой задачей, настройте задачу сборки для активации сборок образов контейнера при фиксации исходного кода в репозитории Git:Now that you've tested your inner loop with a quick task, configure a build task to trigger container images builds when you commit source code to a Git repository: