Docker容器数据备份和迁移方法

前言

Docker容器删了数据就没了?想把容器从一台服务器迁到另一台?本文讲Docker容器数据备份和迁移的几种方法,包括容器快照、数据卷备份、镜像导出。

一、Docker数据存哪里

Docker数据有两种存法:

  1. 容器内部:数据存在容器的可写层,容器删了数据就没了
  2. 数据卷(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逻辑备份,不要直接拷文件。

总结

记住:

  1. 生产环境一定要用数据卷(-v)
  2. 小容器用commit快照备份
  3. 大数据量直接备份数据卷目录
  4. 数据库用mysqldump逻辑备份
  5. 备份完要测试能不能恢复

最常用:

# 备份数据卷
tar -zcvf backup.tar.gz /data/容器数据/

# 恢复数据卷
tar -zxvf backup.tar.gz -C /data/

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-9 07:43