數據卷的備份與恢復
-備份-
注:
-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