Docker容器的数据卷备份与恢复

数据卷的备份与恢复

-备份-

注:
  -v指定数据卷时,如果数据卷不存在则自动创建。

1.使用nginx基础镜像新启动一个名为nginx的容器,-v指定数据卷名为web并挂载到nginx容器的/mnt/web目录

[root@localhost ~]# docker run -itd --name nginx -v web:/mnt/web nginx
3e99025339a4600ae7f607fbaafaff9f36bdf8d8533aaa441a42103be4260de5

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
3e99025339a4        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        80/tcp              nginx

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               web      //可以看到web数据卷自动创建

2.在名为nginx的容器中新增数据

  可以进入nginx容器中新增,也可以直接使用docker命令新增数据。

[root@localhost ~]# docker exec -it nginx mkdir /mnt/web/test

[root@localhost ~]# docker exec -it nginx touch /mnt/web/data.txt

[root@localhost ~]# docker exec -it nginx ls /mnt/web
data.txt  test        //可以看到新增的文件夹与文本文件

3.数据卷备份

命令详解:

 使用nginx基础镜像新建一个临时的容器(不放入后台运行),数据共享容器nginx的数据卷web,并且-v 指定将本机的/root/test目录挂载到临时容器的/backup目录,执行备份命令将临时容器的/mnt/web目录打包压缩到/backup目录下名为web.tar的备份文件(因为数据卷web挂载到了nginx容器的/mnt/web目录,而临时容器又共享了nginx容器的数据卷web,所以直接打包容器的/mnt/web目录即可) (因为本机的/root/test目录挂载到了临时容器的/backup目录,所以可以直接在本机的/root/test目录中查找备份文件web.tar即可)

[root@localhost ~]# docker run -it --volumes-from nginx -v /root/test:/backup nginx tar cvf /backup/web.tar /mnt/web
tar: Removing leading `/' from member names
/mnt/web/
/mnt/web/test/
/mnt/web/data.txt

[root@localhost ~]# ll -h /root/test/
总用量 357M
-rw-r--r-- 1 root root  10K 5月  13 02:29 web.tar      //备份数据

-恢复-

1.用nginx基础镜像新启动一个带有空数据卷webdata的容器nginxback

[root@localhost ~]# docker run -itd --name nginxback -v webdata:/mnt/web nginx
33149ce377ae168d09f69227c8216db731e24593db7f57f0cca594d011a7c9c9

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               web
local               webdata    //自动创建的新数据卷(用于恢复数据)
   
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
33149ce377ae        nginx               "nginx -g 'daemon of…"   3 seconds ago       Up 1 second         80/tcp              nginxback
3e99025339a4        nginx               "nginx -g 'daemon of…"   7 minutes ago       Up 7 minutes        80/tcp              nginx

2.数据卷恢复

命令详解:

 使用nginx基础镜像新建一个临时的容器(不放入后台运行),数据共享容器nginxback的数据卷webdata(作用是将web.tar文件数据恢复至数据卷webdata),并且-v 指定将本机的/root/test目录挂载到临时容器的/backup目录,所以直接执行恢复命令将临时容器的/backup目录下名为web.tar的备份文件恢复至nginxback容器的数据卷webdata中 。

[root@localhost ~]# docker run -it --volumes-from nginxback -v /root/test:/backup nginx tar xvf /backup/web.tar
mnt/web/
mnt/web/test/
mnt/web/data.txt

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               web
local               webdata

[root@localhost ~]# docker exec -it nginx ls /mnt/web   
data.txt  test      //原始数据容器nginx中的数据(数据卷web)

[root@localhost ~]# docker exec -it nginxback ls /mnt/web
data.txt  test     //备份数据卷恢复后的nginxback容器中的数据(数据卷webdata)

3.为了验证web数据卷备份恢复到webdata数据卷的数据,再启动一个新容器挂载webdata数据卷查看数据

[root@localhost ~]# docker run -itd --name webtest -v webdata:/mnt/web nginx
60e73b319aff246ac2d1debca13b1d7581a056d8a13a9c508ae614f4a58273a5
   //启动新容器webtest,并且-v将webdata数据卷挂载到容器/mnt/web目录

[root@localhost ~]# docker exec -it webtest ls /mnt/web
data.txt  test        //查看容器webtest中的数据

???Mysql容器数据卷的备份与恢复问题???

问题:

   使用上面nginx数据卷备份恢复的方法对mysql容器数据卷进行备份与恢复,在备份与恢复的过程都能够看到新建的test库,但是恢复之后数据库中就是没有test库,不知道是什么问题?有懂的大佬解答一下,万分感谢!!!

实验过程:

1.使用mysql基础镜像新启动一个mysql4容器,-v指定数据卷名为mysql并挂载到mysql4容器的/var/lib/mysql目录,-e设置mysql4容器数据库密码为123。

[root@localhost ~]# docker run -itd --name mysql4 -v mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql
    //启动mysql4容器,-v指定数据卷mysql挂载到/var/lib/mysql目录,-e设置密码

[root@localhost ~]# docker volume ls    //查看创建的数据卷
DRIVER              VOLUME NAME
local               mysql

[root@localhost ~]# docker ps     //查看运行的mysql4容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
7632976b82d4        mysql               "docker-entrypoint.s…"   6 hours ago         Up 6 hours          3306/tcp, 33060/tcp   mysql4

2.进入mysql4容器并创建新库test

[root@localhost ~]# docker exec -it mysql4 /bin/bash
root@7632976b82d4:/# mysql -uroot -p123
...
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.68 sec)

mysql> create database test;       //创建test库
Query OK, 1 row affected (0.24 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.01 sec)

3.数据卷mysql备份

命令详解:

 使用mysql基础镜像新建一个临时的容器(不放入后台运行),数据共享容器mysql4的数据卷mysql,并且-v 指定将本机的/root/test目录挂载到临时容器的/backup目录,执行备份命令将临时容器的/var/lib/mysql目录打包压缩到/backup目录下名为test.tar的备份文件(因为数据卷mysql挂载到了mysql4容器的/var/lib/mysql目录,而临时容器又共享了mysql4容器的数据卷mysql,所以直接打包容器的/var/lib/mysql目录即可) (因为本机的/root/test目录挂载到了临时容器的/backup目录,所以可以直接在本机的/root/test目录中查找备份文件test.tar即可)

[root@localhost ~]# docker stop mysql4
mysql4

[root@localhost ~]# docker run -it --volumes-from mysql4 -v /root/test:/backup mysql tar cvf /backup/test.tar /var/lib/mysql
tar: Removing leading `/' from member names
/var/lib/mysql/
/var/lib/mysql/ibdata1
/var/lib/mysql/ib_logfile1
/var/lib/mysql/#ib_16384_0.dblwr
/var/lib/mysql/#ib_16384_1.dblwr
...
/var/lib/mysql/1d90619790ec.err
/var/lib/mysql/binlog.000001
/var/lib/mysql/binlog.000002
/var/lib/mysql/test/
/var/lib/mysql/binlog.000003
/var/lib/mysql/binlog.000004
/var/lib/mysql/binlog.000005
/var/lib/mysql/binlog.000006
/var/lib/mysql/binlog.000007
/var/lib/mysql/binlog.000008
/var/lib/mysql/binlog.index
/var/lib/mysql/ib_buffer_pool
    
[root@localhost ~]# ll -h /root/test/       //查看备份文件
总用量 172M
-rw-r--r-- 1 root root 172M 5月  12 22:38 test.tar

4.数据卷恢复

[root@localhost ~]# docker run -itd --name mysql_back -v mysqltest:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 mysql
246f59e233116c3b0e8a8d041f3ca7b4b5096ca170ebb0e2fac586236c92d4b7
   //启动新容器mysql_back,将空数据卷mysqlback挂载至容器的/var/lib/mysql目录

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
246f59e23311        mysql               "docker-entrypoint.s…"   4 seconds ago       Up 3 seconds        3306/tcp, 33060/tcp   mysql_back

[root@localhost ~]# docker volume ls
DRIVER              VOLUME NAME
local               mysql
local               mysqlback

[root@localhost ~]# docker run -it --volumes-from mysql_back -v /root/test:/backup mysql tar xvf /backup/test.tar -C /var/lib/mysql
var/lib/mysql/
var/lib/mysql/ibdata1
var/lib/mysql/ib_logfile1
var/lib/mysql/#ib_16384_0.dblwr
var/lib/mysql/#ib_16384_1.dblwr
var/lib/mysql/undo_001
var/lib/mysql/undo_002
var/lib/mysql/ib_logfile0
var/lib/mysql/#innodb_temp/
var/lib/mysql/#innodb_temp/temp_1.ibt
var/lib/mysql/#innodb_temp/temp_2.ibt
var/lib/mysql/#innodb_temp/temp_3.ibt
var/lib/mysql/#innodb_temp/temp_4.ibt
var/lib/mysql/#innodb_temp/temp_5.ibt
var/lib/mysql/#innodb_temp/temp_6.ibt
var/lib/mysql/#innodb_temp/temp_7.ibt
var/lib/mysql/#innodb_temp/temp_8.ibt
var/lib/mysql/#innodb_temp/temp_9.ibt
...
var/lib/mysql/test/        ------》可以看到恢复的时候有test库
var/lib/mysql/binlog.000003
var/lib/mysql/binlog.000004
var/lib/mysql/binlog.000005
var/lib/mysql/binlog.000006
var/lib/mysql/ib_buffer_pool
var/lib/mysql/ibtmp1
var/lib/mysql/binlog.000007
var/lib/mysql/binlog.index

[root@localhost test]# docker exec -it mysql_back /bin/bash
root@2ffefb7516b9:/# mysql -uroot -p123
    //查看新容器mysql_back进行数据卷恢复后数据库中的数据
...
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |     ----》数据库中无test库????
+--------------------+
4 rows in set (0.07 sec)

root@8fff18326739:/# ls /var/lib/mysql/
'#ib_16384_0.dblwr'   auto.cnf        ca.pem            ib_logfile1   performance_schema   sys
'#ib_16384_1.dblwr'   binlog.000001   client-cert.pem   ibdata1       private_key.pem      test
'#innodb_temp'        binlog.000002   client-key.pem    ibtmp1        public_key.pem       undo_001
 509ca1ee2a1b.err     binlog.index    ib_buffer_pool    mysql         server-cert.pem      undo_002
 8fff18326739.err     ca-key.pem      ib_logfile0       mysql.ibd     server-key.pem       var

猜你喜欢

转载自blog.csdn.net/qq_44895681/article/details/106072268