Skip to content

访问镜像仓库

仓库(Repository)是集中存放镜像的地方。注册服务器(Registry)是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。

智算云平台提供 Docker Registry 服务,为租户在每个可用区提供镜像仓库服务。

Docker Hub

由于运营商网络原因,直接从 Docker Hub(docker.io)拉取镜像时会失败。这包括:

  • 未指定 Registry 前缀的拉取命令(默认使用 docker.io
  • 显式指定 docker.ioregistry-1.docker.io 的拉取命令
language-shell
# 登录实例后执行 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

列出平台预置镜像

在开发机实例的终端中运行以下命令,可以列出该开发机实例所属可用区提供的所有平台预置镜像。

另一种方式是在镜像中心查看平台预置镜像。两种方式各有优势:

  • Shell 命令方式:在开发机实例内直接查看该可用区的平台预置镜像
  • 镜像中心 UI:可查看所有可用区的平台预置镜像和租户自定义镜像

警告

该命令仅可在开发机实例的终端中运行,不支持在其他随意的 Shell 终端中执行。列出的镜像仅为开发机实例所属可用区提供的平台预置镜像,不支持列出租户自定义镜像。

如果您不确定当前开发机实例所属可用区提供了哪些平台预置镜像,使用此命令可以快速验证和查看可用镜像列表。

language-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 镜像:

language-shell
docker pull cr.infini-ai.com/infini-ai/ubuntu:22.04-20240429

拉取平台预置的 CUDA 镜像:

language-shell
#拉取平台预置的 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 pulldocker push

如需确认凭证记录是否存在,可运行以下命令。该命令只检查平台内部 Registry 域名对应的记录,不输出配置文件中的认证内容。

language-shell
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构建当前可用区的租户镜像仓库根路径:

language-shell
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

language-shell
# 拉取 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 镜像

由于运营商网络原因,会导致您拉取 Docker Hub 镜像时下载失败。建议您在生产环境中谨慎使用依赖于 Docker Hub 的容器镜像。

无法推送镜像至租户私有镜像仓库

请检查开发机实例是否已启用「Docker 容器」功能。如未启用,可前往开发机实例详情页,通过「改配」按钮启用「Docker 容器」功能。

如果曾执行 docker logout cr.infini-ai.com 或凭证记录已丢失,请重启实例,等待平台重新写入凭证后再试。正常情况下,不需要手动运行 docker login

租户私有镜像仓库有存储空间限制。详见租户私有镜像仓库

如何处理镜像构建失败

如果镜像中心显示构建失败,可尝试以下流程:

  1. 在镜像中心查看构建日志。
  2. 如果使用 Dockerfile 构建,可尝试更换为在开发机实例中构建镜像,以获取更详细的日志。详见使用开发机实例构建镜像

如果问题持续,请联系商务或售后服务。

如何从公网推送镜像

cr.infini-ai.com 是平台内部 Registry 域名,不是公网访问入口。如需从平台外部推送镜像,请使用镜像中心提供的目标可用区 Registry 公网访问地址与登录凭证,并根据镜像中心给出的命令打标签与推送。

详见镜像仓库地址与可用区导入或跨可用区迁移镜像