Docker容器备份迁移跨主机:从导出到导入的完整实操
动手前先准备好这些
在开始 Docker 容器备份迁移跨主机之前,先确认两边机器上都安装了 Docker(版本 19.03 以上更稳定),并且你有 sudo 权限。容器要处于停止状态吗?
不一定,但停止后导出的快照更干净。
找到要迁移的容器名或 ID,用 docker ps -a 查看。
另外,准备一个传输文件的方式——本教程用 scp 或 rsync,如果网络不通也可以走 U 盘。
第一步:在源主机上备份容器
这里推荐两种主流方案,新手首选 docker export,因为它最直白。
方案一:docker export 导出为 tar 文件
# 先停止容器(可选,导出的运行态文件也正常)
docker stop 容器名称
# 导出成 tar 包
docker export 容器名称 -o 容器名称_backup.tar
执行后当前目录下会出现一个 .tar 文件,这就是容器的完整文件系统快照。注意它不包含容器元数据(如环境变量、端口映射),这些后面手动处理。
方案二:docker commit 做成镜像
docker commit 容器名称 新镜像名称:v1
docker save -o 新镜像名称_v1.tar 新镜像名称:v1
docker commit 会把当前容器状态冻结成一个新镜像,再用 docker save 导出为 tar。
这种方案保留了启动命令等部分配置,但环境变量仍需手动记下来。
第二步:把备份文件传到目标主机
用 scp 把 tar 包传到新机器上(假设目标 IP 是 192.168.1.100,用户名是 root):
scp 容器名称_backup.tar root@192.168.1.100:/tmp/
如果文件很大,改用 rsync 支持断点续传:
rsync -avP 容器名称_backup.tar root@192.168.1.100:/tmp/
传完后在目标机器上确认文件存在:ls -lh /tmp/容器名称_backup.tar。
第三步:在目标主机上恢复容器
根据备份方式选择对应的恢复命令。
对应 docker export 的恢复
# 导入为镜像(可以指定名称和标签)
cat /tmp/容器名称_backup.tar | docker import - 恢复后的镜像名:v1
# 基于该镜像启动容器,记得指定原来的端口和挂载参数
docker run -d --name 新容器名 -p 8080:80 恢复后的镜像名:v1
重点:docker import 不会保留原容器的启动命令和端口,你必须通过 docker run 手动指定 -p、-v、-e 等参数。
建议你在源主机用 docker inspect 旧容器名 把配置都记下来,然后照搬到目标主机。
对应 docker save 的恢复
docker load -i /tmp/新镜像名称_v1.tar
# 查看镜像是否到本地
docker images
# 启动容器,此时可以用原镜像的 Entrypoint/CMD,但端口映射仍需手动指定
docker run -d --name 新容器名 -p 8080:80 新镜像名称:v1
避坑指南与高频问题
- 数据卷怎么办?
docker export和docker commit都不会包含绑定挂载的数据卷(比如 MySQL 的 /var/lib/mysql)。你需要单独把数据卷目录用tar打包后传输,再在目标主机挂载到相同路径。 - 环境变量丢失? 用
docker inspect查看原容器的 Env 字段,启动时用-e逐个设置,或者写个--env-file文件。 - 容器名冲突? 目标主机上已有同名容器,启动时
--name取个新名字即可。 - export 和 save 选哪个? 新手推荐 export + import,因为文件体积小、步骤直观。生产环境建议 commit + save,因为保留的元数据更多,但需要额外维护镜像。
- 网络不通怎么传文件? 用 U 盘拷贝 tar 包,或者通过内网 NAS 共享。
最后验证一下迁移效果
在目标主机上执行 docker ps 确认容器运行,然后用浏览器或 curl 访问应用端口。
如果是数据库容器,检查数据是否完整。关键命令:
# 查看容器日志确保无报错
docker logs 新容器名
# 进入容器内部验证服务
docker exec -it 新容器名 sh
如果发现应用启动异常,先检查端口映射、环境变量和数据卷挂载路径是否与原环境一致。
绝大多数迁移失败都出在这三个点上。
掌握了这套方法,以后你遇到物理机迁移、机房搬迁、灾备恢复都能快速响应。
牢记“备份时记配置,恢复时补参数”这个口诀,Docker 容器备份迁移跨主机就不再是难题。