数据卷的备份与恢复
-备份-
注:
-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