Azure Virtual Network では、Azure リソースやオンプレミス リソースのセキュアなプライベート ネットワーキングが提供されます。 サービス エンドポイントを使用すると、コンテナー レジストリのパブリック IP アドレスを仮想ネットワークのみにセキュリティで保護できます。 このエンドポイントでは、Azure バックボーン ネットワーク上のリソースへの最適なルートがトラフィックに提供されます。 仮想ネットワークとサブネットの ID も、各要求と一緒に転送されます。
この記事では、仮想ネットワークでコンテナー レジストリのサービス エンドポイント (プレビュー) を構成する方法について説明します。
重要
Azure Container Registry で Azure Private Link がサポートされ、仮想ネットワークからプライベート エンドポイントをレジストリにデプロイできるようになりました。 ほとんどのネットワーク シナリオでは、サービス エンドポイントの代わりにプライベート エンドポイントを使用することをお勧めします。 プライベート エンドポイントには、プライベート IP アドレスを使用して仮想ネットワーク内からアクセスできます。 コンテナー レジストリでは、仮想ネットワークから構成されたプライベート リンク機能とサービス エンドポイント機能の両方を有効にすることはできません。 一覧を実行し、必要に応じて ネットワーク ルール を削除します。
レジストリ サービス エンドポイントの構成は、Premium コンテナー レジストリ サービス レベルで利用できます。 レジストリ サービス レベルと制限については、 Azure Container SKU の機能と制限に関するページを参照してください。 各 Premium レジストリでは、最大 100 個の仮想ネットワーク 規則がサポートされています。
プレビューの制限事項
サービス エンドポイントを使用してコンテナー レジストリへのアクセスを制限する場合は、次の現在の制限事項に注意してください。
- Azure portal を使用してレジストリにサービス エンドポイントを構成することはできません。
- サービス エンドポイントを使用してコンテナー レジストリにアクセスするためのホストとして使用できるのは、 Azure Kubernetes Service クラスターまたは Azure 仮想マシン だけです。 Azure Container Instances を含む他の Azure サービスはサポートされていません。
- Azure Container Registry のサービス エンドポイントは、Azure US Government クラウドまたは 21Vianet によって運営される Microsoft Azure クラウドではサポートされていません。
重要
コンテナー レジストリがプライベート エンドポイント、選択したサブネット、または IP アドレスへのアクセスを制限している場合、一部の機能が使用できないか、より多くの構成が必要になる可能性があります。
- レジストリへのパブリック ネットワーク アクセスを無効にすると、Microsoft Defender for Cloud を含む特定の 信頼されたサービスは、ネットワーク設定でネットワーク規則をバイパスできる場合にのみレジストリにアクセスできます。
- パブリック ネットワーク アクセスを無効にすると、Azure DevOps Services を含む特定の Azure サービスのインスタンスがコンテナー レジストリにアクセスできなくなります。
- プライベート エンドポイントは、Azure DevOps によって管理されるエージェントでは現在サポートされていません。 プライベート エンドポイントへのネットワークの見通し線を持つセルフホステッド エージェントを使用する必要があります。
- レジストリに承認済みのプライベート エンドポイントがあり、パブリック ネットワーク アクセスを無効にした場合、Azure portal、Azure CLI、またはその他のツールを使用して、仮想ネットワークの外部にあるリポジトリとタグを一覧表示することはできません。
前提条件
この記事の Azure CLI の手順を使用するには、Azure CLI バージョン 2.0.58 以降が必要です。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
コンテナー レジストリがまだない場合は、1 つ作成し (Premium レベルが必要)、Docker Hub から
hello-worldなどのサンプル イメージをプッシュします。 たとえば、Azure portal または Azure CLI を使用してレジストリを作成します。別の Azure サブスクリプションのサービス エンドポイントを使用してレジストリ アクセスを制限するには、そのサブスクリプションに Azure Container Registry のリソース プロバイダーを登録します。 次に例を示します。
az account set --subscription <Name or ID of subscription of virtual network> az provider register --namespace Microsoft.ContainerRegistry
Docker 対応仮想マシンの作成
テスト目的の場合は、Docker 対応の Ubuntu VM を使用して、Azure コンテナー レジストリにアクセスします。 レジストリに Microsoft Entra 認証を使うには、VM に Azure CLI もインストールします。 既に Azure 仮想マシンがある場合は、この作成手順を省略します。
仮想マシンとコンテナー レジストリに同じリソース グループを使用できます。 このセットアップにより、最後のクリーンアップが簡略化されますが、必須ではありません。 仮想マシンと仮想ネットワーク用に別のリソース グループを作成する場合は、 az group create を実行します。 次の例では、リソース グループ名とレジストリの場所に対して環境変数を設定していることを前提としています。
az group create --name $RESOURCE_GROUP --location $REGISTRY_LOCATION
ここで、az vm create を使用して、既定の Ubuntu Azure 仮想マシンをデプロイします。 次の例では、 myDockerVM という名前の VM を作成します。
VM_NAME=myDockerVM
az vm create \
--resource-group $RESOURCE_GROUP \
--name $VM_NAME \
--image Ubuntu2204 \
--admin-username azureuser \
--generate-ssh-keys
VM が作成されるまで、数分間かかります。 コマンドが完了したら、Azure CLI によって表示される publicIpAddress を書き留めます。 このアドレスは、VM への SSH 接続を作成するために使用します。
VM に Docker をインストールする
VM が実行されたら、VM への SSH 接続を作成します。 publicIpAddress を VM のパブリック IP アドレスに置き換えます。
ssh azureuser@publicIpAddress
次のコマンドを実行して、Ubuntu VM に Docker をインストールします。
sudo apt-get update
sudo apt install docker.io -y
インストールの後、次のコマンドを実行して、VM 上で Docker が正しく実行されていることを確認します。
sudo docker run -it hello-world
インストールが正常に動作していることを確認する出力が表示されます。
Azure CLI のインストール
Ubuntu 仮想マシンに Azure CLI をインストールするには、「apt での Azure CLI のインストール」の手順に従います。 次に例を示します。
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
SSH 接続を終了します。
レジストリへのネットワーク アクセスを構成する
Azure CLI を使用して Azure 仮想ネットワーク内のサブネットからのアクセスを許可するようにコンテナー レジストリを構成するには、次の手順に従います。
サブネットにサービス エンドポイントを追加する
VM を作成すると、Azure は既定で同じリソース グループに仮想ネットワークを作成します。 仮想ネットワークの名前は仮想マシンの名前に基づいています。 たとえば、仮想マシンに myDockerVM という名前を付ける場合、既定の仮想ネットワーク名は myDockerVMVNET で、サブネット名は myDockerVMSubnet です。 az network vnet list コマンドを使用して、この構成を確認します。
az network vnet list \
--resource-group myResourceGroup \
--query "[].{Name: name, Subnet: subnets[0].name}"
出力:
[
{
"Name": "myDockerVMVNET",
"Subnet": "myDockerVMSubnet"
}
]
az network vnet subnet update コマンドを使用して、Microsoft.ContainerRegistry サービス エンドポイントをサブネットに追加します。 次のコマンドでは、自分の仮想ネットワークとサブネットの名前に置き換えます。
az network vnet subnet update \
--name myDockerVMSubnet \
--vnet-name myDockerVMVNET \
--resource-group myResourceGroup \
--service-endpoints Microsoft.ContainerRegistry
az network vnet subnet show コマンドを使用して、サブネットのリソース ID を取得します。 ネットワーク アクセス規則を構成するには、この ID が必要です。
az network vnet subnet show \
--name myDockerVMSubnet \
--vnet-name myDockerVMVNET \
--resource-group myResourceGroup \
--query "id"
--output tsv
出力:
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myDockerVMVNET/subnets/myDockerVMSubnet
レジストリへの既定のネットワーク アクセスを変更する
既定では、Azure コンテナー レジストリは、任意のネットワーク上のホストからの接続を許可します。 選択したネットワークへのアクセスを制限するには、既定のアクションを変更してアクセスを拒否します。 次の az acr update コマンドでは、自分のレジストリの名前に置き換えます。
az acr update --name myContainerRegistry --default-action Deny
レジストリにネットワーク規則を追加する
az acr network-rule add コマンドを使用して、VM のサブネットからのアクセスを許可するネットワーク規則をレジストリに追加します。 次のコマンドでは、コンテナー レジストリの名前とサブネットのリソース ID に置き換えます。
az acr network-rule add \
--name mycontainerregistry \
--subnet <subnet-resource-id>
レジストリへのアクセスの検証
構成が更新されるまで数分間待機した後、VM がコンテナー レジストリにアクセスできることを確認します。 VM への SSH 接続を確立し、 az acr login コマンドを実行してレジストリに対して認証します。
az acr login --name mycontainerregistry
docker pull を実行してサンプル イメージをレジストリからプルするなどのレジストリ操作を実行できます。 先頭にレジストリ ログイン サーバー名 (すべて小文字) を付けて、レジストリに適したイメージとタグに置き換えます。
docker pull mycontainerregistry.azurecr.io/hello-world:v1
Docker によってイメージが VM に正常にプルされます。
この例では、ネットワーク アクセス規則を通じてプライベート コンテナー レジストリにアクセスできることを示します。 ただし、ネットワーク アクセス規則が構成されていないログイン ホストからレジストリにアクセスすることはできません。
az acr login コマンドまたは docker login コマンドを使用して別のホストから認証しようとすると、次のような出力が表示されます。
Error response from daemon: login attempt to https://xxxxxxx.azurecr.io/v2/ failed with status: 403 Forbidden
既定のレジストリ アクセスの復元
既定でアクセスを許可するようにレジストリを復元するには、構成したネットワーク規則をすべて削除します。 次に、アクセスを許可する既定のアクションを設定します。
ネットワーク規則を削除する
レジストリに対して構成されているネットワーク規則の一覧を表示するには、次の az acr network-rule list コマンドを実行します。
az acr network-rule list --name mycontainerregistry
構成したルールごとに、 az acr network-rule remove コマンドを実行して削除します。 次に例を示します。
# Remove a rule that allows access for a subnet. Substitute the subnet resource ID.
az acr network-rule remove \
--name mycontainerregistry \
--subnet /subscriptions/ \
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myDockerVMVNET/subnets/myDockerVMSubnet
アクセスを許可
次の az acr update コマンドでレジストリの名前を指定してください。
az acr update --name myContainerRegistry --default-action Allow
リソースをクリーンアップする
同じリソース グループ内のすべての Azure リソースを作成し、不要になった場合は、 az group delete コマンドを使用してリソース グループ全体を削除できます。
az group delete --name myResourceGroup
関連するコンテンツ
- 仮想ネットワーク内のプライベート エンドポイントを使用してレジストリへのアクセスを制限するには、「 Azure Private Link を使用して Azure コンテナー レジストリにプライベートに接続する」を参照してください。
- クライアント ファイアウォールの内側からレジストリ アクセス規則を設定する必要がある場合は、「ファイアウォールの内側から Azure コンテナー レジストリにアクセスする規則を構成する」を参照してください。