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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章