手把手教你Docker容器迁移备份:从导出到恢复全流程
前置准备
进行 Docker容器迁移备份 之前,请确保你具备以下条件:
- 两台服务器都已安装 Docker(版本 ≥ 19.03)。
- 源服务器和目标服务器之间网络可达(建议使用 SSH 或 scp)。
- 确认目标服务器磁盘空间足够存放镜像和备份文件。
- 准备一个测试容器(例如 nginx)用于演练。
如果你使用的是宝塔面板,可以直接在“Docker”模块中找到容器列表和镜像管理入口,但本文命令通用所有环境。
分步操作
1. 备份正在运行的容器(提交为镜像)
如果你的容器内有数据改动(比如配置文件、程序更新),先用 docker commit 将当前容器保存为新镜像。
# 查看容器ID或名称
docker ps
提交容器为镜像 - 示例:my_nginx:20250415
docker commit <容器名或ID> my_nginx_backup:latest
2. 导出镜像为 tar 文件
使用 docker save 把镜像压缩打包:
# 导出镜像为 tar 文件
docker save -o my_nginx_backup.tar my_nginx_backup:latest3. 备份数据卷(如果使用了数据卷)
数据卷中的内容不会包含在镜像里,需要单独打包。
进入数据卷宿主机目录,用 tar 压缩:
# 查看数据卷挂载路径,假设挂在 /var/lib/docker/volumes/nginx_data
docker inspect <容器名> | grep Mounts
进入数据卷目录并打包(路径根据实际替换)
sudo tar -czf nginx_data_backup.tar.gz /var/lib/docker/volumes/nginx_data/_data
4. 将备份文件传输到目标服务器
用 scp 复制(假设目标IP为 192.168.1.200,目标路径为 /tmp/):
# 传输镜像和数据卷备份文件
scp my_nginx_backup.tar root@192.168.1.200:/tmp/
scp nginx_data_backup.tar.gz root@192.168.1.200:/tmp/5. 在目标服务器上导入镜像并启动容器
登录到目标服务器,执行:
# 1. 导入镜像
docker load -i /tmp/my_nginx_backup.tar
2. 恢复数据卷(如果之前备份了)
mkdir -p /var/lib/docker/volumes/nginx_data/_data
sudo tar -xzf /tmp/nginx_data_backup.tar.gz -C /var/lib/docker/volumes/nginx_data/_data
3. 根据原镜像创建并启动容器(注意端口映射等参数)
docker run -d --name restored_nginx -p 8080:80 my_nginx_backup:latest
说明:如果容器当初使用了 --mount 绑定挂载,恢复时也需要指定相同的路径映射。避坑指南
- 不要直接迁移容器 ID:容器是运行时环境,直接复制 /var/lib/docker/containers/ 目录不可取,应使用镜像+数据卷方式。
- 数据卷遗漏:很多新手只备份镜像,忽略数据卷,导致数据库、配置文件丢失。务必确认数据卷路径。
- 端口冲突:目标服务器上原有容器占用了相同端口,启动新容器会失败,请提前规划端口映射。
- 镜像标记丢失:导入后镜像名称和标签可能与原来不同,使用
docker images检查,并用docker tag修正。
高频问题解答
问题1:迁移后容器无法启动,提示 "OCI runtime create failed" 怎么办?
答:通常是宿主机内核或系统调用差异导致。可尝试在目标服务器更新 Docker 版本,或使用 --privileged 参数启动容器。
问题2:如何只备份部分文件,而不提交整个镜像?
答:使用 docker cp 将特定文件从容器复制到宿主机,再压缩传输。例如:docker cp <容器名>:/app/config.ini ./。
问题3:数据卷很多,有没有一键备份的脚本?
答:可以写一个简短脚本遍历所有数据卷路径并打包,但建议逐卷确认。注意:Docker 官方推荐使用 --volumes-from 或挂载临时容器来备份。
效果验证
- 在目标服务器执行
docker ps,确认restored_nginx容器状态为 Up。 - 访问目标服务器IP+端口(例如
http://192.168.1.200:8080),预期显示与源服务器一致的页面。 - 进入恢复后的数据卷目录,检查文件完整性:
ls /var/lib/docker/volumes/nginx_data/_data- 对比源服务器的数据内容和更新时间,确保迁移无误。
如果你正在处理 Docker容器迁移备份,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。