最高效的方式是用docker save一次性导出全部镜像:docker save $(docker images -q) -o all-images.tar,支持id或repo:tag输入,推荐用镜像id避免tag冲突,导出含所有层、标签及历史,再压缩传输并docker load批量恢复。

直接导出整个镜像仓库数据,本质是把本地所有镜像打包迁移,而不是逐个 save。最高效的方式不是“一个一个 save”,而是批量导出 + 集中传输 + 批量加载,同时兼顾元数据完整性和执行效率。
用 docker save 一次性导出全部镜像
docker save 支持同时指定多个镜像,也能结合 docker images -q 获取全部镜像 ID,避免手动罗列:
# 导出本机所有镜像(含所有标签、所有层、完整历史)
docker save $(docker images -q) -o all-images.tar
# 或更稳妥写法(排除 dangling 镜像,只导出有标签的)
docker save $(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v '<none>') -o all-images.tar</none>
⚠️ 注意:
docker images -q返回的是镜像 ID,docker save接收 ID 或 repo:tag 都可以;但用 ID 更可靠,避免 tag 冲突或重复。
传输前做轻量验证与压缩
- 检查 tar 文件是否可读:
tar -tf all-images.tar | head -n 5
- 若文件过大(如 >2GB),建议分卷或压缩:
gzip -c all-images.tar > all-images.tar.gz # 或分卷(每卷 1GB) split -b 1G all-images.tar all-images_part_
目标机器快速加载并清理冗余
- 加载:
docker load -i all-images.tar # 或解压后加载 gunzip -c all-images.tar.gz | docker load
- 加载后验证:
docker images | wc -l # 对比源机数量 docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}" | sort > images.list
补充:如果要连镜像仓库配置一起迁移(非仅镜像)
单纯 save/load 不包含 registry 认证信息、daemon 配置、insecure-registries 设置等。如需完整“仓库环境”迁移,还需同步:
-
/etc/docker/daemon.json(含insecure-registries、data-root等) -
~/.docker/config.json(含 login 凭据,注意敏感信息脱敏) - 私有 registry 数据目录(若自建 registry,需直接复制
/var/lib/registry)
不推荐的做法
- 用
docker export替代docker save:它只导出容器文件系统,丢失镜像层、历史、多标签等关键信息,无法还原原始镜像。 - 用
rsync /var/lib/docker:路径耦合强、版本兼容风险高、可能破坏新宿主机状态,仅适合同版本同架构且停机维护场景。
整个过程不需要联网拉取,适合内网、离线、跨机房部署,核心就是“全量 save → 安全传输 → 全量 load”。











