最稳妥的Docker镜像迁移方式是使用docker save和docker load:在旧服务器批量导出镜像为压缩tar包,通过scp等传至新服务器,再用zcat | docker load一步加载,完整保留镜像层、标签及历史记录,无需网络依赖且兼容v20.10+版本。

直接用 docker save 和 docker load 是最稳妥、兼容性最好的方式,不依赖网络、不挑 Docker 版本,只要目标服务器 Docker 能运行(v20.10+ 基本都支持),就能完整还原镜像层、标签和历史记录。
一、在旧服务器上导出所有需要的镜像
别只导一个镜像——服务往往依赖多个镜像(基础镜像、业务镜像、数据库等)。推荐批量导出:
- 列出所有非临时镜像(排除 dangling 镜像):
docker images --format "{{.Repository}}:{{.Tag}}" | grep -v '<none>' - 导出为单个压缩包(更省空间、方便传输):
docker save $(docker images --format "{{.Repository}}:{{.Tag}}" | grep -v '<none>') | gzip > all-images.tar.gz - 如果只想导特定镜像(比如带
super-前缀的):docker save $(docker images | awk '/super-/ {print $1":"$2}') | gzip > super-images.tar.gz
二、把镜像文件传到新服务器
用 scp 最常用,注意指定端口(如有):
scp -P 2222 all-images.tar.gz user@new-server-ip:/tmp/- 若网络受限,也可用 U 盘、内网 HTTP 服务或 rsync 等方式,只要文件完整到达即可
三、在新服务器上加载并验证
解压 + 加载一步到位(无需先解压再 load):
zcat /tmp/all-images.tar.gz | docker load- 查看是否全部加载成功:
docker images对比旧服务器的镜像列表 - 重点检查镜像 ID 和标签是否一致(
docker inspect 镜像名可看完整元数据)
四、迁移后要顺手处理的几件事
镜像只是基础,实际运行还常涉及这些:
-
数据卷(volume):
docker volume ls查看,用rsync或tar手动同步对应目录(如/var/lib/docker/volumes/xxx/_data) -
配置文件与 compose 文件:把
docker-compose.yml、环境变量、证书等一并复制过去 -
端口与路径适配:检查
docker-compose.yml中的端口映射、挂载路径是否符合新服务器实际目录结构 -
启动验证:
docker-compose up -d后用docker logs和curl测试服务是否正常响应
整个过程不复杂但容易忽略细节。核心就三点:导出要全、传输要稳、加载后要验。版本差异基本不影响,真正要注意的是镜像依赖关系和配套数据是否同步到位。


















