你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 容器注册表 (ACR) 是基于 Azure 的托管容器注册表服务,用于存储专用的 Docker 容器映像。 本文介绍在使用 Azure 容器实例部署到容器组时,如何拉取存储在 Azure 容器注册表中的容器映像。 配置注册表访问权限的一种方法是创建 Microsoft Entra 托管标识。
当使用专用终结点限制对 Azure 容器注册表 (ACR) 的访问时,使用托管标识允许部署到虚拟网络的 Azure 容器实例通过专用终结点访问容器注册表。
先决条件
Azure 容器注册表:需要具有至少一个映像的高级 SKU Azure 容器注册表。 如果需要创建注册表,请参阅使用 Azure CLI 创建容器注册表。 请务必记下注册表的 id
和 loginServer
Azure CLI:本文中的命令行示例使用 Azure CLI,并采用适用于 Bash shell 的格式。 可在本地安装 Azure CLI,或使用 Azure Cloud Shell。
限制
- Windows 容器不支持使用 ACR 拉取的系统分配托管标识身份验证映像,仅支持用户分配的映像。
配置注册表身份验证
容器注册表必须已启用“受信任服务”。 若要查找有关如何启用受信任服务的说明,请参阅允许受信任服务安全地访问受网络限制的容器注册表。
创建标识
使用 az identity create 命令在订阅中创建标识。 可以使用之前用于创建容器注册表的同一资源组,也可以使用其他资源组。
az identity create --resource-group myResourceGroup --name myACRId
若要在以下步骤中配置标识,请使用 az identity show 命令将标识的资源 ID 和服务主体 ID 存储在变量中。
为了在以后的步骤中正确配置标识,请使用 az identity show 获取标识的资源 ID 和服务主体 ID 并将其存储在变量中。
# Get resource ID of the user-assigned identity
USERID=$(az identity show --resource-group myResourceGroup --name myACRId --query id --output tsv)
# Get service principal ID of the user-assigned identity
SPID=$(az identity show --resource-group myResourceGroup --name myACRId --query principalId --output tsv)
需要标识的资源 ID 以从虚拟机登录到 CLI。 若要显示值,请执行以下操作:
echo $USERID
资源 ID 的格式为:
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId
还需要服务主体 ID 来授予托管标识对容器注册表的访问权限。 若要显示值,请执行以下操作:
echo $SPID
服务主体 ID 的格式为:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx
向标识授予角色分配
为了使标识能够访问容器注册表,必须授予其角色分配。 使用以下命令将 acrpull
角色授予已创建的标识,确保提供之前获得的注册表 ID 和服务主体:
az role assignment create --assignee $SPID --scope <registry-id> --role acrpull
使用 Azure 资源管理器 (ARM) 模板进行部署
首先将以下 JSON 复制到名为 azuredeploy.json
的新文件。 在 Azure Cloud Shell 中,可以使用 Visual Studio Code 在工作目录中创建文件:
code azuredeploy.json
通过在容器组定义中包含 imageRegistryCredentials
属性,可以在 ARM 模板中指定 Azure 容器注册表的属性。 例如,可以直接指定注册表凭据:
注意
这不是一个全面的 ARM 模板,而是一个完整模板的 resources
节的示例。
{
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2021-09-01",
"name": "myContainerGroup",
"___location": "norwayeast",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId": {}
}
},
"properties": {
"containers": [
{
"name": "mycontainer",
"properties": {
"image": "myacr.azurecr.io/hello-world:latest",
"ports": [
{
"port": 80,
"protocol": "TCP"
}
],
"resources": {
"requests": {
"cpu": 1,
"memoryInGB": 1
}
}
}
}
],
"imageRegistryCredentials": [
{
"server":"myacr.azurecr.io",
"identity":"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId"
}
],
"ipAddress": {
"ports": [
{
"port": 80,
"protocol": "TCP"
}
],
"type": "public"
},
"osType": "Linux"
}
}
部署模板
使用以下命令部署资源管理器模板:
az deployment group create --resource-group myResourceGroup --template-file azuredeploy.json
使用 Azure CLI 进行部署
若要使用托管标识部署容器组以通过 Azure CLI 对映像拉取进行身份验证,请使用以下命令并确保 <dns-label>
全局唯一:
az container create --name my-containergroup --resource-group myResourceGroup --image <loginServer>/hello-world:v1 --acr-identity $USERID --assign-identity $USERID --ports 80 --dns-name-label <dns-label>
使用 Azure CLI 在虚拟网络中部署
若要使用托管标识将容器组部署到虚拟网络,以通过 Azure CLI 对来自在专用终结点后面运行的 ACR 的映像拉取进行身份验证,请使用以下命令:
az container create --name my-containergroup --resource-group myResourceGroup --image <loginServer>/hello-world:v1 --acr-identity $USERID --assign-identity $USERID --vnet "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/ --subnet mySubnetName
有关如何部署到虚拟网络的详细信息,请参阅将容器实例部署到 Azure 虚拟网络。
使用 YAML 和 Azure CLI 在虚拟网络中部署多容器组
若要使用托管标识将多容器组部署到虚拟网络,以通过 Azure CLI 对来自在专用终结点后面运行的 ACR 的映像拉取进行身份验证,可以在 YAML 文件中指定容器组配置。 然后将该 YAML 文件作为参数传递给命令。
apiVersion: '2021-10-01'
___location: eastus
type: Microsoft.ContainerInstance/containerGroups
identity:
type: UserAssigned
userAssignedIdentities: {
'/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId': {}
}
properties:
osType: Linux
imageRegistryCredentials:
- server: myacr.azurecr.io
identity: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId'
subnetIds:
- id: '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourceGroups/myVNetResourceGroup/providers/Microsoft.Network/virtualNetworks/myVNetName/subnets/mySubnetName'
name: mySubnetName
containers:
- name: myContainer-1
properties:
resources:
requests:
cpu: '.4'
memoryInGb: '1'
environmentVariables:
- name: CONTAINER
value: 1
image: 'myacr.azurecr.io/myimage:latest'
- name: myContainer-2
properties:
resources:
requests:
cpu: '.4'
memoryInGb: '1'
environmentVariables:
- name: CONTAINER
value: 2
image: 'myacr.azurecr.io/myimage:latest'
az container create --name my-containergroup --resource-group myResourceGroup --file my-YAML-file.yaml
有关如何部署到多容器组的详细信息,请参阅部署多容器组。
清理资源
若要从 Azure 订阅中删除所有资源,请删除资源组:
az group delete --name myResourceGroup