不用镜像仓库,如何在两台主机之间复制 Docker 镜像?
用 docker save 把镜像导出为 tar 文件,scp/rsync 传到目标机后 docker load 导入,全程无需镜像仓库。本文给出命令与批量迁移技巧。
做法:源主机用 docker save -o 镜像.tar 镜像名 把镜像导出成 tar 包;用 scp/rsync/U盘 把 tar 拷到目标主机;目标主机用 docker load -i 镜像.tar 导入。适合内网隔离环境、临时迁移或不想搭私有仓库的场景。
三步操作
1. 源主机导出
docker save -o myapp_v1.2.tar myapp:1.2
2. 传输到目标主机
scp myapp_v1.2.tar user@target-host:/tmp/
3. 目标主机导入
docker load -i /tmp/myapp_v1.2.tar
docker images | grep myapp # 验证
导入后镜像名与标签保持原样。
进阶技巧
一次导出多个镜像:
docker save -o bundle.tar myapp:1.2 nginx:1.25 redis:7
压缩传输(镜像大时显著省时):
docker save myapp:1.2 | gzip | ssh user@target 'gunzip | docker load'
一条管道完成导出、压缩、传输、导入,不落中间文件。现代 docker load 也支持直接读取受支持的压缩归档,应核对目标版本。
注意事项
- save/load 传输选定镜像的层和相关标签,不包含已有容器可写层的改动,也不搬迁卷数据及运行配置;与之相对,
export/import针对的是容器文件系统快照,会丢失历史与元数据,迁镜像要用前者。 - 现代 save 可保存本地镜像存储中存在的多个平台变体,支持的版本可用 --platform 选择;不会自动补齐本地缺失的平台。目标主机还需支持相应架构或仿真。
- 长期、多机分发还是建议搭私有仓库(如 Harbor),save/load 适合应急与小规模。
常见问题(FAQ)
Q:docker load 后镜像名变成
A:导出时用了镜像 ID 而非 名称:标签,或导出前标签就没打好。重新打标签:docker tag <id> myapp:1.2。
Q:tar 文件能校验完整性吗?
A:传输后用 sha256sum(macOS 可用 shasum -a 256)对比摘要;摘要一致只证明内容一致,不证明来源可信。load 报错不能替代校验。镜像层也可能包含构建时写入的密钥。
Q:load 进来的镜像层会被共享去重吗?
A:会。与本地已有镜像共享相同的层,存储按层去重,不重复占空间。