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

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

先决条件

如果您没有 Azure 帐户,请在开始之前创建一个试用订阅。

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

还必须在本地安装 Docker,同时运行守护程序。 Docker 提供了在任意 Mac、Windows 或 Linux 系统上轻松配置 Docker 的包。

创建容器注册表

  1. 登录到 Azure 门户。

  2. 选择“创建资源>”,然后在“创建资源”页的搜索服务和市场筛选器中输入容器注册表,然后选择 Enter 键。 接下来,在搜索结果中选择 容器注册表 ,最后选择“ 创建”。

    Azure portal 中关于创建新的容器注册表资源选项的屏幕截图。

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

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

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

  6. 选择“中国东部 2”作为位置,对于定价计划,选择Standard。

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

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

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

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

提示

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

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

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

记下注册表名称和 Login 服务器的值,这是一个完全限定的名称,以 Azure 云中的 azurecr.cn 结尾。

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

登录到注册表

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

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

az acr login --name <registry-name>

示例:

az acr login --name contosoacrregistry

该命令在完成时返回 Login Succeeded 。

将映像推送到注册表

若要将映像推送到Azure容器注册表,必须先具有映像。 如果还没有任何本地容器映像,请运行以下 docker pull 命令,拉取现有公共映像。 对于此示例,请从Azure 容器注册表拉取 hello-world 映像。

docker pull mcr.microsoft.com/hello-world

在将映像推送到注册表之前,必须使用具有注册表登录服务器的完全限定名称的 docker 标记 来标记映像。

  • 域名标签(DNL)受保护的注册表的登录服务器名称格式是包含唯一 DNS 名称哈希的mycontainerregistry-abc123.azurecr.cn。
  • 使用 Unsecure DNL 选项创建的注册表的登录服务器名称格式为 mycontainerregistry.azurecr.cn。

例如,如果使用 DNL 范围创建注册表 Tenant Reuse ,则登录服务器可能类似于 mycontainerregistry-abc123.azurecr.cn DNS 名称中的哈希。 如果使用 DNL 选项创建 Unsecure 注册表,则登录服务器看起来像 mycontainerregistry.azurecr.cn,不带哈希。

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

给 DNL 保护的注册表的映像打标签的示例命令:

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

为非 DNL 类型的镜像仓库添加标签的示例命令:

docker tag mcr.microsoft.com/hello-world mycontainerregistry.azurecr.cn/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.cn/hello-world:v1' locally
v1: Pulling from hello-world
Digest: sha256:662dd8e65ef7ccf13f417962c2f77567d3b132f12c95909de6c85ac3c326a345
Status: Downloaded newer image for mycontainerregistry.azurecr.cn/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 门户创建注册表时,请从可用选项中选择 Domain Name Label Scope:

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

重要

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

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

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

后续步骤