Docker 镜像离线迁移方案(仓库已删除,本地镜像保留迁移)
一、背景
日常运维经常遇到一个尴尬场景:镜像仓库已经删除、下架、无法重新 pull,但本地服务器还保留着可用的 Docker 镜像。想要备份、换机、迁移环境,只能走离线打包迁移。
二、核心原理(必看避坑)
Docker 离线迁移只有一组靠谱命令:docker save 导出、docker load 导入。
千万不要用 docker export / import!
save/load:针对镜像,完整保留 TAG、ENTRYPOINT、环境变量、分层信息,迁移后可直接 run 启动,100% 还原原镜像
export/import:针对容器,会丢失启动配置、元数据,迁移后大概率无法正常启动
三、源机器打包镜像
1. 查看本地镜像
先确认需要迁移的镜像名和标签:
docker images示例镜像:nezha/dashboard:v1
2. 导出镜像为 tar 包
# 单镜像导出标准写法
docker save -o 自定义名称.tar 镜像名:标签
# 实战示例
docker save -o nezha-v1.tar nezha/dashboard:v13. 大镜像推荐压缩(大幅减小传输体积)
gzip nezha-v1.tar压缩后得到nezha-v1.tar.gz,传输速度更快、节省磁盘流量。
四、scp 传输到另一台机器
我习惯直接 scp 跨机传输,不用 U 盘中转,内网秒传。
# 传输压缩包到目标机器 /opt 目录
scp nezha-v1.tar.gz root@目标机器IP:/opt/如果目标机器 SSH 不是默认 22 端口,加大写 P 参数:
scp -P 端口号 nezha-v1.tar.gz root@目标机器IP:/opt/五、目标机器导入镜像
1. 压缩包一键解压+导入(推荐,不用单独解压文件)
gunzip -c /opt/nezha-v1.tar.gz | docker load2. 未压缩 tar 包直接导入
docker load -i /opt/nezha-v1.tar3. 验证导入成功
docker images | grep nezha能看到和原机器一模一样的镜像名、TAG,就是迁移成功,可直接 docker run 启动业务。
六、进阶技巧
1. 多条镜像一次性打包
docker save -o all-images.tar 镜像1:tag 镜像2:tag 镜像3:tag2. 无落地文件、一键跨机迁移(省磁盘空间)
docker save nezha/dashboard:v1 | gzip | ssh root@目标IP 'gunzip | docker load'全程不生成临时文件,适合磁盘空间紧张的服务器。
七、总结
仓库删除不影响本地镜像,只要本地镜像还在,就能 save 打包迁移
离线迁移只用 save/load,坚决不用 export/import
大镜像务必 gzip 压缩,节省流量和传输时间
整套流程适配所有 Ubuntu 版本,通用无兼容问题
迁移后镜像参数完全保留,无需重新配置、重新拉取
License:
CC BY 4.0