建议使用 Artifact Registry 服务来管理容器映像。Container Registry 仍受支持,但只会收到重要的安全补丁。了解如何过渡到 Artifact Registry

Container Registry 概览

Google Cloud 具有两项用于存储和管理容器映像的服务:

Artifact Registry(推荐)
Artifact Registry 服务用于在私有代码库中存储和管理工件,包括容器映像、Helm 图表和语言软件包。

Artifact Registry 扩展了 Container Registry 的功能。除了支持多种工件格式之外,该服务还提供其他优势,例如:

  • 区域级和多区域级支持
  • 能够使用代码库级层访问权限控制机制在同一个单区域或多区域中创建多个独立的代码库
  • 特定于服务的 Identity and Access Management 角色,能够明确分离代码库管理和代码库用户权限
Container Registry

它是一个支持 Docker Image Manifest V2 和 OCI 映像格式的私有容器映像注册表。它提供了一部分 Artifact Registry 功能。

虽然 Container Registry 仍然可用,并且作为 Google Enterprise API 受到支持,但新功能仅可用于 Artifact Registry。Container Registry 只会收到重要的安全补丁。

如需比较 Container Registry 和 Artifact Registry 并了解如何从 Container Registry 过渡到 Artifact Registry,请参阅从 Container Registry 过渡

使用映像

很多人都会使用 Docker Hub 作为存储公共 Docker 映像的中央注册表,但若想控制映像的访问权限,则需要使用 Artifact Registry 或 Container Registry 等私有注册表。

您可以通过安全的 HTTPS 端点来访问注册表,以便从任何系统、虚拟机实例或自己的硬件推送、拉取和管理映像。

注册表

您可以使用 Container Registry 在每个 Google Cloud 项目中最多创建四个多区域主机。如果要使用单独的访问权限政策创建更多独立的代码库或将映像存储在单区域而非多区域中,请改用 Artifact Registry

Container Registry 中的注册表由主机和项目 ID 命名。如需处理映像(例如推送、拉取、删除),请使用以下格式标识映像:

HOSTNAME/PROJECT-ID/IMAGE:TAG

HOSTNAME/PROJECT-ID/IMAGE@IMAGE-DIGEST

其中:

  • HOSTNAME 是映像存储位置:

    • gcr.io 目前在美国托管映像,但此托管位置未来可能会发生变化
    • us.gcr.io 在美国托管映像,使用的存储分区与 gcr.io 托管的映像不同
    • eu.gcr.io 在欧盟的成员国托管映像
    • asia.gcr.io 在亚洲托管映像

    这些位置对应于 Cloud Storage 存储分区的多区域位置。如果您将映像推送到使用新主机名的注册表,Container Registry 会在指定的多区域位置中创建一个存储分区。该存储分区是注册表的底层存储空间。在项目中,所有使用相同主机名的注册表都共用一个存储分区。

  • PROJECT-ID 是您的 Google Cloud Console 项目 ID。如果您的项目 ID 包含英文冒号 (:),请参阅下文中的网域级项目

  • IMAGE 是映像的名称。该名称可能与映像的本地名称不同。在 Google Cloud Console 中,项目的注册表按映像名称列出。每个代码库可存储多个同名映像。例如,代码库中可以存储不同版本的名为“my-image”的映像。

  • 您也可以选择在映像名称末尾添加 :TAG@IMAGE-DIGEST 来区分映像的特定版本。如果您未指定标记或摘要,Container Registry 将查找带有默认标记 latest 的映像。请参阅下文中的注册表中的映像版本

对于注册表 gcr.io/PROJECT-ID 中的映像 my-image,您可以采用以下格式来推送或拉取映像:

gcr.io/PROJECT-ID/my-image:tag1

其中,PROJECT-ID 是您的 Google Cloud Console 项目 ID

使用代码库组织映像

您可以将注册表中的相关映像划分到注册表中的代码库下。当您标记、推送或拉取映像时,您可以在映像路径中的项目下指定代码库名称。

在 Container Registry 中,代码库是组织辅助项目。它们充当映像路径中的逻辑文件夹,但没有反映实际的文件系统结构或支持更精细的访问权限控制。

请考虑存储在项目 builds 的主机 us.gcr.io 中的以下映像:

us.gcr.io/builds/product1/dev/product1-app:beta-2.0
us.gcr.io/builds/product1/stable/product1:1.0
us.gcr.io/builds/product2/dev/product2:alpha
us.gcr.io/builds/product2/stable/product2:1.0

如果用户对 builds 项目中的 us.gcr.io 主机具有写入权限,则他们对 us.gcr.io/builds 下的任何路径都具有写入权限,因为所有映像都位于同一个存储桶中,而您无法将权限限制在代码库级层或映像级层。

如果您需要更精细的访问权限控制,则可以改用 Artifact Registry。在 Artifact Registry 中,代码库是离散的资源,因此您可以将单独的 IAM 政策应用于 us-docker.pkg.dev/builds/product1us-docker.pkg.dev/builds/product2 等代码库。

注册表中的映像版本

一个注册表可以包含许多映像,并且这些映像可以有不同的版本。如需标识注册表中映像的特定版本,您可以指定映像标记或摘要。

  • 标记充当标签。您可以将多个标记应用于一个映像。例如,一个映像可能具有标记 v1.5 来表示版本号,而 release-candidate 表示最终测试的就绪性。
  • 摘要是自动生成的,并且每个映像版本的摘要不会重复,格式为 @IMAGE-DIGEST。其中,IMAGE-DIGEST 是映像内容的 sha256 哈希值。

如需识别映像 my-image 的特定版本,请执行以下命令:

  • 添加映像标记:

    gcr.io/PROJECT-ID/my-image:tag1
    
  • 或添加映像的摘要:

    gcr.io/PROJECT-ID/my-image@sha256:4d11e24ba8a615cc85a535daa17b47d3c0219f7eeb2b8208896704ad7f88ae2d
    

其中,PROJECT-ID 是您的 Google Cloud Console 项目 ID。如果您的项目 ID 包含英文冒号 (:),请参阅下文中的网域级项目

在 Cloud Console 的映像屏幕上,标记列中会列出该映像的标记。点击映像的版本可以查看元数据,包括映像摘要

如需了解如何修改标记,请参阅标记映像

网域级项目

如果您的项目被限定在您的网域范围内,那么项目 ID 应包含相应域名和一个英文冒号 (:)。鉴于 Docker 对英文冒号的处理方式,当您在 Container Registry 中指定映像摘要时,必须用正斜杠替换英文冒号字符。请使用以下格式来标识这类项目中的映像:

HOSTNAME/[DOMAIN]/[PROJECT]/IMAGE

例如,ID 为 example.com:my-project 的项目可能会有下列映像:

gcr.io/example.com/my-project/image-name

网址格式的注册表名称

网址 https://HOSTNAME/PROJECT-ID/IMAGE 是 Cloud Console 中图片的网址。任何有权访问注册表主机的经过身份验证的用户都可以使用链接来查看其存储的任何映像。如需详细了解映像路径格式,请参阅注册表

例如,以下网址会链接到 Cloud Console 中的公共注册表:

容器映像格式

Container Registry 支持 Docker Image Manifest V2 和 OCI 映像格式。 如需了解详情,请参阅容器映像格式

如果您希望集中存储映像和其他类型的工件,请考虑使用 Artifact Registry 而不是 Container Registry。

访问权限控制机制

Container Registry 将容器映像的标记和层文件存储在注册表所属项目的 Cloud Storage 存储分区中。您可以使用 Cloud Storage 的 Identity and Access Management (IAM) 设置来配置存储分区的访问权限。

有权访问注册表主机的用户可以访问主机存储分区中的任何映像。如果您需要更精细的访问权限控制,请考虑使用 Artifact Registry。Artifact Registry 提供代码库级层的访问权限控制。

默认情况下,项目所有者和编辑者对该项目的 Container Registry 存储分区拥有推送和拉取权限。项目查看者仅拥有拉取权限。

如需详细了解 Container Registry 权限,请参阅配置访问权限控制

如需将映像元数据从 Cloud Storage 迁移到高性能后端数据库的相关计划,请参阅 Container Registry 弃用声明

身份验证

您必须先配置身份验证,然后才能推送或提取映像。您可以将 Docker 配置为使用 Google Cloud CLI 对向 Container Registry 发出的请求进行身份验证。Container Registry 还支持使用访问令牌或 JSON 密钥文件的高级身份验证方法

Docker 凭据帮助程序

为推送和拉取映像,Docker 需要访问 Container Registry。您可以使用 Docker 凭据帮助程序命令行工具来配置要用于 Docker 的 Container Registry 凭据。

该凭据帮助程序会自动或从其 --token-source 标志指定的位置提取 Container Registry 凭据,然后将凭据写入 Docker 的配置文件。这样,您就可以使用 Docker 命令行工具 docker 直接与 Container Registry 进行交互。

如需了解详情,请参阅高级身份验证

Container Registry 服务帐号

启用 Container Registry API 时,Container Registry 会为您的项目添加一个服务帐号。此服务帐号的 ID 如下所示:

service-[PROJECT_NUMBER]@containerregistry.iam.gserviceaccount.com

此 Container Registry 服务帐号专为 Container Registry 在您的项目中执行其服务任务而设计。Google 管理此帐号,但专供您的项目使用。

如果您删除此服务帐号或更改其权限,某些 Container Registry 功能将不起作用。因此建议您不要修改角色或删除帐号。

如需详细了解此服务帐号及其权限,请参阅 Container Registry 服务帐号

拉取缓存

mirror.gcr.io 镜像仓库会缓存官方 Docker Hub 代码库中经常被请求的公共映像。

使用缓存的映像可以加快从 Docker Hub 拉取的速度。客户端始终先检查 Docker Hub 映像的缓存副本,然后再尝试直接从 Docker Hub 拉取映像。

如需了解详情,请参阅拉取缓存的 Docker Hub 映像

通知

您可以使用 Pub/Sub 获取有关容器映像更改的通知。

如需了解详情,请参阅配置 Pub/Sub 通知

将 Container Registry 与 Google Cloud 搭配使用

Compute Engine 实例和 Google Kubernetes Engine 集群可以根据实例上的 Cloud Storage 范围推送和拉取 Container Registry 映像。请参阅将 Container Registry 与 Google Cloud 搭配使用

存储在 Container Registry 中的映像可以部署到 App Engine 柔性环境

持续交付工具集成

Container Registry 使用热门的持续集成和持续交付系统,包括 Cloud Build 和 Jenkins 等第三方工具。

Container Registry 与 Google Cloud 服务无缝集成。例如,默认情况下,Cloud Build 可以将映像推送到同一项目中的 Container Registry 主机以及从中拉取映像。默认情况下,Google Kubernetes Engine 和 Cloud Run 等运行时环境也可以从同一项目中的注册表主机拉取映像。

此外,您还可以使用 Jenkins 等第三方工具来构建、拉取和推送映像。使用第三方工具时,您需要代表工具针对将要与 Container Registry 进行交互的帐号配置权限身份验证

如需浏览集成示例,请查看包含 Container Registry 的 Google Cloud 技术指南