Docker容器数据备份和迁移方法
时间:2026-10-9 07:43 作者:emer 分类: 无
前言
Docker容器删了数据就没了?想把容器从一台服务器迁到另一台?本文讲Docker容器数据备份和迁移的几种方法,包括容器快照、数据卷备份、镜像导出。
一、Docker数据存哪里
Docker数据有两种存法:
- 容器内部:数据存在容器的可写层,容器删了数据就没了
- 数据卷(Volume):数据存在宿主机上,容器删了数据还在
重要: 生产环境一定要用数据卷,不然容器一删数据全没。
二、方法1:容器快照(commit)
把容器当前状态打包成一个新镜像。
步骤
第一步:查看容器ID
docker ps
找到要备份的容器ID。
第二步:提交成新镜像
docker commit 容器ID 备份镜像名:标签
例子:
docker commit mynginx nginx-backup:v1
第三步:导出镜像成文件
docker save -o nginx-backup.tar nginx-backup:v1
第四步:传到新服务器
scp nginx-backup.tar root@新服务器IP:/root/
第五步:新服务器导入
docker load -i nginx-backup.tar
第六步:新服务器启动容器
docker run -d --name mynginx -p 80:80 nginx-backup:v1
优缺点
优点: 简单,整个容器都打包了
缺点: 镜像文件大,不适合大数据量
三、方法2:数据卷备份
如果用了数据卷,直接备份数据卷里的文件。
步骤
第一步:看数据卷挂载在哪
docker inspect 容器名 | grep Mounts
输出里找 Source,就是宿主机上的路径。
例子:
"Mounts": [
{
"Source": "/data/mysql",
"Destination": "/var/lib/mysql"
}
]
数据在宿主机的 /data/mysql 目录。
第二步:打包备份
tar -zcvf mysql-backup.tar.gz /data/mysql
第三步:传到新服务器
scp mysql-backup.tar.gz root@新服务器IP:/root/
第四步:新服务器解压
tar -zxvf mysql-backup.tar.gz -C /data/
第五步:新服务器启动容器,挂载数据卷
docker run -d --name mysql -v /data/mysql:/var/lib/mysql -p 3306:3306 mysql:5.7
优缺点
优点: 数据和容器分离,灵活
缺点: 要自己管理数据目录
四、方法3:docker cp拷贝文件
把容器里的文件拷出来。
拷出来
docker cp 容器名:/容器内路径 宿主机路径
例子:
docker cp mynginx:/usr/share/nginx/html /data/backup/html
拷进去
docker cp 宿主机路径 容器名:/容器内路径
例子:
docker cp /data/backup/html/index.html mynginx:/usr/share/nginx/html/
五、MySQL容器备份
备份MySQL数据
docker exec 容器名 mysqldump -uroot -p123456 数据库名 > backup.sql
例子:
docker exec mysql mysqldump -uroot -p123456 test > test.sql
恢复MySQL数据
docker exec -i 容器名 mysql -uroot -p123456 数据库名 < backup.sql
例子:
docker exec -i mysql mysql -uroot -p123456 test < test.sql
六、常见坑
坑1:容器删了数据没了
没用数据卷,容器删了数据全没。
解决: 一定要用 -v 挂载数据卷。
坑2:commit的镜像太大
把整个容器都打包了,包括临时文件。
解决: 尽量用数据卷备份,不要用commit。
坑3:数据权限不对
备份恢复后,容器里读不了数据。
原因: 文件所有者不对。
解决: 改权限:
chown -R 999:999 /data/mysql
(MySQL容器用的是999用户)
坑4:数据库没停就备份
MySQL还在写数据,备份出来不一致。
解决: 用mysqldump逻辑备份,不要直接拷文件。
总结
记住:
- 生产环境一定要用数据卷(-v)
- 小容器用commit快照备份
- 大数据量直接备份数据卷目录
- 数据库用mysqldump逻辑备份
- 备份完要测试能不能恢复
最常用:
# 备份数据卷
tar -zcvf backup.tar.gz /data/容器数据/
# 恢复数据卷
tar -zxvf backup.tar.gz -C /data/
遇到问题加QQ23979811 协助处理