零基础Docker容器迁移备份实战指南:从导出到恢复全流程
前置准备
在开始 Docker容器迁移备份 之前,请确保你已经满足以下条件:
- 一台装有Docker的源服务器(如CentOS、Ubuntu等),Docker版本 >= 19.03。
- 一个正在运行的容器(建议先停止,避免写操作导致数据不一致)。
- 目标服务器(也需安装Docker,且网络可通或通过U盘拷贝文件)。
- 基础命令认知:知道如何通过SSH登录服务器,会使用
ls、cd等简单命令。
如果你还没有Docker环境,可以在宝塔面板中点击「软件商店」→「Docker」一键安装,或执行:
curl -fsSL https://get.docker.com | bash -s docker
分步操作
第一步:将容器保存为镜像
- 查看正在运行的容器名称(假设你的容器叫
myapp):
docker ps- 可选:停止容器(避免迁移过程中有写入):
docker stop myapp- 使用
docker commit将容器当前状态打包为新镜像:
docker commit myapp myapp_backup:latest这会在本地生成一个名为 myapp_backup 的新镜像。
第二步:导出镜像为文件
使用 docker save 将镜像导出为 .tar 文件:
docker save -o myapp_backup.tar myapp_backup:latest完成后你会得到一个 myapp_backup.tar 文件(通常几十到几百MB)。
第三步:传输文件到目标服务器
根据你的实际环境选择传输方式:
- 同一局域网:使用
scp命令将文件复制到目标服务器(假设目标IP是192.168.1.100):
scp ./myapp_backup.tar root@192.168.1.100:/root/- 离线环境:通过U盘拷贝,或使用
wget/rsync等工具。
第四步:在目标服务器上加载镜像
登录目标服务器,执行:
docker load -i /root/myapp_backup.tar用 docker images 确认镜像已出现:
docker images | grep myapp_backup第五步:启动新容器
根据原容器的启动参数重新运行容器。
如果不记得原参数,可通过 docker inspect 在新机器上查看(需先从老机器导出inspect信息),这里给出通用示例:
docker run -d --name myapp_new -p 8080:80 myapp_backup:latest注意:如果原容器挂载了数据卷(volume),请先在新机器上创建相同路径的卷或目录(参考下文避坑指南)。
可选:直接备份并恢复数据卷
如果你的容器使用了 具名卷,可以借助以下命令备份:
docker run --rm -v myapp_data:/source -v $(pwd):/backup alpine tar czf /backup/data_backup.tar.gz -C /source .然后在目标机器上恢复:
docker run --rm -v myapp_data:/target -v $(pwd):/backup alpine tar xzf /backup/data_backup.tar.gz -C /target避坑指南
docker commit不包含数据卷(volume):挂载在主机的目录或命名卷不会被打包进镜像,必须单独备份。docker exportvsdocker save:export导出的是容器文件系统,不保留镜像层和元数据,推荐使用save/load组合。- 传输文件权限问题:确保目标服务器有写入权限,如果使用
scp要确认 SSH 密钥或密码正确。 - 网络映射冲突:新机器上如果原端口已占用,需换成其他端口,或先停掉冲突服务。
- 容器启动后立即退出:检查日志
docker logs myapp_new,多半是缺少环境变量或挂载卷路径不存在。
效果验证
- 检查容器状态:
docker ps -a | grep myapp_new显示 Up 即运行中。
- 访问应用:如果你的容器运行的是一个Web服务,用浏览器打开
http://目标IP:映射端口,确认页面正常。 - 验证数据完整性:如果迁移前容器内有数据库或文件,登录容器确认数据存在:
docker exec -it myapp_new bash
进入容器后检查相关文件或数据库表
高频问题解答
Q1:容器迁移后数据卷里的数据丢失了怎么办?
A:这是因为 docker commit 不保存数据卷。请提前使用 docker run --rm -v 卷名:/source -v 备份路径:/backup alpine tar 单独备份数据卷,然后在目标机器恢复。
Q2:迁移多个容器时有没有批量方法?
A:可以写一个简单脚本,循环 docker ps -a --format "{{.Names}}" 来挨个 commit 和 save。但要注意保证容器名不重复。
Q3:是否可以迁移不同版本Docker的容器?
A:使用 save/load 方式兼容性较好,但跨大版本(如19.x到24.x)可能会遇到兼容问题,建议先在测试环境验证。
Q4:迁移后IP地址变了,容器内部连接数据库的配置要改吗?
A:如果数据库也随容器迁移且使用了容器内部网络别名,则不需要改;如果数据库IP是写死的,则需修改配置文件(建议用环境变量或外部配置文件挂载)。
如果你正在处理 Docker容器迁移备份,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。