你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 Azure 门户创建 Azure 容器注册表

Azure 容器注册表 是一项专用注册表服务,用于生成、存储和管理容器映像和相关项目。 在本快速入门中,你将使用 Azure 门户创建一个 Azure 容器注册表实例。 接下来,使用 Docker 命令将容器映像推送到注册表中。 最后,从注册表拉取并运行映像。

先决条件

如果没有 Azure 帐户,请在开始前创建一个免费帐户

若要登录到注册表以使用容器映像,本快速入门要求运行 Azure CLI,最好是最新版本。 如需进行安装或升级,请参阅如何安装 Azure CLI

还必须在本地安装 Docker,同时运行守护程序。 Docker 提供的包可在任何 MacWindowsLinux 系统上轻松配置 Docker。

创建容器注册表

  1. 登录到 Azure 门户

  2. 选择“ 创建资源>基础结构服务>容器注册表>创建”。

    在 Azure 门户中创建新的容器注册表资源的选项的屏幕截图。

  3. 在“ 基本信息 ”选项卡中,选择要在其中创建容器注册表的订阅。

  4. 选择“ 新建 ”以创建新资源组,然后输入 myResourceGroup 资源组名称。

  5. 输入 注册表名称。 注册表名称在 Azure 中必须是唯一的,并且包含 5-50 个字母数字字符,不包括短划线字符(-)。 此名称是注册表的完全限定 DNS 名称的一部分。

  6. 选择West US 2作为位置,以及定价计划,然后选择Standard

  7. 对于 域名标签范围,请选择 “租户重用”,或选择另一个选项,如“ 配置域名标签”(DNL)选项 部分中所述。

  8. 对于 角色分配权限模式,请选择 RBAC 注册表 + ABAC 存储库权限 以保留标准Microsoft Entra 基于角色的访问控制(RBAC)角色分配,同时选择性地应用 Microsoft基于 Entra 属性的访问控制(ABAC)条件 进行精细的存储库级访问控制。

    显示门户中容器注册表创建设置的屏幕截图

  9. 将其他选项设置为默认值,然后选择 “查看 + 创建”。 查看设置后,选择“创建”

提示

在本快速入门中,你将创建一个 标准 注册表,该注册表足以满足大多数 Azure 容器注册表工作流的需求。 若要提高存储和映像吞吐量,以及使用 专用终结点进行连接等功能,可以使用 高级 定价计划选项(SKU)。 有关服务层级(SKU)的详细信息,请参阅 Azure 容器注册表 SKU 功能和限制

出现 “部署成功 ”消息时,选择“ 转到资源” 以查看新的容器注册表。

Azure 门户中容器注册表概述页的屏幕截图。

记下登录服务器的注册表名称和值,这是在 Azure 云中以 azurecr.io 结尾的完全限定名称。

在使用 Docker 推送和拉取映像时,以及在 Dockerfiles、Kubernetes YAML 和 Helm 图表等下游引用中,请按照以下步骤使用登录服务器。

登录到注册表

在推送和拉取容器映像之前,必须登录到注册表实例。 在本地计算机上登录到 Azure CLI ,然后运行 az acr login 命令。

使用 Azure CLI 登录时,仅指定注册表资源名称,例如 az acr login -n registryname。 请勿使用完全限定的登录服务器名称,例如 registryname.azurecr.ioregistryname-hash.azurecr.io (对于已启用 DNL 的注册表)。

az acr login --name <registry-name>

示例:

az acr login --name contosoacrregistry

该命令在完成时返回 Login Succeeded

将映像推送到注册表

要将映像推送到 Azure 容器注册表,首先必须具有一个映像。 如果还没有任何本地容器映像,请运行以下 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 名称中使用哈希。 如果使用 DNL 选项创建 Unsecure 注册表,则登录服务器看起来像 mycontainerregistry.azurecr.io,不带哈希。

在注册表的登录服务器上使用 docker tag 命令标记映像。 对于本快速入门,请将 hello-world 映像标记为 v1

给 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

列出容器映像

若要列出镜像库中的映像,请转到门户中的镜像库。 在“服务”下,选择“存储库”,然后选择你创建的 docker push 存储库。

显示 Azure 门户中容器注册表的容器映像的屏幕截图。

选择 hello-world 存储库时,会在 标签 下看到 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.

[...]

清理资源

若要删除创建的资源,请转到 Azure 门户中的 myResourceGroup 资源组。 选择“ 删除资源组 ”以删除资源组、容器注册表和容器映像。

配置域名标签 (DNL) 选项

域名标签(DNL)功能通过防止注册表 DNS 名称的子域接管攻击来增强安全性。 当一个注册表项被删除时,会发生这些攻击,之后另一实体可能会重复使用相同的注册表项名称,这可能导致后续引用从该实体重新创建的注册表项中获取信息。

DNL 通过将唯一哈希追加到注册表的 DNS 名称来解决此问题。 此方法可确保即使另一个实体重复使用相同的注册表名称,DNS 名称也因唯一哈希而异。 此安全措施可防止下游引用无意中指向其他实体重新创建的注册表。

从 Azure 门户创建注册表时,请从可用选项中选择 域名标签范围

  • 不安全:根据注册表名称按原样创建 DNS 名称(例如,contosoacrregistry.azurecr.io)。 此选项不包括 DNL 保护。
  • 租户重用:基于租户和注册表名称追加唯一哈希,确保 DNS 名称在租户中是唯一的。
  • 订阅重用:根据订阅、租户和注册表名称追加唯一哈希,确保 DNS 名称在订阅中是唯一的。
  • 资源组重用:根据资源组、订阅、租户和注册表名称追加唯一哈希,确保 DNS 名称在资源组中是唯一的。
  • 不重复使用:每次创建注册表时都生成具有唯一哈希的唯一 DNS 名称,而不考虑其他因素,确保 DNS 名称始终是唯一的。

重要

在创建注册表期间选择的 DNL 范围是永久性的,以后无法修改。 此选项可确保 DNS 行为一致,并防止下游引用中断。

对于所有已启用 DNL 的选项( 不安全除外),DNS 名称遵循格式 registryname-hash.azurecr.io,其中短划线(-)充当哈希分隔符。 例如,具有 DNL 作用域的注册表Tenant Reuse 具有类似于 contosoacrregistry-abc123.azurecr.io 的 DNS 名称。 为了避免冲突,注册表名称中不允许使用短划线字符(-)。

如果 DNS 名称与注册表名称不同,则需要更新下游文件,例如 Dockerfiles、Kubernetes YAML 和 Helm 图表,以使用 DNL 哈希反映完整的 DNS 名称。 例如,如果希望下游 Dockerfile 引用命名为contosoacrregistry且具有 DNL 作用域的Tenant Reuse注册表,则需要在下游 Dockerfile 中将引用更新为完整值,例如contosoacrregistry-abc123.azurecr.io

后续步骤

本快速入门介绍了如何使用 Azure 门户创建 Azure 容器注册表、推送容器映像,以及提取和运行注册表中的映像。 若要继续使用 Azure 容器注册表,请参阅 Azure 容器注册表教程。