Compartilhar via

使用 Azure Container Registry 管理公共内容

本文概述了实践和工作流,用于使用本地注册表(例如 Azure 容器注册表)来维护公共内容的副本,包括 Docker Hub 中的容器映像。

公共内容面临的风险

你的环境可能依赖于公共内容,例如公共容器映像、Helm chartOpen Policy Agent (OPA) 策略或其他工件。 例如,你可能运行nginx 来进行服务路由,或通过直接从Docker Hub或其他公共注册表中拉取映像。

如果没有正确的控制措施,则依赖于公共注册表内容可能会为映像开发和部署工作流带来风险。 若要缓解风险,请在可能的情况下保留公共内容的本地副本。 有关详细信息,请参阅开放容器计划博客

使用 Docker Hub 进行身份验证

如果您当前是从 Docker Hub 拉取公共镜像作为构建或部署工作流的一部分,我们建议您使用 Docker Hub 账户进行身份验证,而不是发出匿名拉取请求。

当你频繁发出匿名拉取请求时,可能会看到类似于 ERROR: toomanyrequests: Too Many Requests.You have reached your pull rate limit. 的 Docker 错误。请登录 Docker Hub 进行身份验证,以防止这些错误。

注意

下载速率限制适用于来自 Docker 免费计划帐户的匿名和经过身份验证的 Docker Hub 请求。 这些限制分别由 IP 地址和 Docker ID 强制实施。

若要估计您的拉取请求数量,请记住,当使用云服务提供商的服务或在公司 NAT 后工作时,多个用户在 Docker Hub 上显示为 IP 地址的一个子集。 通过将 Docker 付费帐户身份验证添加到对Docker Hub发出的请求,可以避免速率限制导致的潜在服务中断。

有关详细信息,请参阅 Docker 定价和订阅Docker 服务条款

Docker Hub访问令牌

Docker Hub支持个人访问令牌作为对 Docker Hub 进行身份验证时 Docker 密码的替代方法。 对于从Docker Hub拉取映像的自动化服务,建议使用令牌。 你可以为不同的用户或服务生成多个令牌,并在不再需要时撤销令牌。

若要使用令牌通过 docker login 进行身份验证,请在命令行上省略密码。 当提示输入密码时,请输入令牌,而不是密码。 如果为Docker Hub帐户启用了双重身份验证,则必须在从 Docker CLI 登录时使用个人访问令牌。

从 Azure 服务进行身份验证

多个 Azure 服务(包括应用服务和 Azure Container Instances)支持从公共注册表(例如 Docker Hub,用于容器部署)拉取镜像。 如果需要从Docker Hub部署映像,建议将设置配置为使用 Docker Hub 帐户进行身份验证。 示例:

应用服务

  • 镜像源:Docker Hub
  • 存储库访问:专用
  • Login:<Docker Hub 用户名>
  • Password:<Docker Hub token>

有关详细信息,请参阅在应用服务中进行 Docker Hub 身份验证的拉取操作

Azure Container Instances

  • 镜像来源:Docker Hub或其他注册表
  • 映像类型:专用
  • 映像注册表登录服务器:dockerhub.azk8s.cn
  • Image 注册表用户名:<Docker Hub 用户名>
  • Image 注册表密码:<Docker Hub token>
  • 镜像:dockerhub.azk8s.cn/<存储库名称>:<tag>

配置工件缓存以使用公共内容

有关使用公共内容的最佳做法是将注册表身份验证和工件缓存功能结合使用。 使用工件缓存将容器工件缓存到Azure Container Registry,即使在专用网络中也是如此。 使用项目缓存不仅可保护你免受注册表速率限制的影响,而且当与异地复制的 ACR 结合使用以从离Azure资源最近的区域中拉取项目时,也会显著提高拉取可靠性。 此外,可以使用 ACR 产品/服务的所有安全功能,包括专用网络、防火墙配置、服务主体等。 有关将公共内容与 ACR 项目缓存配合使用的完整信息,请参阅 项目缓存 教程。

将映像导入Azure容器注册表

若要管理公共映像的副本,请创建一个Azure容器注册表(如果还没有)。 使用 Azure CLIAzure 门户Azure PowerShell或其他工具创建注册表。

作为建议的一次性步骤,导入基础映像及其他公共内容至 Azure 容器注册表。 Azure CLI中的 az acr import 命令支持从公共注册表(如Docker Hub和Azure Container Registry)以及从专用容器注册表导入映像。

az acr import 不需要本地 Docker 安装。 可以使用Azure CLI的本地安装来运行它。 它支持任何 OS 类型的映像、多体系结构映像或 OCI 项目(例如 Helm 图表)。

根据你的组织的需求,你可以将内容导入到专用注册表,或导入到共享注册表中的存储库。

az acr import \
  --name myregistry \
  --source dockerhub.azk8s.cn/library/hello-world:latest \
  --image hello-world:latest \
  --username <Docker Hub username> \
  --password <Docker Hub token>

更新图像引用

应用程序映像的开发人员应确保其代码引用受其控制的本地内容。

  • 更新镜像引用以使用专用注册表。 例如,将 Dockerfile 中的 FROM baseimage:v1 语句更新为非 DNL 注册表更新为 FROM myregistry.azurecr.cn/mybaseimage:v1 或为启用 DNL 的注册表更新为 FROM myregistry-abc123.azurecr.cn/mybaseimage:v1。 有关注册表创建期间 DNL 选项和 DNS 名称影响的详细信息,请参阅 快速入门 - 在门户中创建注册表
  • 配置凭据或身份验证机制以使用专用注册表。 确切的机制取决于你用于访问注册表的工具以及管理用户访问的方式。
    • 如果使用 Kubernetes 群集或 Azure Kubernetes Service 访问注册表,请参阅 身份验证方案
    • 详细了解使用 Azure 容器注册表进行身份验证的各种选项。

自动执行应用程序映像更新

若要在更新基础映像时自动生成应用程序映像,请设置 Azure Container Registry 任务。 此方法扩展了映像导入。 自动化的构建任务可以同时跟踪基础映像更新源代码更新

有关详细示例,请参阅 如何使用和维护包含 Azure Container Registry Tasks 的公共内容

注意

单个预配置的任务可以自动重新构建引用所依赖的基础映像的每个应用程序映像。

后续步骤