不用镜像仓库,如何在两台主机之间复制 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'
一条管道完成导出、压缩、传输、导入,不落中间文件。
注意事项
save/load保留镜像的全部层和标签;与之相对,export/import针对的是容器文件系统快照,会丢失历史与元数据,迁镜像要用前者。- 多架构镜像(arm64/amd64)经 tar 迁移时按导出时的架构走,跨架构主机注意选择正确变体。
- 长期、多机分发还是建议搭私有仓库(如 Harbor),save/load 适合应急与小规模。
观测云对照
离线环境部署 DataKit 同样可行。 隔离网络中可用 save/load 方式分发 DataKit 镜像与所需集成镜像,完成日志与指标采集的离线部署。
常见问题(FAQ)
Q:docker load 后镜像名变成
A:导出时用了镜像 ID 而非 名称:标签,或导出前标签就没打好。重新打标签:docker tag <id> myapp:1.2。
Q:tar 文件能校验完整性吗?
A:传输后用 md5sum 对比两端哈希;docker load 本身也会对损坏的 tar 报错。
Q:load 进来的镜像层会被共享去重吗?
A:会。与本地已有镜像共享相同的层,存储按层去重,不重复占空间。