共用方式為


快速入門:使用 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 參考名稱為contosoacrregistry且具有TenantReuse DNL 範圍的註冊表,則需要更新下游 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) 的詳細資訊,請參閱容器登錄服務層

登入登錄

推送和提取容器映像之前,您必須先登入登錄。 若要這樣做,請使用 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
  • 使用 DNL 選項建立的登錄伺服器名稱格式為 Unsecure

例如,如果您的登錄是以 DNL 範圍Tenant Reuse建立的,則登入伺服器名稱可能看起來像DNS名稱中帶有哈希的名稱mycontainerregistry-abc123.azurecr.io。 如果您的登錄是使用 Unsecure DNL 選項建立的,那麼沒有哈希時,登入伺服器會看起來像 mycontainerregistry.azurecr.io

如需登錄建立期間 DNL 選項和 DNS 名稱含意的詳細資訊,請參閱 快速入門 - 在入口網站中建立登錄

範例:在推送之前標記影像

使用您的登錄伺服器,使用 docker tag 命令標記映像。

標記非 DNL 登錄的映射:

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

標記已啟用 DNL 的註冊表影像:

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

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

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

將映像推送到您的容器登錄之後,請從您的本機 Docker 環境中移除 hello-world:v1 映像。 (請注意,此 docker rmi 命令不會從 Azure Container Registry 中的 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

從登錄執行映像

現在,您可以使用 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 容器登錄教學課程,以深入了解 ACR。