Container Registry 是用于在 Google Cloud 上存储私有容器映像的旧版服务。
该服务已弃用。您可以将现有映像移至 Artifact Registry,并继续使用 gcr.io
网域访问这些映像。自 2024 年 5 月 15 日起,之前未使用 Container Registry 的项目将仅在 Artifact Registry 中托管 gcr.io
网域的映像。
如需比较 Container Registry 和 Artifact Registry 并了解如何从 Container Registry 过渡到 Artifact Registry,请参阅从 Container Registry 过渡。
使用映像
很多人都会使用 Docker Hub 作为存储公共 Docker 映像的中央注册表,但若想控制映像的访问权限,则需要使用 Artifact Registry 或 Container Registry 等私有注册表。
您可以通过安全的 HTTPS 端点来访问注册表,以便从任何系统、虚拟机实例或自己的硬件推送、拉取和管理映像。
- 将注册表与 Google Cloud CI/CD 服务或您现有的 CI/CD 工具集成。
- 存储来自 Cloud Build 的容器映像。
- 将容器映像部署到 Google Cloud 运行时,包括 Google Kubernetes Engine、Cloud Run、Compute Engine 和 App Engine 柔性环境。
- Identity and Access Management 提供一致的凭据和访问权限控制。
- 保护您的容器软件供应链。
- 使用 Artifact Analysis 管理容器元数据并扫描容器漏洞。
- 使用 Binary Authorization 强制执行部署政策。
- 在安全边界内保护 VPC Service Controls 注册表。
注册表
您可以使用 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 控制台 项目 ID。如果您的项目 ID 包含英文冒号 (
:
),请参阅下文中的网域级项目。IMAGE 是映像的名称。该名称可能与映像的本地名称不同。在 Google Cloud 控制台中,项目的注册表按映像名称列出。每个代码库可存储多个同名映像。例如,代码库中可以存储不同版本的名为“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 控制台 项目 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/product1
和 us-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 控制台 项目 ID。如果您的项目 ID 包含英文冒号 (:
),请参阅下文中的网域级项目。
在 Google Cloud 控制台中,映像屏幕上的标记列会列出映像的标记。点击映像的版本可以查看元数据,包括映像摘要。
如需了解如何修改标记,请参阅标记映像。
网域级项目
如果您的项目被限定在您的网域范围内,那么项目 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
是 Google Cloud 控制台中图片的网址。任何有权访问注册表主机的经过身份验证的用户都可以使用链接来查看其存储的任何映像。如需详细了解映像路径格式,请参阅注册表。
例如,以下网址会链接到 Google Cloud 控制台中的公共注册表:
容器映像格式
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 技术指南。