Docker中的數據可以存儲在類似於虛擬機磁盤的介質中,在Docker中稱為數據卷(Data Volume)。數據卷可以用來存儲Docker應用的數據,也可以用來在Docker容器間進行數據共享。數據卷呈現給Docker容器的形式就是一個目錄,支持多個容器間共享,修改也不會影響鏡像。使用Docker的數據卷,類似在系統中使用 mount 掛載一個文件系統。操作Docker數據卷,需要理解以下幾點:
============================================================================
1)一個數據卷是一個特別指定的目錄,該目錄利用容器的UFS文件系統可以為容器提供一些穩定的特性或者數據共享。數據卷可以在多個容器之間共享。
============================================================================
2)創建數據卷,只要在docker run命令后面跟上-v參數即可創建一個數據卷,當然也可以跟多個-v參數來創建多個數據卷,當創建好帶有數據卷的容器后,就可以在其他容器中通過--volumes-froms參數來掛載該數據卷了,而不管該容器是否運行。也可以在Dockerfile中通過VOLUME指令來增加一個或者多個數據卷。
============================================================================
3)如果有一些數據想在多個容器間共享,或者想在一些臨時性的容器中使用該數據,那么最好的方案就是你創建一個數據卷容器,然后從該臨時性的容器中掛載該數據卷容器的數據。這樣,即使刪除了剛開始的第一個數據卷容器或者中間層的數據卷容器,只要有其他容器使用數據卷,數據卷都不會被刪除的。
============================================================================
4)不能使用docker export、save、cp等命令來備份數據卷的內容,因為數據卷是存在於鏡像之外的。備份方法: 創建一個新容器,掛載數據卷容器,同時掛載一個本地目錄,然后把遠程數據卷容器的數據卷通過備份命令備份到映射的本地目錄里面。如下:
# docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
============================================================================
5)可以把一個本地主機的目錄當做數據卷掛載在容器上,同樣是在docker run后面跟-v參數,不過-v后面跟的不再是單獨的目錄了,它是[host-dir]:[container-dir]:[rw|ro]這樣格式的,其中host-dir是一個絕對路徑的地址,如果host-dir不存在,則docker會創建一個新的數據卷,如果host-dir存在,但是指向的是一個不存在的目錄,則docker也會創建該目錄,然后使用該目錄做數據源。
Docker Volume數據卷可以實現:
-> 繞過“拷貝寫”系統,以達到本地磁盤IO的性能,(比如運行一個容器,在容器中對數據卷修改內容,會直接改變宿主機上的數據卷中的內容,所以是本地磁盤IO的性能,而不是先在容器中寫一份,最后還要將容器中的修改的內容拷貝出來進行同步。)
-> 繞過“拷貝寫”系統,有些文件不需要在docker commit打包進鏡像文件。
-> 數據卷可以在容器間共享和重用數據
-> 數據卷可以在宿主和容器間共享數據
-> 數據卷數據改變是直接修改的
-> 數據卷是持續性的,直到沒有容器使用它們。即便是初始的數據卷容器或中間層的數據卷容器刪除了,只要還有其他的容器使用數據卷,那么里面的數據都不會丟失。
Docker數據持久化:
容器在運行期間產生的數據是不會寫在鏡像里面的,重新用此鏡像啟動新的容器就會初始化鏡像,會加一個全新的讀寫入層來保存數據。如果想做到數據持久化,Docker提供數據卷(Data volume)或者數據容器卷來解決問題,另外還可以通過commit提交一個新的鏡像來保存產生的數據。
一、創建一個數據卷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
如下為容器添加一個數據卷,並將容器名改為data。這個數據卷在容器里的目錄是
/opt/data
[root@localhost ~]
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io
/ubuntu
latest 0ef2e08ed3fa 2 weeks ago 130 MB
[root@localhost ~]
# docker run --name data -v /opt/data -t -i docker.io/ubuntu /bin/bash
root@2b9aebcf6ce8:/
# cd /opt/data/
root@2b9aebcf6ce8:
/opt/data
# ls
root@2b9aebcf6ce8:
/opt/data
# echo "123" > 123
root@2b9aebcf6ce8:
/opt/data
# echo "123123" > 123123
root@2b9aebcf6ce8:
/opt/data
# ls
123 123123
[root@localhost volumes]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b9aebcf6ce8 docker.io
/ubuntu
"/bin/bash"
49 seconds ago Up 48 seconds data
在宿主機上,查看對應上面的那個數據卷的目錄路徑:
[root@localhost ~]
# docker inspect data|grep /var/lib/docker/volumes
"Source"
:
"/var/lib/docker/volumes/89d6562b9c1fe10dd21707cb697a5d481b3c1b000a69b762f540fa826a16972a/_data"
,
[root@localhost ~]
# ls /var/lib/docker/volumes/89d6562b9c1fe10dd21707cb697a5d481b3c1b000a69b762f540fa826a16972a/_data
123 123123
[root@localhost ~]
# echo "asdhfjashdfjk" >> /var/lib/docker/volumes/89d6562b9c1fe10dd21707cb697a5d481b3c1b000a69b762f540fa826a16972a/_data/123
[root@localhost ~]
#
root@2b9aebcf6ce8:
/opt/data
# ls
123 123123
root@2b9aebcf6ce8:
/opt/data
# cat 123
123
asdhfjashdfjk
|
二、掛載宿主機文件或目錄到容器數據卷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
可以直接掛載宿主機文件或目錄到容器里,可以理解為目錄映射,這樣就可以讓所有的容器共享宿主機數據,從而只需要改變宿主機的數據源就能夠影響到所有的容器數據。
注意:
-
v
后面的映射關系是
"宿主機文件/目錄:容器里對應的文件/目錄"
,其中,宿主機上的文件/目錄是要提前存在的,容器里對應的文件/目錄會自動創建。
數據卷權限:
掛載的數據默認為可讀寫權限。
但也可以根據自己的需求,將容器里掛載共享的數據設置為只讀,這樣數據修改就只能在宿主機上操作。如下實例:
1)掛載宿主機文件到容器上
[root@localhost ~]
# cat /etc/web.list
192.168.1.100
192.168.1.101
192.168.1.103
[root@localhost ~]
# docker run -t -i --name test -v /etc/web.list:/etc/web.list:ro docker.io/centos /bin/bash
[root@e21a3fefa3ae /]
# cat /etc/web.list
192.168.1.100
192.168.1.101
192.168.1.103
[root@e21a3fefa3ae /]
# echo "192.168.1.115" >> /etc/web.list
bash
:
/etc/web
.list: Read-only
file
system
[root@e21a3fefa3ae /]
#
在宿主機上修改共享數據
[root@localhost ~]
# echo "192.168.1.115" >> /etc/web.list
[root@localhost ~]
#
[root@e21a3fefa3ae /]
# cat /etc/web.list
192.168.1.100
192.168.1.101
192.168.1.103
192.168.1.115
2)掛載宿主機目錄到容器上
[root@localhost ~]
# mkdir /var/huanqiupc
[root@localhost ~]
# echo "test" > /var/huanqiupc/test
[root@localhost ~]
# echo "test1" > /var/huanqiupc/test1
[root@localhost ~]
# docker run -t -i --name hqsb -v /var/huanqiupc:/opt/huantime docker.io/centos /bin/bash
[root@87cf93ce46a9 /]
# cd /opt/huantime/
[root@87cf93ce46a9 huantime]
# ls
test
test1
[root@87cf93ce46a9 huantime]
# cat test
test
[root@87cf93ce46a9 huantime]
# cat test1
test1
[root@87cf93ce46a9 huantime]
# echo "1231" >>test
[root@87cf93ce46a9 huantime]
# echo "44444" >>test1
宿主機上查看
[root@localhost ~]
# cat /var/huanqiupc/test
test
1231
[root@localhost ~]
# cat /var/huanqiupc/test1
test1
44444
3)掛載多個目錄
[root@localhost ~]
# mkdir /opt/data1 /opt/data2
[root@localhost ~]
# echo "123456" > /opt/data1/test1
[root@localhost ~]
# echo "abcdef" > /opt/data2/test2
[root@localhost ~]
# docker run --name data -v /opt/data1:/var/www/data1 -v /opt/data2:/var/www/data2:ro -t -i docker.io/ubuntu /bin/bash
root@cf2d57b9bee1:/
# ls /var/www/data1
test1
root@cf2d57b9bee1:/
# ls /var/www/data2
test2
root@cf2d57b9bee1:/
# cat /var/www/data1/test1
123456
root@cf2d57b9bee1:/
# cat /var/www/data2/test2
abcdef
root@cf2d57b9bee1:/
# echo "date1" >> /var/www/data1/test1
root@cf2d57b9bee1:/
# echo "date2" >> /var/www/data2/test2
bash
:
/var/www/data2/test2
: Read-only
file
system
root@cf2d57b9bee1:/
#
|
三、創建數據卷容器
啟動一個名為xqsj_Container容器,此容器包含兩個數據卷/var/volume1和/var/volume2(這兩個數據卷目錄是在容器里的,容器創建的時候會自動生成這兩目錄)
1
2
3
4
5
6
7
8
9
10
|
注意一個細節:
下面的創建命令中,沒有加-t和-i參數,所以這個容器創建好之后是登陸不了的!
-i:表示以“交互模式”運行容器
-t:表示容器啟動后會進入其命令行
[root@linux-node2 ~]
# docker run -v /var/volume1 -v /var/volume2 --name xqsj_Container centos /bin/bash
[root@linux-node2 ~]
#
所以要想創建容器后能正常登陸,就需要添加上面兩個參數
[root@localhost ~]
# docker run -t -i -v /var/volume1 -v /var/volume2 --name xqsj_Container centos /bin/bash
[root@73a34f3c1cd9 /]
#
|
查看宿主機上與數據卷對應的目錄路徑:
1
2
3
4
|
[root@localhost ~]
# docker inspect xqsj_Container|grep /var/lib/docker/volumes
"Source"
:
"/var/lib/docker/volumes/b8d2e5bcadf2550abd36ff5aa544c721a45464a4406fb50979815de773086627/_data"
,
"Source"
:
"/var/lib/docker/volumes/a34fa3a0a7a2f126b0d30a32b1034f20917ca7bd0dda346014d768b5ebb68f6b/_data"
,
由上面命令結果可以查到,兩個數據卷
/var/volume1
和
/var/volume2
下的數據在
/var/lib/docker/volumes/
下對於的兩個目錄的_data下面
|
創建App_Container容器,掛載xqsj_Container容器中的數據卷
[root@linux-node2 ~]# docker run -t -i --rm --volumes-from xqsj_Container --name App_Container centos /bin/bash
[root@b9891bcdfed0 /]# ls /var/volume1 //發現這兩個數據卷都存在
[root@b9891bcdfed0 /]# ls /var/volume2
[root@b9891bcdfed0 /]# echo "this is volume1" > /var/volume1/test1
[root@b9891bcdfed0 /]# echo "this is volume2" > /var/volume1/test2
可以再創建一個容器,掛載App_Container中從xqsj_Container掛載的數據卷。當然也可以直接掛載初始的xqsj_Container容器數據卷
[root@linux-node2 ~]# docker run -t -i --rm --volumes-from App_Container --name LastApp_Container centos /bin/bash
[root@b4c27e360614 /]# ls /var/volume1
test1
[root@b4c27e360614 /]# ls /var/volume2
test2
[root@b4c27e360614 /]# cat /var/volume1/test1
this is volume1
[root@b4c27e360614 /]# cat /var/volume2/test2
this is volume2
即便是刪除了初始的數據卷容器xqsj_Container,或是刪除了其它容器,但只要是有容器在使用該數據卷,那么它里面的數據就不會丟失!(除非是沒有容器在使用它們)
四、備份數據卷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
$
sudo
docker run --
rm
--volumes-from
test
-
v
$(
pwd
):
/backup
ubuntu:14.04
tar
cvf
/backup/test
.
tar
/test
tar
: Removing leading `/' from member names
/test/
/test/b
/test/d
/test/c
/test/a
以上命令表示:
啟動一個新的容器並且從
test
容器中掛載卷,然后掛載當前目錄到容器中為backup,並備份
test
卷中所有的數據為
test
.
tar
,執行完成之后刪除容器--
rm
,此時備份就在當前的目錄下,名為
test
.
tar
。
注意:后面的
/test
是數據卷的目錄路徑(即數據卷創建時在容器里的路徑)
$
ls
宿主機當前目錄下產生了
test
卷的備份文件
test
.
tar
---------------------------------------------看看下面的一個實例---------------------------------------------
先創建一個容器wang,包含兩個數據卷
/var/volume1
和
/var/volume2
(這兩個目錄是在容器里的數據卷路徑)
[root@localhost ~]
# docker run -t -i -v /var/volume1 -v /var/volume2 --name wang docker.io/centos /bin/bash
[root@83eb43492ae7 /]
#
根據Docker的數據持久化之數據卷容器可知,上面創建的wang數據卷容器掛載了
/var/volume1
和
/var/volume2
兩個目錄
然后在數據卷里寫些數據,以供測試。
[root@83eb43492ae7 /]
# cd /var/volume1
[root@83eb43492ae7 volume1]
# echo "test1" > test1
[root@83eb43492ae7 volume1]
# echo "test11" > test11
[root@83eb43492ae7 volume1]
# echo "test111" > test111
[root@83eb43492ae7 volume1]
# ls
test1 test11 test111
[root@83eb43492ae7 volume1]
# cd ../volume2
[root@83eb43492ae7 volume2]
# echo "test2" > test2
[root@83eb43492ae7 volume2]
# echo "test22" > test22
[root@83eb43492ae7 volume2]
# echo "test222" > test222
[root@83eb43492ae7 volume2]
# ls
test2 test22 test222
[root@83eb43492ae7 volume2]
#
然后進行這兩個數據卷的備份
[root@localhost ~]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83eb43492ae7 docker.io
/centos
"/bin/bash"
2 minutes ago Up 2 minutes wang
現在開始進行數據卷的備份操作:
為了利用數據卷容器備份,使用--volumes-from標記來創建一個加載wang容器卷的容器,並從主機掛載當前目錄到容器的
/backup
目錄。並備份wang卷中的數據,執行完成之后刪除容器--
rm
,此時備份就在當前的目錄下了。
1)備份wang容器中的
/var/volume1
數據卷數據<strong>(注意下面:命令中的-i和-t這兩個參數加不加都可以;--
rm
加上,備份后就會自動刪除這個容器,如果不加這個--
rm
參數,那么備份后的容器就會保留,docker
ps
-a就會查看到)<
/strong
>
[root@localhost ~]
# docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup1.tar /var/volume1
tar
: Removing leading `/' from member names
/var/volume1/
/var/volume1/test1
/var/volume1/test11
/var/volume1/test111
2)備份wang容器中的
/var/volume2
數據卷數據
[root@localhost ~]
# docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup2.tar /var/volume2
tar
: Removing leading `/' from member names
/var/volume2/
/var/volume2/test2
/var/volume2/test22
/var/volume2/test222
3)備份wang容器中的
/var/volume1
和
/var/volume2
數據卷數據
[root@localhost ~]
# docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup.tar /var/volume1 /var/volume2
tar
: Removing leading `/' from member names
/var/volume1/
/var/volume1/test1
/var/volume1/test11
/var/volume1/test111
/var/volume2/
/var/volume2/test2
/var/volume2/test22
/var/volume2/test222
[root@localhost ~]
# ls
anaconda-ks.cfg a.py backup1.
tar
backup2.
tar
backup.
tar
mkimage-yum.sh pipework var wang.
tar
這樣,數據卷容器中的數據就備份完成了. 簡言之就是:
先創建一個容器,並掛載要備份的容器數據卷,再掛載數據卷(
pwd
):
/backup
目錄到容器
/bakcup
,在容器中執行備份
/data
目錄到
/backup
,也就是備份到宿主機$(
pwd
):
/backup
目錄。
|
五、恢復或遷移數據卷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
可以恢復給同一個容器或者另外的容器,新建容器並解壓備份文件到新的容器數據卷
$
sudo
docker run -t -i -d -
v
/test
--name test4 ubuntu:14.04
/bin/bash
$
sudo
docker run --
rm
--volumes-from test4 -
v
$(
pwd
):
/backup
ubuntu:14.04
tar
xvf
/backup/test
.
tar
-C /
恢復之前的文件到新建卷中,執行完后自動刪除容器
test
/
test
/b
test
/d
test
/c
test
/a
-----------------------------接着上面的實例進行數據卷恢復操作--------------------------
[root@localhost ~]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
531c9d8adf4c docker.io
/centos
"/bin/bash"
2 minutes ago Up 44 seconds wang
1)恢復數據給同一個容器
測了測試效果,先刪除數據卷(注意:數據卷目錄刪除不了,只能刪除其中的數據。)
[root@localhost ~]
# docker attach wang
[root@531c9d8adf4c ~]
# ls /var/volume1
test1 test11 test111
[root@531c9d8adf4c ~]
# ls /var/volume2
test2 test22 test222
[root@531c9d8adf4c ~]
# rm -rf /var/volume1 /var/volume2
rm
: cannot remove
'/var/volume1'
: Device or resource busy
rm
: cannot remove
'/var/volume2'
: Device or resource busy
[root@531c9d8adf4c ~]
# ls /var/volume2
[root@531c9d8adf4c ~]
# ls /var/volume1
現在進行數據卷恢復,恢復數據卷中的所有數據:
[root@localhost ~]
# ls
anaconda-ks.cfg a.py backup1.
tar
backup2.
tar
backup.
tar
mkimage-yum.sh pipework var wang.
tar
注意-C后面的路徑,這個路徑表示將數據恢復到容器里的路徑。
命令中用
"/"
,即表示將backup.
tar
中的數據解壓到容器的/路徑下。后面跟什么路徑,就解壓到這個路徑下。因此這里用
"/"
[root@localhost ~]
# docker run --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
再次到容器里查看,發現數據卷里的數據已經恢復了
[root@531c9d8adf4c ~]
# ls /var/volume1
test1 test11 test111
[root@531c9d8adf4c ~]
# ls /var/volume2
test2 test22 test222
2)恢復數據給另外的容器,新建容器並解壓備份文件到新的容器數據卷
即新建一個容器huihui,將上面備份的數據卷數據恢復到這個新容器里。
[root@localhost ~]
# docker run -t -i -v /var/volume1 -v /var/volume2 --name huihui docker.io/centos /bin/bash
[root@f6ff380e0b7f var]
# ls /var/volume1
[root@f6ff380e0b7f var]
# ls /var/volume2
[root@localhost ~]
# ls
anaconda-ks.cfg a.py backup1.
tar
backup2.
tar
backup.
tar
mkimage-yum.sh pipework var wang.
tar
[root@localhost ~]
# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
[root@localhost ~]
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
813afe297b60 docker.io
/centos
"/bin/bash"
17 seconds ago Up 16 seconds huihui
這里注意一下:
新容器創建時掛載的數據卷路徑最好是和之前備份的數據卷路徑一致
如下:
1)新建容器掛載的數據卷只是備份數據卷的一部分,那么恢復的時候也只是恢復一部分數據。如下,新容器創建時只掛載
/var/volume1
[root@localhost ~]
# docker run -t -i -v /var/volume1 --name huihui docker.io/centos /bin/bash
[root@12dd8d742259 /]
# ls /var/volume1/
[root@12dd8d742259 /]
# ls /var/volume2
ls
: cannot access
/var/volume2
: No such
file
or directory
[root@localhost ~]
# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
[root@localhost ~]
#
查看容器,發現只恢復了
/var/volume1
的數據,
/var/volume2
數據沒有恢復,因為沒有容器創建時沒有掛載這個。
[root@localhost ~]
# docker run -t -i -v /var/volume1 --name huihui docker.io/centos /bin/bash
[root@12dd8d742259 /]
# ls /var/volume1/
[root@12dd8d742259 /]
# ls /var/volume2
ls
: cannot access
/var/volume2
: No such
file
or directory
2)新容器創建時只掛載
/var/volume2
[root@localhost ~]
# docker run -t -i -v /var/volume2 --name huihui docker.io/centos /bin/bash
[root@da3a3d2c95e0 /]
# ls /var/volume2/
[root@da3a3d2c95e0 /]
# ls /var/volume1
ls
: cannot access
/var/volume1
: No such
file
or directory
[root@localhost ~]
# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
[root@localhost ~]
#
[root@da3a3d2c95e0 /]
# ls /var/volume1
ls
: cannot access
/var/volume1
: No such
file
or directory
[root@da3a3d2c95e0 /]
# ls /var/volume2/
test2 test22 test222
3)如果新容器創建時掛載的數據卷目錄跟之前備份的路徑不一致
[root@localhost ~]
# docker run -t -i -v /var/huihui --name huihui docker.io/centos /bin/bash
[root@9bad9b3bde71 /]
# ls /var/huihui/
[root@9bad9b3bde71 /]
#
如果解壓時-C后面跟的路徑不是容器掛載的容器,那么數據恢復不了,如下
[root@localhost ~]
# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
發現容器內數據沒有恢復
[root@9bad9b3bde71 /]
# ls /var/huihui/
[root@9bad9b3bde71 /]
#
但是如果解壓時-C后面跟的是容器掛載的路徑,數據就能正常恢復
[root@localhost ~]
# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /var/huihui
var
/volume1/
var
/volume1/test1
var
/volume1/test11
var
/volume1/test111
var
/volume2/
var
/volume2/test2
var
/volume2/test22
var
/volume2/test222
[root@localhost ~]
#
發現容器內數據已經恢復了
[root@9bad9b3bde71 /]
# ls /var/huihui/
var
[root@9bad9b3bde71 /]
# ls /var/huihui/var/
volume1 volume2
[root@9bad9b3bde71 /]
# ls /var/huihui/var/volume1
test1 test11 test111
[root@9bad9b3bde71 /]
# ls /var/huihui/var/volume2
test2 test22 test222
|
六、刪除數據卷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
Volume 只有在下列情況下才能被刪除:
1)docker
rm
-
v
刪除容器時添加了-
v
選項
2)docker run --
rm
運行容器時添加了--
rm
選項
否則,會在
/var/lib/docker/volumes
目錄中遺留很多不明目錄。
可以使用下面方式找出,然后刪除_data目錄下的數據文件
[root@localhost volumes]
# docker inspect huihui|grep /var/lib/docker/volumes
"Source"
:
"/var/lib/docker/volumes/97aa95420e66de20abbe618fad8d0c1da31c54ce97e32a3892fa921c7942d42b/_data"
,
可以使用 docker
rm
-
v
命令在刪除容器時刪除該容器的卷。示例如下:
[root@localhost volumes]
# docker run -d -P --name huihui -v /www docker.io/centos
69199905a74cb360935e32f4e99f7f11319f6aa36033a920aa0bae25874f5c69
[root@localhost volumes]
# docker volume ls
DRIVER VOLUME NAME
local
5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local
97aa95420e66de20abbe618fad8d0c1da31c54ce97e32a3892fa921c7942d42b
local
data_volume
[root@localhost volumes]
# docker rm -vf huihui
huihui
[root@localhost volumes]
# docker volume ls
DRIVER VOLUME NAME
local
5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
local
data_volume
|
===================== Docker新版本出現docker volume 命令:創建數據卷 ======================
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
Docker 新版本中引入了 docker volume 命令來管理 Docker volume。
使用默認的
'local'
driver 創建一個volume數據卷
[root@localhost ~]
# docker volume create --name kevin
kevin
[root@localhost ~]
# docker volume ls
DRIVER VOLUME NAME
local
kevin
[root@localhost ~]
# ll /var/lib/docker/volumes
total 24
drwxr-xr-x 3 root root 19 Oct 28 00:32 kevin
-rw------- 1 root root 32768 Oct 28 00:32 metadata.db
使用這個名為kevin的數據卷
[root@localhost ~]
# docker run -d -P --name test1 -v kevin:/volume docker.io/centos
375ef74722404f5c52fde9f2ea7ea322c57e07fbac0b0e69825f077328fdb363
[root@localhost ~]
# docker inspect test1
.........
"Mounts"
: [
{
"Type"
:
"volume"
,
"Name"
:
"kevin"
,
"Source"
:
"/var/lib/docker/volumes/kevin/_data"
,
"Destination"
:
"/volume"
,
"Driver"
:
"local"
,
"Mode"
:
"z"
,
"RW"
:
true
,
"Propagation"
:
""
}
即將kevin數據卷對應在本機上的目錄
/var/lib/docker/volumes/kevin/_data
掛載給容器內的
/volume
目錄。
|