访问镜像仓库
仓库(Repository)是集中存放镜像的地方。注册服务器(Registry)是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。
智算云平台提供 Docker Registry 服务,为租户在每个可用区提供镜像仓库服务。
Docker Hub
开发机实例无法直接访问 Docker Hub。本节说明直接拉取失败时的表现,以及从平台镜像中心或租户 Registry 获取所需镜像的替代路径。
直接拉取 Docker Hub 镜像的限制
由于运营商网络原因,直接从 Docker Hub(docker.io)拉取镜像时会失败。这包括:
- 未指定 Registry 前缀的拉取命令(默认使用
docker.io) - 显式指定
docker.io或registry-1.docker.io的拉取命令
# 登录实例后执行 pull
# 先检查本地是否存在指定的镜像 不存在就从 docker.io 下载
root@is-daieztsmaipd2smo-devmachine-0:~# docker pull ubuntu:22.04
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)建议您在生产环境中谨慎使用 Docker Hub 容器镜像。可改为从智算云平台的镜像中心拉取预置镜像,或拉取租户私有仓库中的自定义镜像。
提示
智算云平台不提供官方加速服务。您可以自行使用第三方镜像加速服务。Docker 容器服务支持修改配置,详见 Dockerctl。
在可访问 Docker Hub 的本地设备上用 regctl 将镜像中转至目标可用区 Registry
请在一台能够正常访问 Docker Hub 和目标可用区 Registry 公网地址的本地设备上运行 regctl,将远程镜像经由该设备复制到租户目标可用区的 Registry。复制完成后,目标可用区内的 AIStudio 开发机和任务可通过平台内部 Registry 拉取镜像。
镜像数据路径如下:
regctl 可以直接读写远程 Registry。本地设备不需要安装 Docker Engine 或 Docker Desktop,也不需要配置 Docker Daemon 代理或镜像加速地址。
普通镜像和稳定链路先使用默认复制命令;已知存在单个大层或链路容易超时时,再按需配置完整上传阈值和分块大小。完整选择和操作步骤参见使用 regctl 将远程镜像复制到目标可用区 Registry。
重要
需要代理时,让 Docker Hub 走代理、目标 Registry 直连
regctl 会在运行设备中从 Docker Hub 读取镜像层,再上传到目标可用区 Registry。如果访问 Docker Hub 需要代理,而目标 Registry 不应走代理,请确认 Docker Hub 及其镜像层下载域名走代理,目标 Registry 公网主机名走直连。支持规则分流的 VPN 或 TUN 可以自动完成分流;使用 Shell 代理变量时,请设置 HTTP_PROXY 和 HTTPS_PROXY,并将目标 Registry 公网主机名追加到 NO_PROXY。NO_PROXY 中不要包含 https:// 或路径。
开始前,请完成以下准备:
确认本地设备可以同时访问 Docker Hub 和目标可用区 Registry 公网访问地址。
在本地设备安装 regctl。
在镜像中心选择镜像实际要使用的目标可用区,获取该可用区的 Registry 公网访问地址、用户名和密码。租户 ID 是目标镜像地址中的命名空间。
使用 regctl 登录目标 Registry。以下为宁夏 B Registry 公网访问地址的示例:
language-shellexport REGISTRY="ningxia-b.cr.infini-ai.com" export REGISTRY_USERNAME="<镜像中心提供的用户名>" read -rsp 'Registry password: ' REGISTRY_PASSWORD printf '%s' "$REGISTRY_PASSWORD" | regctl registry login "$REGISTRY" \ --user "$REGISTRY_USERNAME" \ --pass-stdin unset REGISTRY_PASSWORD
以下命令将两个 RLinf Docker Hub 镜像复制到示例租户在宁夏 B 可用区的 Registry:
regctl image copy \
--platform linux/amd64 \
docker.io/rlinf/rlinf:agentic-rlinf0.4-embodichain \
ningxia-b.cr.infini-ai.com/te-b905754427352261/rlinf:agentic-rlinf0.4-embodichainregctl image copy \
--platform linux/amd64 \
docker.io/rlinf/rlinf:agentic-rlinf0.4-torch2.11.0-sglang0.5.12.post1-vllm0.23.0-megatron0.17.0-te2.17 \
ningxia-b.cr.infini-ai.com/te-b905754427352261/rlinf:agentic-rlinf0.4-torch2.11.0-sglang0.5.12.post1-vllm0.23.0-megatron0.17.0-te2.17复用以下形式复制其他 RLinf 镜像。运行前,将 <tag> 和 <tenant-id> 替换为实际值;如果目标不是宁夏 B,可同时替换为镜像中心显示的目标可用区 Registry 公网访问地址。
regctl image copy \
--platform linux/amd64 \
"docker.io/rlinf/rlinf:<tag>" \
"ningxia-b.cr.infini-ai.com/<tenant-id>/rlinf:<tag>"普通镜像和稳定链路无需预先修改上传策略。已知镜像包含数百 MiB 至数 GiB 的单个层、链路容易超时,或完整上传已经反复失败时,再按为单个大镜像层启用分块上传配置 --blob-max 和 --blob-chunk。已知风险场景可以主动配置,不必故意等待一次失败。
重要
区分公网导入地址和平台内部地址
ningxia-b.cr.infini-ai.com 是本例从本地设备访问宁夏 B Registry 的公网地址。复制完成后,请在镜像中心确认镜像所在可用区与目标开发机或任务一致,并在 AIStudio 开发机或任务中使用平台内部地址 cr.infini-ai.com/<tenant-id>/rlinf:<tag>。不要在本地导入命令中使用平台内部地址,也不要根据地址字符串推断镜像所在可用区。
注意
复制后验证目标摘要和运行结果
以上两个 Docker Hub 镜像为公开镜像,通常可以匿名读取。如果源镜像需要认证或遇到匿名拉取限额,请先登录 Docker Hub。regctl 复制时,镜像数据仍会经过本地设备,因此复制速度受本地下载带宽和上传到目标 Registry 的带宽影响。
复制命令退出码为 0 仍不是运行兼容性证明。复制完成后,还应比较源端与目标端同一平台的摘要,并在目标可用区创建测试实例验证拉取和运行。完整的认证、摘要校验、多架构镜像和失败处理方法,参见使用 regctl 将远程镜像复制到目标可用区 Registry。
列出平台预置镜像
在开发机实例的终端中运行以下命令,可以列出该开发机实例所属可用区提供的所有平台预置镜像。
另一种方式是在镜像中心查看平台预置镜像。两种方式各有优势:
- Shell 命令方式:在开发机实例内直接查看该可用区的平台预置镜像
- 镜像中心 UI:可查看所有可用区的平台预置镜像和租户自定义镜像
重要
该命令仅可在开发机实例的终端中运行,不支持在其他随意的 Shell 终端中执行。列出的镜像仅为开发机实例所属可用区提供的平台预置镜像,不支持列出租户自定义镜像。
如果您不确定当前开发机实例所属可用区提供了哪些平台预置镜像,使用此命令可以快速验证和查看可用镜像列表。
# 1. Setup Colors & Auth
C_GREEN="\033[1;32m"
C_CYAN="\033[1;36m"
C_MAGENTA="\033[1;35m"
C_RESET="\033[0m"
export PROJECTS="infini-ai infini-maas"
read REGISTRY AUTH <<< $(jq -r '.auths | to_entries | first | "\(.key) \(.value.auth)"' "$DOCKER_CONFIG/config.json")
# 2. Loop through each Project
for PROJ in $PROJECTS; do
# Pick a distinct color based on project name
if [[ "$PROJ" == "infini-ai" ]]; then
P_COLOR=$C_CYAN
else
P_COLOR=$C_MAGENTA
fi
echo -e "\n\n${P_COLOR}####################################################${C_RESET}"
echo -e "${P_COLOR} SCANNING PROJECT: $PROJ ${C_RESET}"
echo -e "${P_COLOR}####################################################${C_RESET}"
# 3. Loop through Pages 1 to 10
for PAGE in {1..10}; do
# Fetch Repos
REPOS=$(curl -s -H "Authorization: Basic $AUTH" \
"https://$REGISTRY/api/v2.0/projects/$PROJ/repositories?page_size=100&page=$PAGE" \
| jq -r '.[] | .name? // empty')
# Stop if page is empty
if [[ -z "$REPOS" ]]; then
break
fi
# 4. Process Images
echo "$REPOS" | while read repo; do
echo -e "\n--------------------------------"
# Print Full Image URL (Registry + Repo)
echo -e "IMAGE: ${C_GREEN}$REGISTRY/$repo${C_RESET}"
# Fetch tags -> Sort
curl -s -H "Authorization: Basic $AUTH" \
"https://$REGISTRY/v2/$repo/tags/list" \
| jq -r '.tags[]? // "No tags found"' \
| sort -V
done
done
done拉取平台预置镜像
在通过列出平台预置镜像命令或镜像中心查看可用镜像后,您可以获取镜像地址,使用 docker pull 拉取所需的平台预置镜像。
注意
本文中的平台预置镜像地址是示例。使用前,请在镜像中心或当前实例的预置镜像列表中确认当前可用区提供了对应仓库及 tag;如果列表中不存在,请改用页面显示的可用镜像地址。替换 Registry 域名并不能保证相同仓库或 tag 在其他环境或可用区中存在。
例如,拉取平台预置的 Ubuntu 镜像:
docker pull cr.infini-ai.com/infini-ai/ubuntu:22.04-20240429拉取平台预置的 CUDA 镜像:
#拉取平台预置的 CUDA 镜像
docker pull cr.infini-ai.com/infini-ai/cuda:12.2.2-cudnn8-devel-ubuntu20.04下一步可参考启动容器使用该镜像运行容器。
注意
- 由于运营商网络限制,会导致您拉取 Docker Hub 镜像时下载失败。您可以自行使用第三方镜像加速服务。
- 您可以自行修改 Docker 配置,详见 Dockerctl。
租户私有镜像仓库
平台提供租户私有镜像仓库服务。
- 私有镜像仓库服务可用于存放租户的自定义镜像,供开发机实例、任务、推理服务等平台服务使用。
- 购买包年包月计算资源、按量计费计算资源的租户,均可获得私有镜像仓库服务和免费存储空间。
- 租户可在多个可用区获得私有镜像仓库服务,可用区之间镜像仓库存储、网络相互独立。
- 平台镜像服务以租户 ID 为 Docker Registry 上的命名空间,构建租户镜像仓库根路径。
重要
cr.infini-ai.com 是平台内部 Registry 域名,各可用区的平台实例都使用这个相同的域名,但访问的是各自可用区中独立的 Registry。从可用区 A 的平台实例访问时,该域名连接到可用区 A 的 Registry;从可用区 B 的平台实例访问时,同一域名连接到可用区 B 的 Registry。
因此,即使完整镜像地址和 tag 相同,不同可用区中的镜像也相互独立,不会自动同步,并且可能对应不同的镜像摘要。完整镜像地址不会显示实际访问的是哪个可用区;请在镜像中心的自定义镜像列表中查看 可用区 列。
地址选择、登录方式、凭证范围和跨可用区迁移方法,参见镜像仓库地址与可用区。
登录租户私有镜像仓库
登录租户私有镜像仓库,指通过平台内部 Registry 域名访问当前实例所在可用区的 Registry。请先确认开发机实例已开启 Docker 容器 功能,再按照本页显示的登录方式操作。
直接使用平台预置凭证
通过已开启 Docker 容器 功能的开发机实例访问当前可用区 Registry 时,平台已为 Docker CLI 配置登录凭证。正常情况下,无需手动运行 docker login,可直接执行 docker pull 或 docker push。
如需确认凭证记录是否存在,可运行以下命令。该命令只检查平台内部 Registry 域名对应的记录,不输出配置文件中的认证内容。
DOCKER_CONFIG_FILE="${DOCKER_CONFIG:-/tmp/docker-config}/config.json"
jq -e --arg registry "cr.infini-ai.com" '
(.auths // {}) as $auths
| ($auths | has($registry))
or ($auths | has("https://" + $registry))
or ($auths | has("http://" + $registry))
' "$DOCKER_CONFIG_FILE" >/dev/null \
&& echo "Registry credential ready"如果已经执行过 docker logout cr.infini-ai.com,请重启开发机实例。重启后,平台会重新写入 Registry 凭证,无需手动运行 docker login。该凭证只适用于当前实例所在可用区,不表示已经登录其他可用区。
获取租户镜像仓库根路径
完成本页对应的登录操作后,使用租户 ID构建当前可用区的租户镜像仓库根路径:
export TENANT_ID="te-xxxxxxxxxxxxxxxx"
export CURRENT_ZONE_REPO_ROOT="cr.infini-ai.com/$TENANT_ID"
echo "$CURRENT_ZONE_REPO_ROOT"如果只需要检查远程镜像、添加 tag 或在 Registry 之间传输镜像,也可以让 crane 复用 Docker 兼容的当前可用区凭证,不需要先把镜像拉取到本地 Docker 镜像存储。
推送至租户私有镜像仓库
通过已开启 Docker 容器 功能的开发机实例,可将镜像推送至当前实例所在可用区的租户私有镜像仓库,作为自定义镜像。
镜像来源可以为:
- 开发机实例内构建的镜像(
docker build/docker commit) - 开发机实例内拉取的镜像(
docker pull) - 开发机实例内导入的镜像(
docker save/docker load)
警告
以下命令会把镜像写入当前实例所在可用区的 Registry。如果目标是其他可用区,请不要使用平台内部 Registry 域名;请改用镜像中心提供的目标可用区 Registry 公网访问地址和登录凭证。
推送前,请先按照登录租户私有镜像仓库完成当前可用区 Registry 的登录准备,并设置 CURRENT_ZONE_REPO_ROOT。
# 拉取 quay.io 的镜像作为示例
docker pull quay.io/coreos/etcd:v3.5.5
# 修改镜像标签:使用当前可用区租户镜像仓库根路径 + 仓库名(Repository)
docker tag quay.io/coreos/etcd:v3.5.5 $CURRENT_ZONE_REPO_ROOT/etcd:v3.5.5
# 推送镜像至命名空间(Namespace)
docker push $CURRENT_ZONE_REPO_ROOT/etcd:v3.5.5操作演示
终端录制
推送镜像到租户私有仓库
适用于把实例内镜像发布到当前实例所在可用区的租户私有镜像仓库。
注意
- 如果您有镜像 tar 包,可上传至开发机实例后使用
docker load加载镜像,再推送到租户镜像仓库。详见导入镜像 Tar 包。 - 从平台外部推送镜像或跨可用区迁移镜像时,必须使用镜像中心提供的目标可用区 Registry 公网访问地址。详见导入或跨可用区迁移镜像。
常见问题
无法拉取 Docker Hub 镜像
由于运营商网络原因,会导致您在 AIStudio 开发机内拉取 Docker Hub 镜像时下载失败。建议您确认当前网络环境。如果处于受限网络环境,谨慎使用依赖于 Docker Hub 的容器镜像。
受限环境下,优先使用当前可用区的平台预置镜像或租户自定义镜像;如必须使用 Docker Hub 镜像,可在能够同时访问 Docker Hub 和目标可用区 Registry 的本地设备上使用 regctl 复制镜像,或为当前实例配置可信且经过验证的代理或 Registry 镜像站。不同导入方式及其适用条件详见选择导入方式。
无法推送镜像至租户私有镜像仓库
如果您在 AIStudio 开发机内执行 docker push,向当前实例所在可用区的租户私有镜像仓库推送镜像时失败,请先确认实例已启用「Docker 容器」功能,并检查Docker 服务状态、当前可用区 Registry 的地址和登录方式,以及剩余存储配额。
若本地设备已有该镜像,可改用目标可用区 Registry 公网地址从本地推送;若公网地址不可达,可将镜像 .tar 包传到目标可用区已启用「Docker 容器」功能的实例中,按导入镜像 Tar 包加载后,再通过平台内部 Registry 推送。完整的方法选择见导入或跨可用区迁移镜像。
如何处理镜像构建失败
如果您在镜像中心发起镜像构建后看到「构建失败」状态,请先查看镜像构建日志,并按照常见故障排查定位问题;镜像中心单次构建最长 1 小时,超时后会直接失败。
构建依赖较慢的外部下载、需要 COPY 本地文件或 BuildKit、需要反复调试,或可能超过时限时,请改在AIStudio 开发机或本地设备中构建;在本地设备构建完成后,按照选择导入方式将镜像导入目标可用区 Registry。
如何从公网推送镜像
如果您在本地设备或其他平台外部环境中向目标可用区 Registry 推送镜像,请使用镜像中心提供的目标可用区 Registry 公网访问地址、登录凭证和完整命令;cr.infini-ai.com 是平台内部 Registry 域名,不是公网访问入口。详见镜像仓库地址与可用区和通过命令行推送镜像。
若镜像仍位于其他远程 Registry,可在本地设备上使用 regctl 直接复制;若本地网络无法访问目标 Registry 公网地址,可将镜像保存为 .tar 包并传到目标可用区实例,按导入镜像 Tar 包加载后,再通过平台内部 Registry 推送。