共用方式為


快速入門:使用 Azure CLI 建立私人容器登錄

Azure Container Registry 是私人登錄服務,用於建置、儲存和管理容器映像及相關成品。 在本快速入門,您會使用 Azure CLI 建立 Azure Container Registry 執行個體。 接著,會再使用 Docker 命令將容器映像推送到登錄,最後從登錄提取映像並加以執行。

執行此快速入門時,您必須執行 Azure CLI (建議使用 2.0.55 版或更新版本)。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

您也必須在本機安裝 Docker。 Docker 提供的套件可讓您在任何 macOSWindowsLinux 系統輕鬆設定 Docker。

由於 Azure Cloud Shell 不包含所有必要的 Docker 元件 (dockerd 精靈),您無法在本快速入門使用 Cloud Shell。

建立資源群組

使用 az group create 命令來建立資源群組。 Azure 資源群組是在其中部署與管理 Azure 資源的邏輯容器。

下列範例會在 eastus 位置建立名為 myResourceGroup 的資源群組。

az group create --name myResourceGroup --location eastus

設定容器登錄的參數

在本快速入門中,您會建立 標準 登錄,這足以處理大部分的 Azure Container Registry 工作流程。 如需詳細了解可用的服務層級,請參閱容器登錄服務層級

使用 az acr create 命令建立 ACR 執行個體。 登錄名稱在 Azure 內必須唯一,且包含 5-50 個小寫英數字元。 下列範例使用 mycontainerregistry。 請將它更新為唯一的值。

設定域名標籤(DNL)選項

網域名稱標籤(DNL)功能藉由防止登錄 DNS 名稱的子域接管攻擊來增強安全性。 這類攻擊會發生在刪除登錄時,另一個實體重新使用相同登錄名稱的情況,這可能導致下游參照從其他實體重新建立的登錄提取的內容。

DNL 會將唯一哈希附加至登錄的 DNS 名稱,藉以解決此問題。 這可確保即使另一個實體重複使用相同的登錄名稱,DNS 名稱也會因為唯一的哈希而有所不同。 這麼做可以保護您的下游參照免於不小心指向其他實體重新建立的登錄。

az acr create 命令建立登錄時,您可以指定選擇性旗標 --dnl-scope ,並從可用的選項中選擇:

  • Unsecure:根據登錄名稱建立 DNS 名稱 as-is,例如 contosoacrregistry.azurecr.io。 此選項不包含 DNL 保護。
  • TenantReuse:根據租使用者和登錄名稱附加唯一哈希,確保 DNS 名稱在租使用者內是唯一的。
  • SubscriptionReuse:根據訂用帳戶、租用戶和登錄名稱附加唯一哈希,確保 DNS 名稱在訂用帳戶內是唯一的。
  • ResourceGroupReuse:根據資源群組、訂用帳戶、租使用者和登錄名稱附加唯一哈希,確保 DNS 名稱在資源群組內是唯一的。
  • NoReuse:每次建立登錄時,產生具有唯一哈希的唯一 DNS 名稱,而不論其他因素為何,確保 DNS 名稱一律是唯一的。

備註

固定組態:登錄建立期間選取的 DNL 範圍是永久性的,且稍後無法修改。 這可確保一致的 DNS 行為,並防止下游參考中斷。

DNL 選項的 DNS 名稱含意

DNS 名稱格式:針對所有啟用 DNL 的選項,除了 Unsecure之外,DNS 名稱會遵循格式 registryname-hash.azurecr.io,其中虛線 (-) 會做為哈希分隔符。 為了避免衝突,登錄名稱中不允許dash (-) 。 例如,名為 contosoacrregistry 且具有 TenantReuse DNL 範圍的登錄會有如 contosoacrregistry-e7ggejfuhzhgedc8.azurecr.io 的 DNS 名稱。

下游參考: DNS 名稱可能與註冊表名稱不同,這可能需要對 Dockerfiles、Kubernetes YAML 和 Helm chart 等下游文件進行更新,以反映包含 DNL 雜湊的完整 DNS 名稱。 舉例來說,如果您希望下游的 Dockerfile 以 TenantReuse DNL 範圍參照名為 contosoacrregistry 的登錄,您必須在下游 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 工作流程。 為了提升儲存空間與映像吞吐量,以及使用 私人端點連線等功能,提供 高級 定價方案(SKU)。 關於服務層級(SKU)的詳細資訊,請參閱 Azure 容器登錄 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 標籤 加上你登錄檔登入伺服器的完整限定名稱來標記它。

  • 網域名稱標籤 (DNL) 保護的登錄若要包含唯一 DNS 名稱雜湊,則登入伺服器名稱的格式為 mycontainerregistry-abc123.azurecr.io
  • Unsecure DNL 選項建立的登錄採用的伺服器名稱格式為 mycontainerregistry.azurecr.io

舉例來說,如果您以 Tenant Reuse DNL 範圍建立登錄,登入伺服器可能類似 mycontainerregistry-abc123.azurecr.io,DNS 名稱有雜湊。 如果您以 Unsecure DNL 選項建立登錄,登入服務則類似 mycontainerregistry.azurecr.io,不含雜湊。

docker tag 命令加上登錄的登入伺服器標記映像。 在本快速入門,請使用 v1 標記 hello-world 映像。

為 DNL 保護登錄檔標記映像的範例指令:

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

為非 DNL 登錄檔標記映像的範例指令:

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

最後,使用 docker push 將映像推送至登錄執行個體。 以 <login-server> 取代登錄執行個體的登入伺服器名稱。 本範例建立的 hello-world 存放庫,包含 hello-world:v1 映像。

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

將映像檔推送到容器登錄檔後,使用 hello-world:v1 指令將映像從本地 Docker 環境中移除。 這個指令不會把映像從你的 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

從登錄執行映像

現在,您可以使用 docker run 提取容器登錄的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。