使用服務主體從 Azure 容器登錄部署到 Azure 容器執行個體

Azure Container Registry 是 Azure 型的受控容器登錄服務,可用來儲存私人 Docker 容器映像。 本文說明如何在部署至 Azure 容器執行個體時提取儲存於 Azure Container Registry 的容器映像。 設定登錄存取的其中一種方式是建立 Microsoft Entra 服務主體和密碼,然後將登入認證儲存在 Azure 金鑰保存庫中。

必要條件

Azure Container Registry:您需要 Azure Container Registry,且登錄中至少一個容器映像,才能完成本篇文章中的步驟。 如果您需要登錄,請參閱使用 Azure CLI 建立容器登錄

Azure CLI:本文中的命令列範例使用 Azure CLI,並使用 Bash 殼層適用的格式。 您可以在本機安裝 Azure CLI,或使用 Azure Cloud Shell

限制

設定登錄驗證

在提供「無周邊」服務和應用程式存取權的生產案例中,建議您使用服務主體來設定登錄存取。 服務主體可讓您將 Azure 角色型存取控制 (Azure RBAC) 提供給容器映像。 例如,您可以設定服務主體具有僅限提取登錄的存取權。

Azure Container Registry提供其他驗證選項

在下一節中,您會建立 Azure 金鑰保存庫和服務主體,並將服務主體的認證儲存在保存庫中。

建立金鑰保存庫

如果您在 Azure Key Vault 中還沒有保存庫,使用 Azure CLI 以下列命令建立一個。

RES_GROUP 變數更新為您將在其中建立金鑰保存庫之現有資源群組的名稱,將 ACR_NAME 更新為容器登錄的名稱。 為了簡潔起見,本文中的命令假設您的登錄金鑰保存庫和容器執行個體全都建立在相同的資源群組中。

AKV_NAME 指定新金鑰保存庫的名稱。 保存庫名稱在 Azure 內必須是唯一的,長度介於 3 到 24 個英數字元之間,以字母開頭、以字母或數字作為結尾,且不可包含連續的連字號。

RES_GROUP=myresourcegroup # Resource Group name
ACR_NAME=myregistry       # Azure Container Registry registry name
AKV_NAME=mykeyvault       # Azure Key Vault vault name

az keyvault create -g $RES_GROUP -n $AKV_NAME

建立服務主體並儲存認證

現在請建立服務主體,並將其認證儲存在金鑰保存庫中。

下列命令使用 az ad sp create-for-rbac 建立服務主體,並使用 az keyvault secret set 將服務主體的密碼儲存在保存庫中。 請務必在建立時記下服務主體的 appId

# Create service principal
az ad sp create-for-rbac \
  --name http://$ACR_NAME-pull \
  --scopes $(az acr show --name $ACR_NAME --query id --output tsv) \
  --role acrpull

SP_ID=xxxx # Replace with your service principal's appId

# Store the registry *password* in the vault
az keyvault secret set \
  --vault-name $AKV_NAME \
  --name $ACR_NAME-pull-pwd \
  --value $(az ad sp show --id $SP_ID --query password --output tsv)

在前面的命令中,--role 引數設定服務主體具有 acrpull 角色,授與主體僅限提取登錄的存取權。 若要同時授與發送和提取存取權,請將 --role 引數變更為 acrpush

接下來,在保存庫中儲存服務主體的 appId,也就是您傳遞給 Azure Container Registry 進行驗證的使用者名稱

# Store service principal ID in vault (the registry *username*)
az keyvault secret set \
    --vault-name $AKV_NAME \
    --name $ACR_NAME-pull-usr \
    --value $(az ad sp show --id $SP_ID --query appId --output tsv)

您已建立 Azure Key Vault,並在其中儲存兩個祕密:

  • $ACR_NAME-pull-usr:服務主體識別碼,作為容器登錄的使用者名稱
  • $ACR_NAME-pull-pwd:服務主體密碼,作為容器登錄的密碼

現在,當您或應用程式和服務從登錄提取映像時,您可以依名稱參考這些祕密。

使用 Azure CLI 部署容器

現在,服務主體認證儲存在 Azure Key Vault 祕密中,應用程式和服務可以使用它們來存取您的私人登錄。

先使用 az acr show 命令來取得登錄的登入伺服器名稱。 登入伺服器名稱全部都是小寫,類似 myregistry.azurecr.io

ACR_LOGIN_SERVER=$(az acr show --name $ACR_NAME --resource-group $RES_GROUP --query "loginServer" --output tsv)

執行下列 az container create 命令來部署容器執行個體。 此命令使用儲存在 Azure Key Vault 中的服務主體認證來向容器登錄驗證,並假設您已事先將 aci-helloworld 映像推送到登錄。 如果您想要使用不同於登錄的映像,請更新 --image 的值。

az container create \
    --name aci-demo \
    --resource-group $RES_GROUP \
    --image $ACR_LOGIN_SERVER/aci-helloworld:v1 \
    --registry-login-server $ACR_LOGIN_SERVER \
    --registry-username $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-usr --query value -o tsv) \
    --registry-password $(az keyvault secret show --vault-name $AKV_NAME -n $ACR_NAME-pull-pwd --query value -o tsv) \
    --dns-name-label aci-demo-$RANDOM \
    --query ipAddress.fqdn

--dns-name-label 值在 Azure 內必須是唯一的,上述命令才能將一個隨機數字附加至容器的 DNS 名稱標籤。 命令的輸出會顯示容器的完整網域名稱 (FQDN),例如:

"aci-demo-25007.eastus.azurecontainer.io"

一旦容器啟動成功,您可以在瀏覽器中瀏覽到容器的 FQDN,以確認應用程式順利執行。

使用 Azure Resource Manager 範本進行部署

您可以在容器群組定義中加入 imageRegistryCredentials 屬性,以在 Azure Resource Manager 範本中指定 Azure Container Registry 的屬性。 例如,您可以直接指定登錄認證:

[...]
"imageRegistryCredentials": [
  {
    "server": "imageRegistryLoginServer",
    "username": "imageRegistryUsername",
    "password": "imageRegistryPassword"
  }
]
[...]

如需完整的容器群組設定,請參閱 Resource Manager 範本參考

如需參考 Resource Manager 範本中 Azure Key Vault 祕密的詳細資訊,請參閱在部署期間使用 Azure Key Vault 傳遞安全的參數值

使用 Azure 入口網站進行部署

如果您在 Azure Container Registry 中保有容器映像,您就可以使用 Azure 入口網站在 Azure Container Instances 中輕鬆地建立容器。 使用入口網站從容器登錄部署容器執行個體時,您必須啟用登錄的管理帳戶。 管理帳戶是專為讓單一使用者存取登錄而設計,主要用於測試。

  1. 在 Azure 入口網站中,瀏覽到您的容器登錄。

  2. 若要確認已啟用管理帳戶,請選取 [存取金鑰],然後在 [管理使用者] 之下選取 [啟用]

  3. 選取 [存放庫],接著選取您想要從中部署的存放庫、以滑鼠右鍵按一下您想要部署之容器映像的標籤,然後選取 [執行執行個體]

  4. 分別為容器和資源群組輸入名稱。 如有需要,您也可以變更預設值。

    Create menu for Azure Container Instances

  5. 部署完成之後,您可以從 [通知] 窗格瀏覽至容器群組,以尋找其 IP 位址和其他屬性。

    Details view for Azure Container Instances container group

下一步

如需有關 Azure Container Registry 驗證的詳細資訊,請參閱向 Azure Container Registry 進行驗證