平滑迁移需同步镜像、数据、配置三层:镜像用commit/save/load,数据卷单独导出导入,编排文件(如docker-compose.yml)一并打包;同时确保docker版本、存储驱动、系统架构一致,并预留足够磁盘空间。

要实现应用在不同服务器间的平滑迁移,核心不是搬容器本身,而是搬“可复现的运行状态”——即镜像 + 数据 + 配置三者完整、一致地转移。直接导出容器(docker export)会丢失端口映射、环境变量、启动命令等关键信息,极易导致迁移后无法启动;而只传镜像又会丢掉业务产生的持久化数据。真正可靠的做法是分层处理:镜像走 commit → save → load,数据卷单独导出导入,配置和编排文件(如 docker-compose.yml)一并打包。
先确保两边环境兼容
迁移失败很多源于环境差异,不是操作问题:
- Docker 主版本号必须一致(如都是 24.x),否则镜像加载可能报错或行为异常
- 目标服务器需启用相同的存储驱动(
overlay2最常见,可通过docker info | grep "Storage Driver"确认) - 检查系统架构是否匹配:x86_64 镜像不能直接在 ARM 服务器上运行(除非启用
qemu-user-static) - 用
docker system df查剩余空间,确保大于镜像体积 + 数据卷大小之和
迁移容器镜像(含所有修改)
适用于已运行并做过配置/安装改动的容器(比如改过 Nginx 配置、装了 Python 包):
- 停止容器:
docker stop myapp(避免文件写入不一致) - 提交为新镜像:
docker commit myapp myapp:v2.1 - 导出为 tar:
docker save -o myapp-v2.1.tar myapp:v2.1 - 传输到目标机:
scp myapp-v2.1.tar user@192.168.10.50:/tmp/ - 在目标机加载:
docker load -i /tmp/myapp-v2.1.tar - 打标签便于识别(可选):
docker tag $(docker images -q myapp:v2.1) registry.example.com/myapp:v2.1
同步数据卷(特别是命名卷)
如果容器使用 volumes: 定义了命名卷(如 dbdata),它不会随镜像迁移,必须单独处理:
- 在源服务器导出卷内容:
docker run --rm -v dbdata:/data -v $(pwd):/backup alpine tar czf /backup/dbdata.tar.gz -C /data . - 传输压缩包:
scp dbdata.tar.gz user@192.168.10.50:/tmp/ - 在目标服务器创建同名空卷:
docker volume create dbdata - 解压进卷:
docker run --rm -v dbdata:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/dbdata.tar.gz"
保留编排与启动逻辑
单纯有镜像和数据还不够,启动参数、端口映射、依赖关系必须复现:
- 把
docker-compose.yml、.env、自定义配置目录(如./config、./data)一起打包:tar czvf app-deploy.tar.gz myapp/ - 传过去后解压:
tar xzvf app-deploy.tar.gz - 进入目录执行:
docker-compose up -d(前提是目标机已安装 docker-compose) - 若用纯
docker run启动,建议将完整命令写成 shell 脚本(含-v、-p、-e等),一并迁移











