无法访问 Docker Hub?用阿里云 ACR 搭建你的私有镜像仓库

从可访问 Docker Hub 的设备拉取镜像,推送至阿里云容器镜像服务(ACR),再供其他设备复用。本文介绍个人版仓库的创建、登录、推送与拉取,并说明使用限制和镜像架构注意事项。

Docker 镜像拉取失败docker pull 无响应docker save load 教程Docker 私有镜像仓库阿里云容器镜像服务ACR 使用教程Docker Hub 替代方案国内无法访问 Docker Hub构建私有镜像仓库阿里云 ACR 教程

要解决的问题

当本地电脑能拉取 Docker Hub 镜像,而另一台设备无法访问时,可以把需要的镜像推送到自己的仓库,再由目标设备拉取。这样可以减少反复使用 docker save、文件传输和 docker load 的操作。

本文以阿里云容器镜像服务(ACR)个人版和 node:lts-alpine3.21 为例,介绍从本地镜像到远程复用的完整流程。

方案:拉取、推送、复用

  1. 在能访问 Docker Hub 的设备上拉取所需镜像。
  2. 为本地镜像添加 ACR 仓库地址的标签。
  3. 登录 ACR,并推送镜像。
  4. 在目标设备上登录同一个仓库,拉取该镜像。

这套流程将已经获取的镜像托管到 ACR,后续拉取不再依赖原来的镜像加速站,但仍依赖 ACR 服务和目标设备到仓库的网络连接。它不会自动同步上游更新,也不能代替首次获取镜像的渠道。

适用场景

  • 在个人开发机与测试服务器之间复用基础镜像。
  • 为开发测试环境提供明确的仓库地址和镜像版本。
  • 保存已经验证过的镜像,减少重复下载和手动文件传输。

本文使用个人版实例演示操作。阿里云官方文档明确说明:个人版仅限开发测试使用,无 SLA 承诺,不应承担生产业务的镜像分发。生产环境需另行评估企业版或其他适合的仓库服务。

前提条件与限制

  • 镜像来源:至少有一台设备能够获取需要的镜像。使用其他来源时,应确认镜像来源和版本。
  • 账号与仓库:准备符合个人版创建条件的阿里云账号,完成个人实名认证,记录仓库域名、命名空间、仓库名称和登录凭据。地域选择应依据目标设备的位置和实测连接情况。
  • 版本选择:文中的 node:lts-alpine3.21、Image ID、摘要和大小均为示例,不代表当前最新版本。标签可能被更新;需要精确固定镜像时,可参考 Docker 的按摘要拉取说明。
  • 设备架构:确认目标设备需要 linux/amd64 还是 linux/arm64。跨架构复用时,可用 docker pull --platform=linux/amd64 node:lts-alpine3.21 明确选择目标平台。普通的单平台拉取、打标签、推送流程不等于复制完整的多平台镜像;相关构建方式见 Docker 多平台文档。
  • 个人版限制:个人版存在使用配额、共享带宽和限流。实例域名、配额及当前可用地域以控制台和官方限制说明为准。

内容更新:2026 年 10 月 4 日。以下命令输出保留原有示例,Image ID、摘要与控制台界面请以实际环境为准。

操作步骤

1. 阿里云的相关准备

  1. 注册或登录阿里云账号,并完成个人认证;

  2. 进入右上角“控制台”,鼠标移动到左上角,滑出产品与服务,输入“容器镜像”,点击“容器镜像服务 ACR”,进入容器镜像服务控制台;

  3. 在“实例列表”,点击“个人版实例”,在弹出的提示面板中点击“创建个人版实例”;

  4. 选择适合目标设备访问的地域。本文示例使用华东 1(杭州);可选地域以控制台为准。阅读服务协议和使用限制后创建实例;

  5. 在“访问凭据”中设置镜像仓库登录密码,按照控制台提示满足密码要求。后续 docker login 使用此凭据;

  6. 设置完密码,会进入到镜像仓库页面,在创建仓库之前,我们先搞清楚一些概念和最佳实践:

    🧱 命名空间(Namespace)与仓库(Repository)结构说明

    在阿里云 ACR 中,镜像的地址遵循标准的 Docker 镜像命名结构:

    Bash
    [registry-domain]/[namespace]/[repository]:[tag]

    例如:

    Bash
    crpi-example.cn-hangzhou.personal.cr.aliyuncs.com/my-team-one/node:lts-alpine3.21
    字段说明
    registry镜像仓库地址(阿里云分配的域名)
    namespace命名空间,相当于“组织名”或“所有者”
    repository镜像仓库名,建议每个仓库存放一个应用的多个版本
    tag镜像标签,表示具体的版本号,例如 latest 或 v1.0

    🗂 关于命名空间(Namespace)

    • 命名空间是仓库的逻辑分组,可以用于隔离不同项目或团队;

    • 可创建的命名空间数量以当前实例配额为准;

    • 建议根据实际场景命名,例如:

      • 公司层级:yourcorp

      • 团队层级:frontend-team

      • 项目层级:ai-service

      • 个人层级:personal-name

    📦 关于镜像仓库(Repository)

    • 一个仓库用于存放某一类镜像(如同一应用、组件或服务)的多个版本;

    • 命名方式可以是:

      • 软件名:nginx、redis、mysql

      • 业务组件名:user-service、admin-panel、event-bot

    • 建议保持仓库粒度合理:一个仓库只管理一类镜像的多个版本,有助于权限管理、版本清晰。

    • 仓库数量和容量以当前实例配额为准;

  7. 在创建仓库前,先设置访问凭据,点击“访问凭据”菜单,刚刚Registry设置的密码就是固定密码,在登录实例中可以看到具体的设置命令,其中--username就是你的用户名,也就是阿里云账号的名称。

Bash
docker login --username=[aliyun-account-name] crpi-example.cn-hangzhou.personal.cr.aliyuncs.com
  1. 创建命名空间,例如 my-team-one。如果名称不可用,按控制台提示更换名称;

  2. 选择“镜像仓库”,点击“创建镜像仓库”,选择刚刚创建的命名空间,仓库名称输入 node,仓库类型选择“私有”,摘要填写镜像用途,点击下一步;

  3. 在代码源,选择本地仓库,意味着,我们使用本地已构建的镜像,然后点击“创建镜像仓库”;

  4. 在仓库“基本信息”的操作指南中查看登录、推送和拉取命令。地址分为公网和专有网络(VPC)地址;目标设备具备相应 VPC 网络连通性时,才使用专有网络地址。以下域名中的 crpi-example 是占位示例,请替换为控制台显示的真实域名。

在阿里云配置阶段,总共得到以下需要记录的信息:

  • 阿里云账号名称;
  • 登录Registry的密码;
  • 镜像公网和专有网络地址,可能不一致,以页面显示为准:
    • 公网: crpi-example.cn-hangzhou.personal.cr.aliyuncs.com
    • 专有网络: crpi-example-vpc.cn-hangzhou.personal.cr.aliyuncs.com
  • 命名空间: my-team-one;
  • 仓库名称: node;

2. 本地镜像准备

  1. 找一台能够访问docker hub的设备,比如你的个人电脑,或者你的海外VPS,或者目前有可用的镜像源;

  2. 以 Docker Hub 官方 node 镜像为例,拉取所需标签到本地;跨架构使用时,应按前文说明选择目标平台;

Bash
docker pull node:lts-alpine3.21
  1. 查看本地镜像,确保拉取成功,目前的tag是lts-alpine3.21,Image ID是a937d3ed32b0,以你本地显示的为准;
Bash
docker images
REPOSITORY                                               TAG               IMAGE ID       CREATED         SIZE
node                                                     lts-alpine3.21    a937d3ed32b0   2 days ago      159MB
  1. 当本地有这个镜像后,需要给现有的镜像打标签(重命名),用于上传至阿里云的Registry;

说明:

  • 该操作不会复制镜像数据,只是给它创建了一个新的reference;

  • 用到如下的命令:

Bash
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

其中:

  • SOURCE_IMAGE[:TAG]可以使用本地的Image ID;

  • TARGET_IMAGE[:TAG] 是由多个组件构成用于描述了镜像的存储位置及其身份的地址,格式如下;

Bash
[registry/][namespace/]name[:tag]
  • 其中registry是镜像仓库地址,默认是docker.io(即 Docker Hub);

  • namespace是命名空间,默认是library,在阿里云容器镜像服务中对应刚刚创建的命名空间;

  • name 是必填的镜像名称,本例使用 node,对应刚刚创建的仓库名称;

  • tag是镜像标签,默认是latest,在阿里云镜像服务中,你需要定义的版本号;

最终本地需要执行的命令:

Bash
# 注意:命令不要 [],[] 只是说明需要替换的内容
# [local-image-id] 替换为本地镜像的 Image ID
# [aliyun-registry-url] 替换为阿里云的镜像仓库地址
# [your-namespace] 替换为刚刚创建的命名空间
# [node] 替换为刚刚创建的仓库名称
# [lts-alpine3.21] 替换为你需要定义的标签
 
docker tag [local-image-id] [aliyun-registry-url]/[your-namespace]/[node]:[lts-alpine3.21]

当你执行完这个命令后,执行 docker images,可以看到两个 Image ID 相同的镜像引用,但是所对应的REPOSITORY不同,一个是node,一个是crpi-example.cn-hangzhou.personal.cr.aliyuncs.com/my-team-one/node,前者是本地镜像,后者是阿里云的镜像仓库地址。

Bash
REPOSITORY                                                                    TAG               IMAGE ID       CREATED         SIZE
crpi-example.cn-hangzhou.personal.cr.aliyuncs.com/my-team-one/node                     lts-alpine3.21    a937d3ed32b0   4 days ago      159MB
node                                                                          lts-alpine3.21    a937d3ed32b0   4 days ago      159MB

至此,本地的镜像文件已经准备完毕,接下来需要上传至阿里云的Registry;

3. 上传镜像至阿里云

  1. 登录阿里云 Container Registry;
Bash
# 注意:命令不要 [],[] 只是说明需要替换的内容
# [aliyun-account-name] 替换为阿里云账号名称
# [aliyun-registry-url] 替换为阿里云的镜像仓库地址
# 具体信息,仓库基本信息-操作指南中有详细说明
 
docker login --username=[aliyun-account-name] [aliyun-registry-url]
  1. 输入刚刚设置的Registry登录密码,登录成功后,会提示Login Succeeded;

  2. 上传镜像至阿里云;

Bash
# 注意:命令不要 [],[] 只是说明需要替换的内容
# [aliyun-registry-url] 替换为阿里云的镜像仓库地址
# [your-namespace] 替换为刚刚创建的命名空间
# [node] 替换为刚刚创建的仓库名称
# [lts-alpine3.21] 替换为你需要定义的标签
 
docker push [aliyun-registry-url]/[your-namespace]/[node]:[lts-alpine3.21]
  • 执行成功后,会提示如下类似的信息。
Bash
The push refers to repository [crpi-example.cn-hangzhou.personal.cr.aliyuncs.com/my-team-one/node]
bc25a8c84974: Pushed 
625f0765efa8: Pushed 
b3c942954ba7: Pushed 
08000c18d16d: Pushed 
lts-alpine3.21: digest: sha256:cb4769335a5b3b23636053dcb5e2ad7c22de01ade9e772a40d5e77b72d659367 size: 1158
  1. 查看阿里云的镜像仓库,在“镜像仓库”-->“镜像版本”,可以看到刚刚上传的镜像信息;

4. 其他设备的使用

  • 在没有能力访问docker hub的设备执行,先登录到阿里云的Container Registry:
Bash
docker login --username=[aliyun-account-name] crpi-example.cn-hangzhou.personal.cr.aliyuncs.com

登录成功显示Login Succeeded;

  • 拉取镜像:
Bash
docker pull crpi-example.cn-hangzhou.personal.cr.aliyuncs.com/my-team-one/node:lts-alpine3.21
Bash
lts-alpine3.21: Pulling from my-team-one/node
f18232174bc9: Pull complete
5056ee185863: Pull complete
974362762896: Pull complete
18d8590713a4: Pull complete
Digest: sha256:cb4769335a5b3b23636053dcb5e2ad7c22de01ade9e772a40d5e77b72d659367
Status: Downloaded newer image for crpi-example.cn-hangzhou.personal.cr.aliyuncs.com/my-team-one/node:lts-alpine3.21
crpi-example.cn-hangzhou.personal.cr.aliyuncs.com/my-team-one/node:lts-alpine3.21
  • 拉取成功后,先在目标设备验证镜像的平台与运行行为,再用于开发测试;

其他选择

如果主要需求是直接拉取公共镜像,也可以评估镜像加速服务,例如轩辕镜像。这类服务的镜像覆盖范围、费用、流量配额和可用性需要分别核对,不能视为自有仓库的等价替代。

需要托管镜像时,可以比较以下服务的实例规格、访问控制、网络连通性和服务保障:

参考资料

暂无目录