要解决的问题
当本地电脑能拉取 Docker Hub 镜像,而另一台设备无法访问时,可以把需要的镜像推送到自己的仓库,再由目标设备拉取。这样可以减少反复使用 docker save、文件传输和 docker load 的操作。
本文以阿里云容器镜像服务(ACR)个人版和 node:lts-alpine3.21 为例,介绍从本地镜像到远程复用的完整流程。
方案:拉取、推送、复用
- 在能访问 Docker Hub 的设备上拉取所需镜像。
- 为本地镜像添加 ACR 仓库地址的标签。
- 登录 ACR,并推送镜像。
- 在目标设备上登录同一个仓库,拉取该镜像。
这套流程将已经获取的镜像托管到 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. 阿里云的相关准备
-
注册或登录阿里云账号,并完成个人认证;
-
进入右上角“控制台”,鼠标移动到左上角,滑出产品与服务,输入“容器镜像”,点击“容器镜像服务 ACR”,进入容器镜像服务控制台;
-
在“实例列表”,点击“个人版实例”,在弹出的提示面板中点击“创建个人版实例”;
-
选择适合目标设备访问的地域。本文示例使用华东 1(杭州);可选地域以控制台为准。阅读服务协议和使用限制后创建实例;
-
在“访问凭据”中设置镜像仓库登录密码,按照控制台提示满足密码要求。后续
docker login使用此凭据; -
设置完密码,会进入到镜像仓库页面,在创建仓库之前,我们先搞清楚一些概念和最佳实践:
🧱 命名空间(Namespace)与仓库(Repository)结构说明
在阿里云 ACR 中,镜像的地址遵循标准的 Docker 镜像命名结构:
[registry-domain]/[namespace]/[repository]:[tag]例如:
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
-
-
建议保持仓库粒度合理:一个仓库只管理一类镜像的多个版本,有助于权限管理、版本清晰。
-
仓库数量和容量以当前实例配额为准;
-
-
在创建仓库前,先设置访问凭据,点击“访问凭据”菜单,刚刚
Registry设置的密码就是固定密码,在登录实例中可以看到具体的设置命令,其中--username就是你的用户名,也就是阿里云账号的名称。
docker login --username=[aliyun-account-name] crpi-example.cn-hangzhou.personal.cr.aliyuncs.com-
创建命名空间,例如
my-team-one。如果名称不可用,按控制台提示更换名称; -
选择“镜像仓库”,点击“创建镜像仓库”,选择刚刚创建的命名空间,仓库名称输入
node,仓库类型选择“私有”,摘要填写镜像用途,点击下一步; -
在代码源,选择
本地仓库,意味着,我们使用本地已构建的镜像,然后点击“创建镜像仓库”; -
在仓库“基本信息”的操作指南中查看登录、推送和拉取命令。地址分为公网和专有网络(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. 本地镜像准备
-
找一台能够访问
docker hub的设备,比如你的个人电脑,或者你的海外VPS,或者目前有可用的镜像源; -
以 Docker Hub 官方
node镜像为例,拉取所需标签到本地;跨架构使用时,应按前文说明选择目标平台;
docker pull node:lts-alpine3.21- 查看本地镜像,确保拉取成功,目前的
tag是lts-alpine3.21,Image ID是a937d3ed32b0,以你本地显示的为准;
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node lts-alpine3.21 a937d3ed32b0 2 days ago 159MB- 当本地有这个镜像后,需要给现有的镜像打标签(重命名),用于上传至阿里云的
Registry;
说明:
-
该操作不会复制镜像数据,只是给它创建了一个新的
reference; -
用到如下的命令:
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]其中:
-
SOURCE_IMAGE[:TAG]可以使用本地的Image ID; -
TARGET_IMAGE[:TAG]是由多个组件构成用于描述了镜像的存储位置及其身份的地址,格式如下;
[registry/][namespace/]name[:tag]-
其中
registry是镜像仓库地址,默认是docker.io(即 Docker Hub); -
namespace是命名空间,默认是library,在阿里云容器镜像服务中对应刚刚创建的命名空间; -
name是必填的镜像名称,本例使用node,对应刚刚创建的仓库名称; -
tag是镜像标签,默认是latest,在阿里云镜像服务中,你需要定义的版本号;
最终本地需要执行的命令:
# 注意:命令不要 [],[] 只是说明需要替换的内容
# [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,前者是本地镜像,后者是阿里云的镜像仓库地址。
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. 上传镜像至阿里云
- 登录阿里云 Container Registry;
# 注意:命令不要 [],[] 只是说明需要替换的内容
# [aliyun-account-name] 替换为阿里云账号名称
# [aliyun-registry-url] 替换为阿里云的镜像仓库地址
# 具体信息,仓库基本信息-操作指南中有详细说明
docker login --username=[aliyun-account-name] [aliyun-registry-url]-
输入刚刚设置的
Registry登录密码,登录成功后,会提示Login Succeeded; -
上传镜像至阿里云;
# 注意:命令不要 [],[] 只是说明需要替换的内容
# [aliyun-registry-url] 替换为阿里云的镜像仓库地址
# [your-namespace] 替换为刚刚创建的命名空间
# [node] 替换为刚刚创建的仓库名称
# [lts-alpine3.21] 替换为你需要定义的标签
docker push [aliyun-registry-url]/[your-namespace]/[node]:[lts-alpine3.21]- 执行成功后,会提示如下类似的信息。
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- 查看阿里云的镜像仓库,在“镜像仓库”-->“镜像版本”,可以看到刚刚上传的镜像信息;
4. 其他设备的使用
- 在没有能力访问
docker hub的设备执行,先登录到阿里云的Container Registry:
docker login --username=[aliyun-account-name] crpi-example.cn-hangzhou.personal.cr.aliyuncs.com登录成功显示Login Succeeded;
- 拉取镜像:
docker pull crpi-example.cn-hangzhou.personal.cr.aliyuncs.com/my-team-one/node:lts-alpine3.21lts-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- 拉取成功后,先在目标设备验证镜像的平台与运行行为,再用于开发测试;
其他选择
如果主要需求是直接拉取公共镜像,也可以评估镜像加速服务,例如轩辕镜像。这类服务的镜像覆盖范围、费用、流量配额和可用性需要分别核对,不能视为自有仓库的等价替代。
需要托管镜像时,可以比较以下服务的实例规格、访问控制、网络连通性和服务保障:
- 阿里云容器镜像服务(ACR);
- 腾讯云容器镜像服务(TCR);
- 华为云容器镜像服务(SWR)。