Azure 容器注册表的最佳做法

通过遵循这些最佳做法,可帮助最大化性能并在 Azure 中经济、高效地利用专用注册表来存储和部署容器映像及其他项目。

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

临近网络部署

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

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

异地复制多区域部署

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

异地复制适用于高级注册表。 若要了解如何使用异地复制,请参阅 Azure 容器注册表中的异地复制教程,该教程分为三部分。

最大化拉取性能

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

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

    还应检查映像是否可以包含较轻的基础 OS 映像。 如果使用缓存某些基础映像的部署环境(如 Azure 容器实例),请检查是否可以交换某个缓存映像的映像层。

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

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

存储库命名空间

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

例如,考虑以下容器映像标记。 在公司范围内使用的映像(如 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/2017-fall/concertpromotions/campaign:218.42

专用资源组

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

虽然可以试用特定的主机类型(如 Azure 容器实例),但建议在完成操作后删除容器实例。 但是,你可能还想保留推送到 Azure 容器注册表的映像集合。 通过将注册表置于其自己的资源组中,可以最小化删除容器实例资源组时在注册表中意外删除映像集合的风险。

身份验证和授权

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

类型 示例方案 推荐的方法
单个标识 开发者从/向其开发计算机推送映像。 az acr login
无外设/服务标识 用户未直接参与的生成和部署管道。 服务主体

有关所有 Azure 容器注册表身份验证方案的详细信息,请参阅 Azure 容器注册表的身份验证

Azure 容器注册表支持组织中的安全做法,以将职责和特权分配给不同的标识。 使用基于角色的访问控制,为不同用户、服务主体或执行不同注册表操作的其他标识分配适当的权限。 例如,为生成管道中使用的服务主体分配推送权限,并为用于部署的不同标识分配拉取权限。 创建令牌,以用于对特定存储库进行细粒度的限时访问。

管理注册表大小

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

使用 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 门户中注册表的“概述”中,还可以找到当前已用存储:

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

注意

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

删除映像数据

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

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

后续步骤

Azure 容器注册表可用于多个层级(也称为 SKU),这些层级提供不同功能。 有关可用服务层级的详细信息,请参阅 Azure 容器注册表服务层级

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