访问容器注册表
IBM Cloud® Code Engine 使用的镜像通常存储在注册表中,该注册表可以对公众开放(公共注册表),也可以设置为仅限一小部分用户访问(私有注册表)。
容器注册表或注册表是存储容器映像的服务。 例如,IBM Cloud Container Registry 和 Docker Hub 是容器注册表。 容器注册表可以是公用或专用的。 公共容器注册表不需要凭证即可访问。 相反,访问专用注册表需要凭证。
Code Engine 需要访问容器注册表以完成以下操作:
- 检索 (或 "拉取") 容器映像以运行应用程序或作业
- 将新创建的容器映像存储为映像构建的输出
- 从本地源运行构建时存储和检索本地文件
Code Engine 处理系统与注册表之间交互的许多底层详细信息。
为了从注册表中提取镜像,Code Engine 会使用一种特殊的 Kubernetes 密钥,称为 imagePullSecret。 此映像拉取私钥存储了用于访问容器注册表的凭证。 当您使用 Code Engine 向容器注册表添加访问权限以拉取镜像时,您正在创建一个镜像拉取密钥。 有关镜像拉取密钥的更多信息,请参阅 Kubernetes 文档。
映像注册表的类型
映像通常存储在可由公共(公共注册表)访问的注册表中,或者存储在针对一小组用户设置有限访问权(专用注册表)的注册表中。
公共注册表 (例如公共 Docker Hub) 可用于开始使用 Docker 和 Code Engine 来创建第一个应用程序或作业。 但在处理企业工作负载时,请使用私有注册表(例如 IBM Cloud Container Registry 中提供的注册表),以防止您的镜像被未经授权的用户使用。 对于专用注册表,请使用注册表私钥来确保凭证可用于访问专用注册表。
| 注册表 | 描述 |
|---|---|
| IBM Cloud Container Registry |
借助此类注册表,您可以在 IBM Cloud Container Registry 上搭建自己的安全镜像仓库,用于安全地存储镜像并在用户之间共享。
|
| 其他任何专用注册表 |
通过添加访问权将任何现有专用注册表连接到 Code Engine。 安全地添加访问权限会将您的注册表 URL 和凭据保存在 Kubernetes 中的一个密钥中。
|
| 公共 Docker 中心 |
使用此类注册表,可在您的 Code Engine 应用程序或作业中直接从 Docker Hub拉取现有的公共镜像。 重要提示:
借助公共 Docker Hub,您可以:
|
注册表私钥的类型
要访问注册表中的映像,Code Engine 使用下列其中一种类型的注册表私钥。
- Code Engine 受管私钥-如果注册表使用帐户中的 IBM Cloud Container Registry 名称空间,那么可以让 Code Engine 为您创建和管理注册表私钥。 在控制台中,此自动创建的注册表私钥称为
Code Engine managed secret。 在 CLI 中,自动创建的注册表私钥的名称格式为ce-auto-icr-private-<region>。 - 用户管理的私钥-这是您创建和管理的私钥。 您可以 使用 API 密钥从帐户访问映像,也可以将访问令牌用于您选择的容器注册表; 例如,Docker Hub。 对于这种情况,控制台中列出的注册表私钥是注册表私钥的名称。
如果注册表是公共注册表,并且不需要凭证; 例如,icr.io/codeengine 或 Docker Hub 公用中的 Code Engine 样本映像,那么您不需要注册表私钥。 对于此情况,控制台中列出的注册表私钥为 None。
从公共帐户访问映像
如果映像存储在公共存储库 (例如公共 Docker Hub) 中,那么只需在部署应用程序或运行作业时直接引用该映像即可。 请注意,在公共注册表中存储映像对于开始使用应用程序和作业非常有用,请将企业映像存储在专用注册表中。
从控制台访问您自己帐户中的映像
如果要从您拥有或管理的帐户访问 Code Engine,那么在从控制台创建或更新应用程序,作业或构建时,Code Engine 可以自动将映像推送到帐户中的 IBM Cloud Container Registry 名称空间以及从该名称空间中提取映像。Code Engine 甚至可以在推送映像时为您创建名称空间。 有关更多信息,请参阅以下主题。
- 使用控制台 在 IBM Cloud Container Registry 中部署引用映像的应用程序。
- 从源代码部署应用程序。
- 使用控制台 从 IBM Cloud Container Registry 中的映像创建作业。
- 从源代码创建作业。
使用 API 密钥从帐户访问映像
如果要使用 CLI 访问 Code Engine,那么必须首先创建 IAM API 密钥,然后在 Code Engine中 将 IAM API 密钥另存为注册表访问权。
以下步骤将创建一个 API 密钥,用于存储某个用户 ID 的凭据。 与其使用用户 ID,您不妨为一个具有 IBM Cloud IAM 服务访问策略(该策略允许访问 IBM Cloud Container Registry )的服务 ID 创建一个 API 密钥。 如果您选择对用户 ID 进行身份验证,请确保该用户是功能性 ID,或者针对用户离职的情况做好相应规划,以确保 Code Engine 仍能访问注册表。
通过控制台创建 API 密钥
要从控制台创建 IBM Cloud IAM API 密钥,
-
启动 Access(IAM)概述。
-
选择 API 密钥。
-
单击创建 IBM Cloud API 密钥。
-
为您的 API 密钥输入名称和可选描述,然后点击 “创建”。
-
复制 API 密钥或单击“下载”以保存该密钥。
您将无法再次看到此 API 密钥,因此请确保将其记录在安全位置。
既然您已创建 API 密钥,请 将其另存为注册表访问权。
使用 CLI 创建 API 密钥
要使用 CLI 创建“IBM CloudIAM API 密钥,请运行”iam api-key-create 命令。 例如,要创建一个名为 "cliapikey、描述名为 "My CLI API key 的 API 密钥,并将其保存到名为 "key_file 的文件中,请运行以下命令:
ibmcloud iam api-key-create cliapikey -d "My CLI API key" --file key_file
如果选择不将密钥保存到文件中,那么必须记录创建密钥时显示的 API 密钥。 以后将无法检索。
既然您已创建 API 密钥,请 将其另存为注册表访问权。
访问其他帐户中的映像
您可以将 IBM Cloud 的IAM访问策略分配给用户或服务ID,以限制对特定注册表镜像命名空间或操作(例如推送或拉取)的权限。 然后,创建一个 API 密钥,并将这些注册表凭据存储在 Code Engine 中。
例如,若要访问其他 IBM Cloud 账户中的图片,请创建一个API密钥,该密钥需存储该账户中某个用户或服务ID的 IBM Cloud Container Registry 凭据。 然后,在 Code Engine中,使用该密钥在帐户中 创建访问权。
访问专用 Docker Hub 帐户中的映像
要访问专用 Docker Hub 帐户中的映像,请通过提供密码或访问令牌来创建注册表访问权。 通过使用访问令牌,您可以更轻松地授予和撤销对 Docker Hub 帐户的访问权,而无需更改密码。 有关访问令牌和 Docker Hub 的更多信息,请参阅 创建和管理访问令牌。
在决定是直接使用密码还是创建访问令牌之后,创建注册表访问权。
将注册表访问权添加到 Code Engine
要设置对不同 IBM Cloud 帐户中的 IBM Cloud Container Registry 的访问权,要从专用 Docker 中心帐户中提取映像,或者要使用 Code Engine CLI 来提取或推送映像,您可以使用 IBM API 密钥 或 Docker Hub 密码或访问令牌,通过 Code Engine 创建注册表访问权,以存储您的认证密钥或令牌。
从控制台添加注册表访问权
开始之前,请 创建项目。
- 在项目处于 活动 状态后,在 Code Engine "项目" 页面上单击项目的名称。
- 在“组件”页面中,单击 私钥和配置映射。
- 从“私钥和配置映射”页面中,单击 创建 以创建私钥。
- 从“创建私钥或配置映射”页面,完成以下步骤:
- 选择 注册表私钥,然后单击 下一步。
- 提供名称; 例如,
mysecret-registry。 - 指定此私钥的目标注册表,例如 IBM Cloud Container Registry 或 Docker Hub。
- 指定注册表的位置。
- 指定用户名。 如果此私钥适用于 IBM Cloud Container Registry,那么用户名为
iamapikey。 如果此私钥适用于 Docker Hub,那么它是您的 Docker 标识。 - 输入用户名的凭证。 对于 IBM Cloud Container Registry,请使用 IAM API 密钥。 对于 Docker Hub,可以使用 Docker Hub 密码或 访问令牌。 对于其他目标注册表,请指定用户名的密码或 API 密钥。
- 点击 “创建”以生成密钥。
现在,您的私钥是从控制台创建的,请转至“私钥和配置映射”页面以查看已定义的私钥和配置映射的列表。 您可以应用过滤器来定制列表以满足您的需求。
在创建应用程序或作业时,或者在构建映像时,可以添加对容器注册表的访问权。 单击 配置映像 并指定要运行的容器映像,包括用于存储映像的注册表以及用于检索映像的 注册表访问权。
使用 CLI 添加注册表访问权
从 CLI 版本 1.42.0 开始,在 CLI 中定义和使用密钥的功能已统一到 secret 命令组下统一进行。 请参阅 ibmcloud ce secret 命令。 使用 --format 选项指定秘密类别,如 basic_auth, generic, hmac, ssh, tls 或 registry。 虽然可以继续使用 registry 命令组的同时,还可以利用统一的 secret 命令组的优势。 要创建一个访问容器注册表的秘密,请使用 ibmcloud ce secret create --format registry 命令。 如需进一步了解如何在 Code Engine 中使用密钥,请参阅 “使用密钥”。
若要通过 CLI 添加对 IBM Cloud Container Registry 或 Docker Hub 的访问权限,请使用 secret create --format registry 命令。 该命令需要注册表密钥的名称、注册表服务器的 URL,以及访问注册表服务器所需的用户名和密码信息,同时还支持其他可选参数。 有关选项的完整列表,请参阅 ibmcloud ce secret create 命令。
例如,以下命令将创建对 us.icr.io 注册表服务器上名为 myregistry 的 IBM Cloud Container Registry 实例的注册表访问权:
ibmcloud ce secret create --format registry --name myregistry --server us.icr.io --username iamapikey --password API_KEY
示例输出
Creating registry secret 'myregistry'...
OK
下表概述了此示例中与 secret create --format registry 命令配合使用的选项。 有关该命令及其选项的更多信息,请参阅 ibmcloud ce secret create 命令。
| 选项 | 描述 |
|---|---|
--name |
注册表私钥的名称。 请使用项目中唯一的名称。 此值是必需的。 -名称必须以小写字母数字字符开头和结尾。 -名称必须小于或等于 253 个字符,并且可以包含小写字母,数字,句点 (.) 和连字符 (-)。 |
--server |
输入注册表服务器的 URL。 对于 Container Registry,服务器名称为 <region>.icr.io。 例如,us.icr.io。 对于 Docker Hub,该值为 https://index.docker.io/v1/。 |
--username |
请输入用户名以访问注册表服务器。 对于 Container Registry,它是 iamapikey。 对于 Docker Hub,它是您的 Docker 标识。 |
--password |
输入密码。 对于 Container Registry,密码是 API 密钥。 对于 Docker Hub,可以使用 Docker Hub 密码或 访问令牌。 |
控制对 Code Engine 工作负载的 Container Registry 的访问
假设您希望在 Code Engine 拉取映像时控制对 IBM Cloud Container Registry 的访问。 例如,您希望控制对特定 IP 地址的 Container Registry 的访问权。 请考虑以下方法。
-
使用 基于上下文的限制。 通过使用基于上下文的限制,如果 Code Engine 项目的 IP 地址发生更改,那么您无需更改访问权。 您可以将对 Container Registry 的访问权限制为网络区域,其中您的网络区域包含 Code Engine 以及需要访问注册表的任何内容。
-
禁用对 IBM Cloud Container Registry 的公共访问权,并确保 Code Engine 使用专用端点而不是公共端点。 请参阅 保护与 Container Registry的连接。
-
要控制特定 IP 范围的访问,请使用 API 端点来访存特定 Code Engine 项目的 IP 地址。 需要注意的是,这些 IP 地址可能会发生更改,发生这种情况时必须采取相应的步骤。 请参阅 Code Engine 公共和专用 IP 地址 和 如何将 Code Engine 应用程序添加到允许列表?
注册表中映像的注意事项
用于应用程序或作业的映像的名称必须为下列其中一种格式。
REGISTRY/NAMESPACEorDOCKERUSERorDOCKERORG/REPOSITORY:TAG,其中REGISTRY和TAG是可选的。 如果未指定REGISTRY,则默认值为docker.io。 如果未指定TAG,请勿包含冒号 (:)。TAG的缺省值为latest。REGISTRY/NAMESPACEorDOCKERUSERorDOCKERORG/REPOSITORY@IMAGEID,其中REGISTRY是可选的。 如果未指定REGISTRY,那么缺省值为docker.io和ibm作为 Docker 组织。
| 组件 | 允许的字符 | 长度 | 附加规则 |
|---|---|---|---|
REGISTRY |
a-zA-Z0-9 -_. --__ |
1-253 | (0-127Periods)(label:1-63,noDashOnEnd) |
NAMESPACE |
a-z 0-9 -_ --__ |
4-30 | (start/end with letterOrNumber) |
DOCKERUSERorDOCKERORG |
a-z 0-9 |
4-30 | |
REPOSITORY |
a-z 0-9 -_. / |
2-255 | (start/end with letterOrNumber) |
TAG |
a-zA-Z0-9 -_. --__.. |
0-128 | (NOT start with periodOrDash) |
IMAGEID |
a-z 0-9 : |
(startwith sha256: noOtherColon) |
映像名称的部分必须满足以下条件。
REGISTRY不得超过 253 个字符,并且可以包含小写或大写字母,数字,句点 (.),连字符 (-) 和下划线 (_)。请勿使用短划线 (.) 作为最后一个字符。 请勿使用超过 127 个句点 (.),它们之间的标签长度可以在 1 到 63 个字符之间。NAMESPACE必须介于 4 到 30 个字符之间,并且必须以小写字母或数字开头和结尾。NAMESPACE可以包含小写字母数字字符,连字符 (-) 和下划线 (_)。DOCKERUSERorDOCKERORG可用于 Docker 注册表,而不是NAMESPACE。 指定 Docker 用户名或 Docker 组织。 Docker 用户名和组织必须介于 4 到 30 个字符之间,并且仅包含小写字母数字字符或数字。REPOSITORY必须介于 2 到 255 个字符之间,并且必须以小写字母或数字开头和结尾。REPOSITORY可以包含小写字母数字字符,正斜杠 (/),句点 (.),连字符 (-) 和下划线 (_)。TAG必须介于 0 到 128 个字符之间,并且可以包含小写或大写字母,数字,句点 (.),连字符 (-) 和下划线 (_)。TAG不得以句点或短划线开头。 如果不包含TAG,那么也不包含冒号。IMAGEID以sha256:为前缀,并且可以包含小写字母和数字。