Azure Container Registry最佳做法

通过遵循这些最佳做法,可以最大程度地提高Azure中专用注册表的性能和成本效益,以存储和部署容器映像和其他项目。

有关注册表概念的背景信息,请参阅关于注册表、存储库和映像。 另请参阅对容器映像进行标记和版本控制的建议,以获取对注册表中的映像进行标记和版本控制的策略。

网络邻近部署

在部署容器的同一Azure区域中创建容器注册表。 将注册表置于容器主机临近网络的区域中可帮助降低延迟和成本。

使用私有容器注册表的主要原因之一是网络邻近部署。 Docker 映像具有有效的分层构造,可实现增量部署。 但是,新节点需要拉取给定镜像所需的所有层。 此初始 docker pull 可以快速增加多个千兆字节。 将私有注册表置于临近部署的位置可最小化网络延迟。 此外,所有公有云(包括Azure)都实施网络出口费用。 除了延迟之外,将映像从一个数据中心拉取到另一个数据中心还会增加网络出口费用。

异地复制多区域部署

如果要将容器部署到多个区域,请使用 Azure Container Registry 的 geo-replication 功能。 无论是从本地数据中心为客户提供服务还是开发团队处于不同的位置,你都可以通过异地复制注册表来简化注册表管理并最小化延迟。 还可以配置区域 Webhook 来通知特定副本中的事件,例如推送映像。

异地复制适用于高级注册表。

最大化拉取性能

除了将映像置于部署附近,映像本身的特性也会影响拉取性能。

  • 映像大小 - 通过删除不必要的层级或减小层级大小来最大程度地减小映像大小。 减小映像大小的一种方法是,使用多阶段 Docker 生成方法以仅添加必要的运行时组件。

    还应检查您的镜像能否包括更轻的基础层操作系统镜像。 如果使用用于缓存某些基础映像的部署环境(如Azure Container Instances),请检查是否可以交换某个缓存映像的映像层。

  • 层数 - 均衡使用的层数。 如果层数过少,则在主机上进行层重用和缓存不会带来任何好处。 如果层数过多,则部署环境会花费更多时间来进行拉取和解压缩。 5 至 10 层为最佳层数。

此外,请选择满足性能需求的Azure Container Registry服务层。 存在大容量部署时,“高级”层可提供最大带宽和最高的并发读写操作速率。

存储库命名空间

通过利用存储库命名空间,可以在组织中的多个组之间共享单个注册表。 可在部署和团队之间共享注册表。 Azure Container Registry支持嵌套命名空间,从而启用组隔离。 但是,注册表独立管理所有存储库,而不是将其作为层次结构进行管理。

例如,考虑以下容器镜像标签。 在公司范围内使用的映像(如 aspnetcore)位于根命名空间中,而产品组和营销组拥有的容器映像都使用其自己的命名空间。

  • contoso.azurecr.cn/aspnetcore:2.0
  • contoso.azurecr.cn/products/widget/web:1
  • contoso.azurecr.cn/products/bettermousetrap/refundapi:12.3
  • contoso.azurecr.cn/marketing/2023-fall/concertpromotions/campaign:218.42

专用资源组

由于容器注册表是跨多个容器主机使用的资源,注册表应位于其自己的资源组中。

尽管你可能尝试使用特定的主机类型(例如 Azure Container Instances),但完成后,可能需要删除容器实例。 但是,你可能还希望保留推送到Azure Container Registry的图像集合。 通过将注册表置于其自己的资源组中,可以最小化删除容器实例资源组时在注册表中意外删除映像集合的风险。

身份验证和授权

使用Azure容器注册表进行身份验证时,有两个主要方案:单个身份验证和服务(或“无外设”)身份验证。 下表提供了这两个方案的简要概述,以及每个方案的推荐身份验证方法。

类型 示例方案 推荐的方法
个人身份 开发者将镜像从其开发环境拉取或推送。 az acr login
无头/服务身份 用户未直接参与的构建和部署流水线。 服务主体

有关这些和其他Azure Container Registry身份验证方案的深入信息,请参阅 Authenticate with an Azure container registry

Azure Container Registry 支持您组织中的安全实践,以便分配不同身份的职责和权限。 使用基于角色的访问控制,为不同用户、服务主体或执行不同注册表操作的其他标识分配适当的权限。 例如,为生成管道中使用的服务主体分配推送权限,并为用于部署的不同标识分配拉取权限。 使用基于 Microsoft Entra 的存储库权限对特定存储库进行精细访问。 或者,可以使用非微软 Entra 基于令牌的存储库权限。

管理注册表大小

每个容器注册表服务层级的存储约束旨在与典型方案保持一致:基本层级适用于入门,标准层级适用于大部分生产应用程序,高级层级适用于超大规模性能和异地复制。 在注册表的整个生命周期中,应定期删除未使用的内容,管理注册表大小。

使用 Azure CLI 命令 az acr show-usage显示注册表中存储和其他资源的当前消耗量:

az acr show-usage --resource-group myResourceGroup --name myregistry --output table

示例输出:

NAME                        LIMIT         CURRENT VALUE    UNIT
-------------------------- ------------  --------------- ------
Size                        536870912000  215629144        Bytes
Webhooks                    500           1                Count
Geo-replications            -1            3                Count
IPRules                     100           1                Count
VNetRules                   100           0                Count
PrivateEndpointConnections  10            0                Count

还可以在 Azure 门户中注册表的 Overview 中找到当前存储使用情况:

Azure 门户中的注册表使用情况信息

注意

异地复制的注册表中,会显示主区域的存储使用情况。 为了计算消耗的总注册表存储量,将数字乘以复制次数。

删除映像数据

Azure Container Registry支持多种从容器注册表中删除映像数据的方法。 可以按标记或清单摘要删除镜像,也可以删除整个存储库。

有关从注册表中删除映像数据(包括未标记(有时称为“悬空”或“孤立”)的映像)的详细信息,请参阅 Azure 容器注册表中删除容器映像。 还可以为未标记的清单设置保留策略

后续步骤

Azure Container Registry可在提供不同功能的多个层(也称为 SKU)中使用。 有关可用服务层的详细信息,请参阅 Azure Container Registry 服务层级

有关改进容器注册表安全状况的建议,请参阅 Azure 容器注册表的安全基线