文章

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:v1

3. 大镜像推荐压缩(大幅减小传输体积)

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 load

2. 未压缩 tar 包直接导入

docker load -i /opt/nezha-v1.tar

3. 验证导入成功

docker images | grep nezha

能看到和原机器一模一样的镜像名、TAG,就是迁移成功,可直接 docker run 启动业务。

六、进阶技巧

1. 多条镜像一次性打包

docker save -o all-images.tar 镜像1:tag 镜像2:tag 镜像3:tag

2. 无落地文件、一键跨机迁移(省磁盘空间)

docker save nezha/dashboard:v1 | gzip | ssh root@目标IP 'gunzip | docker load'

全程不生成临时文件,适合磁盘空间紧张的服务器。

七、总结

  1. 仓库删除不影响本地镜像,只要本地镜像还在,就能 save 打包迁移

  2. 离线迁移只用 save/load,坚决不用 export/import

  3. 大镜像务必 gzip 压缩,节省流量和传输时间

  4. 整套流程适配所有 Ubuntu 版本,通用无兼容问题

  5. 迁移后镜像参数完全保留,无需重新配置、重新拉取

License:  CC BY 4.0