访问容器注册表
IBM Cloud® Code Engine 使用的图像通常存储在一个注册表中,该注册表既可以供公众访问(公共注册表),也可以为一小部分用户设置有限的访问权限(私人注册表)。
容器注册表或注册表是存储容器映像的服务。 例如,IBM Cloud Container Registry 和 Docker Hub 是容器注册表。 容器注册表可以是公用或专用的。 公共容器注册表不需要凭证即可访问。 相反,访问专用注册表需要凭证。
Code Engine 需要访问容器注册表以完成以下操作:
- 检索 (或 "拉取") 容器映像以运行应用程序或作业
- 将新创建的容器映像存储为映像构建的输出
- 从本地源运行构建时存储和检索本地文件
Code Engine 处理系统与注册表之间交互的许多底层详细信息。
要从注册表中拉取映像,Code Engine 使用称为 imagePullSecret
的特殊类型的 Kubernetes 私钥。 此映像拉取私钥存储了用于访问容器注册表的凭证。 使用 Code Engine 添加对容器注册表的访问权以拉取映像时,您将创建映像拉取私钥。 有关映像拉取私钥的更多信息,请参阅 Kubernetes 文档。
映像注册表的类型
映像通常存储在可由公共(公共注册表)访问的注册表中,或者存储在针对一小组用户设置有限访问权(专用注册表)的注册表中。
公共注册表 (例如公共 Docker Hub) 可用于开始使用 Docker 和 Code Engine 来创建第一个应用程序或作业。 但在涉及企业工作负载时,请使用专用注册表,如 IBM Cloud Container Registry 中提供的注册表,以保护您的镜像不被未经授权的用户使用。 对于专用注册表,请使用注册表私钥来确保凭证可用于访问专用注册表。
注册表 | 描述 |
---|---|
IBM Cloud Container Registry | 通过此类型的注册表,您可以在 IBM Cloud Container Registry 中设置自己的安全映像存储库,您可以在用户之间安全地存储和共享映像。 通过 IBM Cloud Container Registry,您可以 -管理对帐户中映像的访问权。 -使用 IBM 提供的映像和样本应用程序 (例如 IBM Liberty) 作为基本映像,并向其添加您自己的应用程序代码。 |
其他任何专用注册表 |
通过添加访问权将任何现有专用注册表连接到 Code Engine。 添加访问权限可安全地将注册表 URL 和凭据保存在 Kubernetes 保密文件中。
|
公共 Docker Hub | 在您的Code Engine应用程序或工作中,使用此类注册表可直接从DockerHub 提取现有的公共映像。
重要:
使用公共DockerHub,你可以: |
注册表私钥的类型
要访问注册表中的映像,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 不同,您可能希望为服务 ID 创建一个 API 密钥,该服务 ID 的 IBM Cloud IAM 服务访问策略为 IBM Cloud Container Registry。 如果选择对用户标识进行认证,请确保该用户是功能标识或计划用户离开的情况,以便 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 密钥,请 将其另存为注册表访问权。
访问其他帐户中的映像
您可以为用户或服务 ID 分配 IBM Cloud IAM 访问策略,以限制特定注册表映像命名空间或操作(如推送或拉取)的权限。 然后,创建 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:
为前缀,并且可以包含小写字母和数字。