Руководство. Создание и развертывание образов контейнера в облаке с помощью службы "Задачи Реестра контейнеров Azure"
Задачи ACR — это набор компонентов в Реестре контейнеров Azure, предоставляющий упрощенные и эффективные сборки образов контейнера Docker в Azure. В этой статье вы узнаете, как использовать функцию быстрой задачи решения "Задачи ACR".
Цикл разработки "внутреннего цикла" — это итеративный процесс написания кода, сборки и тестирования приложения перед фиксацией в системе управления версиями. Функция "Быстрая задача" расширяет внутренний цикл разработки в облако, предоставляя успешную проверку сборки и автоматическую отправку успешно созданных образов в реестр контейнеров. Образы изначально создаются в облаке, ближе к вашему реестру, что обеспечивает быстрое развертывание.
Все знания о файле Dockerfile можно использовать в решении "Задачи ACR". Вам не нужно менять файлы Dockerfile для выполнения сборки в облаке с помощью решения "Задачи ACR", а только выполняемые команды.
В этом руководстве, которое является первой частью серии, вы:
- получите исходный код примера приложения;
- создадите образ контейнера в Azure;
- Развертывание контейнера в службе "Экземпляры контейнеров Azure"
В последующих руководствах вы узнаете, как использовать задачи сборки решения "Задачи ACR" для автоматической сборки образов контейнеров при фиксации кода и обновлении базового образа. С помощью решения "Задачи ACR" можно также запускать многошаговые задачи, используя файл YAML для определения действий по созданию, отправке и тестированию (при необходимости) нескольких контейнеров.
Необходимые компоненты
учетная запись GitHub;
Создайте учетную запись на сайте https://github.com, если у вас ее еще нет. В этой серии руководств репозиторий GitHub используется для демонстрации автоматического создания образов в решении "Задачи ACR".
Создание вилки примера репозитория
Затем с помощью пользовательского интерфейса GitHub создайте вилку примера хранилища в своей учетной записи GitHub. В этом руководстве создается образ контейнера из источника в репозитории, а в следующем выполняется отправка фиксации в вилку репозитория для запуска автоматической задачи.
Создайте вилку этого репозитория: https://github.com/Azure-Samples/acr-build-helloworld-node.
Клонирование вилки
После создания вилки репозитория клонируйте свою вилку и войдите в каталог, содержащий локальный клон.
Клонируйте репозиторий с помощью git
, замените <your-github-username> своим именем пользователя GitHub:
git clone https://github.com/<your-github-username>/acr-build-helloworld-node
Введите каталог, содержащий исходный код:
cd acr-build-helloworld-node
Оболочка Bash
Команды в данной серии руководств отформатированы для оболочки Bash. Если вы предпочитаете использовать PowerShell, командную строку или другую оболочку, может потребоваться скорректировать продолжение строки и формат переменной среды соответствующим образом.
Подготовка среды к работе с Azure CLI
Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.
Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.
Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
Сборка в Azure с использованием решения "Задачи ACR"
Теперь, когда исходный код извлечен на компьютер, выполните следующие действия, чтобы создать реестр контейнеров и образ контейнера с помощью решения "Задачи ACR".
Чтобы упростить выполнение примеров команд, руководства из этой серии используют переменные среды оболочки. Выполните следующую команду, чтобы задать переменную ACR_NAME
. Замените <registry-name> уникальным именем нового реестра контейнеров. Имя реестра должно быть уникальным в пределах Azure и состоять только из строчных букв и содержать от 5 до 50 буквенно-цифровых знаков. Другие ресурсы, создаваемые в руководстве, основаны на этом имени, поэтому вам требуется изменить только первую переменную.
ACR_NAME=<registry-name>
Теперь, когда переменная среды реестра контейнеров заполнена, можно копировать оставшиеся команды и вставлять их в руководство без изменения каких-либо значений. Для создания группы ресурсов и реестра контейнеров выполните приведенные ниже команды.
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" для создания образа контейнера из примера кода. Выполните команду az acr build, чтобы запустить быструю задачу.
Примечание.
Файл Dockerfile, используемый в следующем примере, зависит от общедоступного базового образа контейнера из Docker Hub. Чтобы повысить надежность при использовании общедоступного содержимого, импортируйте образ и управляйте им в частном реестре контейнеров Azure, а также обновите Dockerfile для использования базового образа, управляемого в частном режиме. Узнайте больше о работе с общедоступными образами.
az acr build --registry $ACR_NAME --image helloacrtasks:v1 --file /path/to/Dockerfile /path/to/build/context.
Результат выполнения команды az acr build будет аналогичен следующему примеру. Вы можете просмотреть сведения об отправке исходного кода ("контекста") в Azure и дополнительные сведения об операции docker build
, которую решение "Задача ACR" выполняет в облаке. Так как решение "Задачи ACR" использует docker build
для создания образов, чтобы начать немедленно использовать это решение, изменения в файлах Dockerfiles не требуются.
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...
2020/11/18 18:31:42 Using acb_vol_01185991-be5f-42f0-9403-a36bb997ff35 as the home volume
2020/11/18 18:31:42 Setting up Docker configuration...
2020/11/18 18:31:43 Successfully set up Docker configuration
2020/11/18 18:31:43 Logging in to registry: myregistry.azurecr.io
2020/11/18 18:31:55 Successfully logged in
Sending build context to Docker daemon 21.5kB
Step 1/5 : FROM node:15-alpine
15-alpine: Pulling from library/node
Digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
Status: Image is up to date for node:15-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
2020/11/18 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
2020/11/18 18:32:43 Successfully pushed image: myregistry.azurecr.io/helloacrtasks:v1
2020/11/18 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: 15-alpine
digest: sha256:8dafc0968fb4d62834d9b826d85a8feecc69bd72cd51723c62c7db67c6dec6fa
git: {}
Run ID: da1 was successful after 1m9.970148252s
В конце выходных данных решения "Задачи ACR" отображаются зависимости, обнаруженные для образа. Таким образом решение может автоматизировать создание образов при обновлении базовых образов, например, когда базовый образ обновляется в связи с установкой исправлений ОС или платформы. Вы узнаете о том, как решение "Задачи ACR" поддерживает обновления базовых образов, позже в этом цикле руководств.
Развертывание в Экземплярах контейнеров Azure
Решение "Задачи ACR" по умолчанию автоматически отправляет успешно созданные образы в реестр, позволяя сразу развертывать их из реестра.
В этом разделе создается Azure Key Vault и субъект-служба, после чего в службу "Экземпляры контейнеров Azure" развертывается контейнер с использованием учетных данных субъекта-службы.
Настройка проверки подлинности в реестре
Все производственные сценарии должны использовать субъекты-службы для получения доступа к реестру контейнеров Azure. Субъекты-службы позволяют вам предоставлять контроль доступа на основе ролей к образам вашего контейнера. Например, вы можете настроить субъект-службу с доступом только на извлечение к реестру.
Создание хранилища ключей
Если у вас еще нет хранилища в Azure Key Vault, создайте его с помощью Azure CLI, используя следующие команды.
AKV_NAME=$ACR_NAME-vault
az keyvault create --resource-group $RES_GROUP --name $AKV_NAME
Создание учетной записи субъекта-службы и сохранение учетных данных
Теперь вам нужно создать субъект-службу и сохранить его учетные данные в хранилище ключей.
Используйте команду az ad sp create-for-rbac для создания субъекта-службы и az keyvault secret set для сохранения пароля субъекта-службы в хранилище. Используйте Azure CLI версии 2.25.0 или более поздней для следующих команд:
# 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, которая предоставляет доступ только для извлечения к реестру. Чтобы предоставить доступ для отправки и извлечения данных, измените аргумент --role
на acrpush.
Затем сохраните в хранилище appId субъекта-службы, который является именем пользователя, переданным в реестр контейнеров Azure для проверки подлинности:
# 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 list --display-name $ACR_NAME-pull --query [].appId --output tsv)
Вы создали хранилище ключей Azure и сохранили в нем два секрета:
$ACR_NAME-pull-usr
: идентификатор субъекта-службы для использования в качестве имени пользователя реестра контейнеров.$ACR_NAME-pull-pwd
: пароль субъекта-службы для использования в качестве пароля реестра контейнеров.
Теперь вы можете ссылаться на эти секреты по имени, когда вы или ваши приложения и службы извлекаете образы из реестра.
Развертывание контейнера с помощью Azure CLI
Теперь, когда учетные данные субъекта-службы хранятся в секретах Аzure Key Vault, ваши приложения и службы могут использовать их для доступа к вашему частному реестру.
Выполните следующую команду az container create, чтобы развернуть экземпляр контейнера. Команда использует учетные данные субъекта-службы, хранящиеся в Azure Key Vault, для проверки подлинности в вашем реестре контейнеров.
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-имени контейнера. В выходных данных команды содержится полное доменное имя (FQDN) контейнера, например:
FQDN
----------------------------------------------
acr-tasks-myregistry.eastus.azurecontainer.io
Запишите имя FQDN контейнера. Оно будет использоваться в следующем разделе.
Проверка развертывания
Для контроля процесса запуска контейнера используйте команду az container attach:
az container attach --resource-group $RES_GROUP --name acr-tasks
Выходные данные az container attach
сначала отображают состояние контейнера, когда он извлекает образ и запускается, а затем связывает STDOUT и STDERR вашей локальной консоли с аналогичным содержимым контейнера.
Container 'acr-tasks' is in state 'Running'...
(count: 1) (last timestamp: 2020-11-18 18:39:10+00:00) pulling image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2020-11-18 18:39:15+00:00) Successfully pulled image "myregistry.azurecr.io/helloacrtasks:v1"
(count: 1) (last timestamp: 2020-11-18 18:39:17+00:00) Created container
(count: 1) (last timestamp: 2020-11-18 18:39:17+00:00) Started container
Start streaming logs:
Server running at http://localhost:80
После появления Server running at http://localhost:80
перейдите к FQDN контейнера в браузере, чтобы просмотреть работающее приложение. Полное доменное имя должно появиться в выходных данных команды az container create
, которую вы выполнили в предыдущем разделе.
Чтобы окончательно отсоединить консоль от контейнера, нажмите клавиши Control+C
.
Очистка ресурсов
Остановите экземпляр контейнера с помощью команды az container delete:
az container delete --resource-group $RES_GROUP --name acr-tasks
Чтобы удалить все ресурсы, созданные в этом руководстве, включая реестр контейнеров, хранилище ключей и субъект-службу, выполните следующие команды. Однако эти ресурсы используются в следующем руководстве цикла, поэтому их можно оставить, если вы хотите перейти напрямую к следующему руководству.
az group delete --resource-group $RES_GROUP
az ad sp delete --id http://$ACR_NAME-pull
Следующие шаги
Теперь, когда вы протестировали внутренний цикл с быстрой задачей, настройте задачу сборки для активации сборок образов контейнера при фиксации исходного кода в репозитории Git: