通过 Azure 容器注册表管理公共内容

本文概述了使用本地注册表(例如 Azure 容器注册表)维护公共内容副本(例如 Docker Hub 中的容器映像)的做法和工作流。

公共内容面临的风险

你的环境可能依赖于公共内容,例如公共容器映像、Helm 图表Open Policy Agent (OPA) 策略或其他项目。 例如,你可以通过直接从 Docker Hub 或其他公共注册表拉取映像来运行适用于服务路由的 nginx 或运行 docker build FROM alpine

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

使用 Docker Hub 进行身份验证

首先,如果你当前在构建或部署工作流时从 Docker Hub 拉取公共映像,建议你使用 Docker Hub 帐户进行身份验证,而不是发出匿名拉取请求。

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

注意

自 2020 年 11 月 2 日起,下载速率限制应用于 Docker 免费计划帐户对 Docker Hub 发出的匿名请求和经身份验证的请求,并且分别按 IP 地址和 Docker ID 强制实施。

估计你的拉取请求数量时,请注意,当使用云提供商服务或在公司 NAT 后工作时,多个用户将作为一个 IP 地址子集一起呈现给 Docker Hub。 在对 Docker Hub 发出的请求中添加 Docker 付费帐户身份验证会避免由于速率限制限流而导致的潜在服务中断。

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

Docker Hub 访问令牌

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

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

从 Azure 服务进行身份验证

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

应用服务

  • 映像源:Docker 中心
  • 存储库访问:专用
  • 登录名:<Docker Hub 用户名>
  • 密码:<Docker Hub 令牌>

有关详细信息,请参阅应用服务上通过 Docker Hub 进行身份验证的拉取

Azure 容器实例

  • 映像源:Docker Hub 或其他注册表
  • 映像类型:专用
  • 映像注册表登录服务器:dockerhub.azk8s.cn
  • 映像注册表用户名:<Docker Hub 用户名>
  • 映像注册表密码:<Docker Hub 令牌>
  • 图像:dockerhub.azk8s.cn/<存储库名称>:<标记>

将映像导入到 Azure 容器注册表

若要开始管理公共映像的副本,你可以创建一个 Azure 容器注册表(如果尚未创建)。 使用 Azure CLIAzure 门户Azure PowerShell 或其他工具创建注册表。

请将基础映像和其他公共内容导入到你的 Azure 容器注册表,这是我们为你建议的一次性步骤。 Azure CLI 中的 az acr import 命令支持从公共注册表(例如 Docker Hub 和 Azure 容器注册表)和其他专用容器注册表导入映像。

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 语句更新为 FROM myregistry.azurecr.cn/mybaseimage:v1
  • 配置凭据或身份验证机制以使用专用注册表。 确切的机制取决于你用于访问注册表的工具以及管理用户访问的方式。

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

在映像导入基础上进行扩展,设置一个 Azure 容器注册表任务,以在基础映像更新时自动构建应用程序映像。 自动化的构建任务可以同时跟踪基础映像更新源代码更新

有关详细示例,请参阅如何使用 Azure 容器注册表任务消耗并维护公共内容

注意

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

后续步骤