次の方法で共有


クイック スタート:Azure CLI を使用したプライベート コンテナー レジストリの作成

Azure Container Registry は、コンテナー イメージおよび関連アーティクルのビルド、保管、管理をするための、プライベート レジストリ サービスです。 このクイックスタートでは、Azure CLI を使用して Azure コンテナー レジストリ インスタンスを作成します。 次に、Docker コマンドを使用してコンテナー イメージをレジストリにプッシュし、最後にレジストリからイメージをプルして実行します。

このクイック スタートでは、Azure CLI を実行している必要があります (バージョン 2.0.55 以降を推奨)。 バージョンを確認するには、az --version を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。

Docker もローカルにインストールする必要があります。 Docker では、macOSWindows、または Linux システムで Docker を簡単に構成できるパッケージが提供されています。

Azure Cloud Shell には、必要な Docker コンポーネント (dockerd デーモン) すべてが含まれていないため、このクイックスタートで Cloud Shell を使用することはできません。

リソース グループを作成する

az group create コマンドを使用して、リソース グループを作成します。 Azure リソース グループとは、Azure リソースのデプロイと管理に使用する論理コンテナーです。

次の例では、myResourceGroup という名前のリソース グループを eastus に作成します。

az group create --name myResourceGroup --___location eastus

コンテナー レジストリのパラメーターを構成する

このクイック スタートでは、ほとんどの Azure Container Registry ワークフローに十分な Standard レジストリを作成します。 利用可能なサービス レベルの詳細については、コンテナー レジストリのサービス レベルに関するページを参照してください。

az acr create コマンドを使用して ACR インスタンスを作成します。 レジストリ名は Azure 内で一意であり、5 から 50 文字の小文字の英数字を含める必要があります。 次の例では、mycontainerregistry を使用します。 これを一意の値に更新します。

ドメイン名ラベル (DNL) オプションの構成

ドメイン名ラベル (DNL) 機能は、レジストリ DNS 名のサブドメインの引き継ぎ攻撃を防ぐことでセキュリティを強化します。 これらの攻撃は、レジストリが削除され、別のエンティティが同じレジストリ名を再利用すると発生し、ダウンストリーム参照が他のエンティティによって再作成されたレジストリからプルされる可能性があります。

DNL は、レジストリの DNS 名に一意のハッシュを追加することで、これに対処します。 これにより、同じレジストリ名が別のエンティティによって再利用された場合でも、一意のハッシュによって DNS 名が異なることがあります。 これにより、ダウンストリーム参照が誤って他のエンティティによって再作成されたレジストリを指すのを防ぐことができます。

az acr create コマンドからレジストリを作成する場合は、オプションのフラグ --dnl-scopeを指定し、使用可能なオプションから選択できます。

  • Unsecure: レジストリ名 ( contosoacrregistry.azurecr.io など) に基づいて、DNS 名 as-isを作成します。 このオプションには DNL 保護は含まれません。
  • TenantReuse: テナントとレジストリ名に基づいて一意のハッシュを追加し、DNS 名がテナント内で一意であることを確認します。
  • SubscriptionReuse: サブスクリプション、テナント、レジストリ名に基づいて一意のハッシュを追加し、DNS 名がサブスクリプション内で一意であることを確認します。
  • ResourceGroupReuse: リソース グループ、サブスクリプション、テナント、およびレジストリ名に基づいて一意のハッシュを追加し、リソース グループ内で DNS 名が一意であることを確認します。
  • NoReuse: 他の要因に関係なく、レジストリが作成されるたびに一意のハッシュを持つ一意の DNS 名を生成し、DNS 名が常に一意であることを確認します。

不変構成: レジストリの作成時に選択された DNL スコープは永続的であり、後で変更することはできません。 これにより、一貫した DNS 動作が保証され、ダウンストリーム参照の中断が防止されます。

DNL オプションの DNS 名への影響

DNS 名の形式: Unsecureを除くすべての DNL 対応オプションでは、DNS 名は registryname-hash.azurecr.io形式に従います。ここで、ダッシュ (-) はハッシュ区切り記号として機能します。 競合を回避するために、レジストリ名にダッシュ (-) は使用できません。 たとえば、contosoacrregistry DNL スコープを持つ TenantReuse という名前のレジストリには、contosoacrregistry-e7ggejfuhzhgedc8.azurecr.ioのような DNS 名が付けられます。

ダウンストリームリファレンス: DNS 名はレジストリ名と異なる場合があり、DOCKERfiles、Kubernetes YAML、Helm チャートなどのダウンストリーム ファイルの更新が必要になり、DNL ハッシュを持つ完全な DNS 名が反映されます。 たとえば、ダウンストリーム Dockerfile で、contosoacrregistry DNL スコープを持つ TenantReuse という名前のレジストリを参照する場合は、ダウンストリーム Dockerfile 内のcontosoacrregistry-e7ggejfuhzhgedc8.azurecr.ioへの参照を更新する必要があります。

ロール割り当て権限モードを設定する

必要に応じて、 --role-assignment-mode パラメーターを使用して、レジストリのロール割り当てモードを指定できます。 このオプションは、Microsoft Entra のロールベースのアクセス制御 (RBAC) とロールの割り当てをレジストリに対して管理する方法を決定します。これには、Microsoft Entra リポジトリのアクセス許可に対する Microsoft Entra 属性ベースのアクセス制御 (ABAC) の使用が含まれます。

このパラメーターの 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": "2019-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 Container Registry ワークフローで十分な Standard レジストリを作成します。 ストレージとイメージのスループットを向上させる他のレベルと、プライベート エンドポイント を使用した接続などの機能を選択します。 利用可能なサービス レベル (SKU) の詳細については、コンテナー レジストリのサービス レベルに関するページを参照してください。

レジストリへのログイン

コンテナー イメージをプッシュしたりプルしたりするには、あらかじめレジストリにログインしておく必要があります。 そのためには、az acr login コマンドを使用します。 Azure CLI でログインする際は、レジストリ リソース名のみを指定します。 完全修飾ログイン サーバー名は使用しません。

az acr login --name <registry-name>

例:

az acr login --name mycontainerregistry

このコマンドが完了すると、Login Succeeded というメッセージが返されます。

レジストリにイメージをプッシュする

Azure Container Registry にイメージをプッシュするには、まずイメージを用意する必要があります。 ローカル コンテナー イメージがまだない場合は、次の docker pull コマンドを実行して、既存のパブリック イメージをプルします。 この例では、Microsoft Container Registry から hello-world イメージをプルします。

docker pull mcr.microsoft.com/hello-world

レジストリにイメージをプッシュする前に、レジストリ ログイン サーバーの完全修飾名で docker タグ を使用してイメージにタグを付ける必要があります。

  • 一意の DNS 名ハッシュが含まれるドメイン 名ラベル (DNL) で保護されたレジストリのログイン サーバー名形式は mycontainerregistry-abc123.azurecr.io
  • Unsecure DNL オプションを使用して作成されたレジストリのログイン サーバー名の形式はmycontainerregistry.azurecr.io

たとえば、 Tenant Reuse DNL スコープを使用してレジストリが作成された場合、ログイン サーバーは DNS 名にハッシュを含む mycontainerregistry-abc123.azurecr.io のようになります。 Unsecure DNL オプションを使用してレジストリが作成された場合、ログイン サーバーはハッシュなしでmycontainerregistry.azurecr.ioのようになります。

レジストリの作成中の DNL オプションと DNS 名への影響の詳細については、「 クイック スタート - ポータルでのレジストリの作成」を参照してください。

例: プッシュ前に画像にタグを付ける

レジストリのログイン サーバーを使用して docker tag コマンドを使用してイメージにタグを付けます。

DNL 以外のレジストリのイメージのタグ付け:

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

DNL 対応レジストリのタグ付けイメージ:

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

最後に、docker push を使用して、レジストリ インスタンスにイメージをプッシュします。 <login-server> をレジストリ インスタンスのログイン サーバー名で置き換えます。 この例では、hello-world レポジトリを作成します。これには、hello-world:v1 イメージが含まれています。

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

コンテナー レジストリにイメージをプッシュした後は、ローカルの Docker 環境から hello-world:v1 イメージを削除します (この docker rmi コマンドでは、Azure コンテナー レジストリ内の hello-world リポジトリからイメージが削除されない点に注意してください)。

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

次のステップ

このクイック スタートでは、Azure CLI を使って Azure Container Registry を作成し、レジストリにコンテナー イメージをプッシュしてから、レジストリからイメージをプルして実行しました。 Azure Container Registry のチュートリアルに進んで、ACR についての理解を深めましょう。