Compartilhar via

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

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

先决条件

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

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

还必须在本地安装 Docker,同时运行守护程序。 Docker 提供了在任意 MacWindowsLinux 系统上轻松配置 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 Container Registry工作流的需求。 若要提高存储和映像吞吐量,以及使用 专用终结点进行连接等功能,可以使用 高级 定价计划选项(SKU)。 有关服务层(SKU)的详细信息,请参阅 Azure Container Registry 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 Container Registry拉取 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

后续步骤