Краткое руководство: создание частного реестра контейнеров с помощью Azure CLI

Реестр контейнеров Azure — это служба частного реестра для создания, хранения и обслуживания образов контейнеров и связанных с ними артефактов. В этом кратком руководстве показано, как создать экземпляр реестра контейнеров Azure с помощью Azure CLI. Затем используйте команды Docker, чтобы отправить образ контейнера в реестр, после чего извлеките образ из контейнера и запустите его.

Для этого быстрого начала работы требуется использование Azure CLI (рекомендуется версия 2.0.55 или более поздняя). Чтобы узнать версию, выполните команду az --version. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.

Также необходим локально установленный модуль Docker. Docker предоставляет пакеты, которые позволяют быстро настроить Docker в системе под управлением macOS, Windows или Linux.

Так как в службе Azure Cloud Shell нет всех необходимых компонентов Docker (демон dockerd), ее нельзя использовать в этом быстром начале.

Создать группу ресурсов

Создайте группу ресурсов с помощью команды az group create. Группа ресурсов Azure является логическим контейнером, в котором происходит развертывание ресурсов Azure и управление ими.

В следующем примере создается группа ресурсов с именем myResourceGroup в расположении eastus.

az group create --name myResourceGroup --location eastus

Настройка параметров для реестра контейнеров

В этом кратком руководстве вы создадите реестр Стандартный, что достаточно для большинства рабочих процессов реестра контейнеров Azure. Дополнительные сведения об уровнях служб см. в статье Уровни служб реестра контейнеров.

Создайте экземпляр ACR с помощью команды az acr create. Имя реестра должно быть уникальным в Azure и содержать 5–50 строчных буквенно-цифровых символов. В следующем примере используется mycontainerregistry . Обновите это до уникального значения.

Настроить параметр "Метка доменного имени" (DNL)

Функция метки доменных имен (DNL) повышает безопасность, предотвращая атаки на захват поддомена DNS-имен реестра. Эти атаки возникают при удалении реестра, когда другая сущность повторно использует такое же имя, что может привести к тому, что последующие ссылки обращаются к реестру, созданному новой сущностью.

DNL решает эту проблему путем добавления уникального хэша к DNS-имени реестра. Это гарантирует, что даже если одно и то же имя реестра повторно используется другой сущностью, DNS-имена будут отличаться из-за уникального хэша. Это защищает низкоуровневые ссылки от непреднамеренного указания на реестр, повторно созданный другой сущностью.

При создании реестра из команды az acr create можно указать необязательный флаг --dnl-scope и выбрать из доступных параметров:

  • Unsecure: создает DNS-имя as-isна основе имени реестра (например, contosoacrregistry.azurecr.io). Этот параметр не включает защиту DNL.
  • TenantReuse: добавляет уникальный хэш на основе имени клиента и реестра, гарантируя, что DNS-имя уникально в клиенте.
  • SubscriptionReuse: добавляет уникальный хэш на основе подписки, клиента и имени реестра, обеспечивая уникальность DNS-имени в подписке.
  • ResourceGroupReuse: добавляет уникальный хэш на основе группы ресурсов, подписки, клиента и имени реестра, обеспечивая уникальность DNS-имени в группе ресурсов.
  • NoReuse: создает уникальное DNS-имя с уникальным хэшом каждый раз при создании реестра независимо от других факторов, гарантируя, что DNS-имя всегда уникально.

Замечание

Неизменяемая конфигурация: область DNL, выбранная во время создания реестра, является постоянной и не может быть изменена позже. Это гарантирует согласованное поведение DNS и предотвращает нарушения подчиненных ссылок.

Влияние параметров DNL на DNS-имя

Формат DNS-имени: для всех параметров с поддержкой DNL, кроме Unsecure, DNS-имя следует формату registryname-hash.azurecr.io, где дефис (-) служит хэш-делимитатором. Чтобы избежать конфликтов, дефис (-) не допускается в имени реестра. Например, реестр с именем contosoacrregistry области TenantReuse DNL будет иметь DNS-имя, например contosoacrregistry-e7ggejfuhzhgedc8.azurecr.io.

Подчиненные ссылки: DNS-имя может отличаться от имени реестра, требуя обновлений в подчиненных файлах, таких как Dockerfiles, Kubernetes YAML и диаграммы Helm, чтобы отразить полное DNS-имя с хэшом DNL. Например, если вы хотите, чтобы ваш дочерний Dockerfile ссылался на реестр под именем contosoacrregistry с областью TenantReuse DNL, вам нужно обновить ссылку на contosoacrregistry-e7ggejfuhzhgedc8.azurecr.io в вашем дочернем Dockerfile.

Настройка режима разрешений назначения ролей

При необходимости можно использовать --role-assignment-mode параметр, чтобы указать режим назначения ролей реестра. Этот параметр определяет, как управление доступом на основе ролей Microsoft Entra (RBAC) и назначения ролей управляются для реестра, включая использование управления доступом на основе атрибутов Microsoft Entra (ABAC) для разрешений репозитория Microsoft Entra.

Укажите rbac-abac для этого параметра, чтобы сохранить стандартные назначения ролей Microsoft Entra RBAC, при этом по необходимости применяя условия Microsoft Entra ABAC для точного управления доступом на уровне хранилища.

Дополнительные сведения об этом параметре см. в разделе "Управление доступом на основе атрибутов Microsoft Entra" (ABAC) для разрешений репозитория.

Создание реестра контейнеров

az acr create --resource-group myResourceGroup \
  --name mycontainerregistry --sku Standard \
  --role-assignment-mode 'rbac-abac' \
  --dnl-scope TenantReuse

При создании реестра выходные данные выглядят так:

{
  "adminUserEnabled": false,
  "creationDate": "2023-01-08T22:32:13.175925+00:00",
  "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.ContainerRegistry/registries/mycontainerregistry",
  "location": "eastus",
  "loginServer": "mycontainerregistry-e7ggejfuhzhgedc8.azurecr.io",
  "name": "mycontainerregistry",
  "provisioningState": "Succeeded",
  "resourceGroup": "myResourceGroup",
  "sku": {
    "name": "Standard",
    "tier": "Standard"
  },
  "status": null,
  "storageAccount": null,
  "tags": {},
  "type": "Microsoft.ContainerRegistry/registries",
  "roleAssignmentMode": "AbacRepositoryPermissions",
  "autoGeneratedDomainNameLabelScope": "TenantReuse"
}

Обратите внимание на loginServer в выходных данных; это полное квалифицированное имя реестра (все в нижнем регистре). В дальнейшем в этом кратком руководстве будет использоваться <registry-name> как заполнитель имени реестра контейнеров, а <login-server> — как заполнитель имени сервера для входа в реестр.

Совет

В этом кратком руководстве описано, как создать реестр уровня "Стандартный" , который достаточно для большинства рабочих процессов реестра контейнеров Azure. Для повышения пропускной способности хранилища и образа, а также таких возможностей, как подключение с помощью частной конечной точки, доступен вариант ценовой категории "Премиум " (SKU). Дополнительные сведения о уровнях служб (SKU) см. в статье о функциях и ограничениях SKU реестра контейнеров Azure.

Вход в раздел реестра

Перед отправкой и загрузкой образов контейнеров необходимо войти в регистратуру. Чтобы сделать это, используйте команду az acr login. При выполнении входа с помощью Azure CLI укажите только имя ресурса реестра. Не используйте при этом полное имя сервера для входа.

az acr login --name <registry-name>

Пример:

az acr login --name mycontainerregistry

По завершении команда возвращает сообщение Login Succeeded.

Отправка образа в реестр

Чтобы отправить образ в реестр контейнеров Azure, сначала нужно получить этот образ. Если у вас еще нет образов локального контейнера, используйте следующую команду docker pull, чтобы извлечь существующий общедоступный образ. Для этого примера извлеките образ hello-world из Реестра контейнеров Майкрософт.

docker pull mcr.microsoft.com/hello-world

Прежде чем отправить образ в реестр, необходимо пометить его с помощью тега Docker с полным именем сервера входа в реестр.

Например, если создать реестр с Tenant Reuse областью DNL, сервер входа может выглядеть как mycontainerregistry-abc123.azurecr.io с хэшем в имени DNS. Если вы создаете реестр с параметром Unsecure DNL, сервер входа выглядит mycontainerregistry.azurecr.io без хэша.

Пометьте изображение с помощью команды docker tag с сервером логина вашего реестра. В этом кратком руководстве пометьте изображение тегом hello-world.

Пример команды для тега образа для защищенного реестра DNL:

docker tag mcr.microsoft.com/hello-world mycontainerregistry-abc123.azurecr.io/hello-world:v1

Пример команды для тега изображения для реестра, отличного от DNL:

docker tag mcr.microsoft.com/hello-world mycontainerregistry.azurecr.io/hello-world:v1

Наконец, воспользуйтесь командой docker push для загрузки образа в реестр. Замените <login-server> на имя сервера входа для вашего экземпляра реестра. В этом примере создается репозиторий hello-world с образом hello-world:v1.

docker push <login-server>/hello-world:v1

После отправки образа в реестр контейнеров удалите hello-world:v1 образ из локальной среды Docker с помощью команды docker rmi . Эта команда не удаляет образ из репозитория hello-world в реестре контейнеров Azure.

docker rmi <login-server>/hello-world:v1

Список образов контейнеров

В следующем примере перечисляются репозитории в реестре.

az acr repository list --name <registry-name> --output table

Выходные данные:

Result
----------------
hello-world

В следующем примере перечисляются теги в репозитории hello-world.

az acr repository show-tags --name <registry-name> --repository hello-world --output table

Выходные данные:

Result
--------
v1

Запуск образа из реестра

Теперь вы можете извлекать и запускать образ контейнера hello-world:v1 из реестра контейнеров с помощью команды docker run:

docker run <login-server>/hello-world:v1  

Пример результата:

Unable to find image 'mycontainerregistry.azurecr.io/hello-world:v1' locally
v1: Pulling from hello-world
Digest: sha256:662dd8e65ef7ccf13f417962c2f77567d3b132f12c95909de6c85ac3c326a345
Status: Downloaded newer image for mycontainerregistry.azurecr.io/hello-world:v1

Hello from Docker!
This message shows that your installation appears to be working correctly.

[...]

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

Когда они больше не нужны, вы можете использовать команду az group delete, чтобы удалить группу ресурсов, реестр контейнеров и образы контейнеров, хранящиеся там.

az group delete --name myResourceGroup

Следующие шаги