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