使用Az CLI创建Azure容器实例时无法拉取私有ACR镜像
解决方案:私有子网中ACI无法访问私有ACR的问题
你遇到的核心问题其实是部署在私有子网的容器实例(ACI)默认没有出站互联网访问能力——虽然你的服务主体权限完全正常,公共镜像能部署也说明子网的基础网络配置没问题,但私有ACR需要网络连通才能拉取镜像,而默认状态下私有子网里的ACI没法访问公网(你的ACR如果没配置私有端点的话,是需要公网访问的),所以才会出现镜像不可访问的错误。
下面给你两种针对性的解决方案,你可以根据自身场景选择:
方案一:给子网配置NAT网关,提供出站公网访问
如果你的场景允许ACI访问公网,这种方式最简单直接,通过NAT网关让子网内的ACI获得出站公网能力,从而能正常拉取ACR镜像:
- 先创建NAT网关(如果还没有的话):
az network nat gateway create \ --name myNATGateway \ --resource-group myResourceGroup \ --public-ip-addresses myPublicIP \ --location someLocation
- 将你的私有子网关联到这个NAT网关:
az network vnet subnet update \ --name someSubnet \ --resource-group myResourceGroup \ --vnet-name someVNET \ --nat-gateway myNATGateway
- 重新运行你之前的容器部署命令,此时ACI就能通过NAT网关出站访问ACR拉取镜像了。
方案二:给ACR配置私有端点,实现VNet内部访问
如果你的场景不允许ACI访问公网,推荐用这种方式,把ACR直接接入到你的VNet中,让子网内的ACI通过私有IP访问ACR:
- 为ACR创建私有端点:
az network private-endpoint create \ --name myACRPrivateEndpoint \ --resource-group myResourceGroup \ --vnet-name someVNET \ --subnet someSubnet \ --private-connection-resource-id $(az acr show --name someRegistry --query id --output tsv) \ --group-id registry \ --connection-name myACRConnection
- 创建对应ACR的私有DNS区域(用于解析ACR的私有IP):
az network private-dns zone create \ --name "privatelink.azurecr.io" \ --resource-group myResourceGroup
- 将私有DNS区域关联到你的VNet:
az network private-dns link vnet create \ --name myDNSLink \ --resource-group myResourceGroup \ --zone-name "privatelink.azurecr.io" \ --virtual-network someVNET \ --registration-enabled false
- 为ACR私有端点添加DNS记录:
az network private-endpoint dns-zone-group create \ --name myDNSZoneGroup \ --resource-group myResourceGroup \ --endpoint-name myACRPrivateEndpoint \ --private-dns-zone "privatelink.azurecr.io" \ --zone-name registry
- 再次运行容器部署命令,此时ACI会通过VNet内部的私有IP访问ACR,完全不需要出站公网。
验证操作
不管用哪种方案,部署完成后你可以用下面的命令检查容器实例状态,确认镜像拉取是否成功:
az container show --name myContainerGroup --resource-group myResourceGroup --query instanceView.state
如果返回Running,就说明问题解决了。
内容的提问来源于stack exchange,提问作者theknees
相关产品推荐
相关产品推荐

