Docker容器學習梳理 - Volume資料卷使用

散盡浮華發表於2016-12-30

 

之前部署了Docker容器學習梳理--基礎環境安裝,接下來看看Docker Volume的使用。

Docker volume使用

Docker中的資料可以儲存在類似於虛擬機器磁碟的介質中,在Docker中稱為資料卷(Data Volume)。資料卷可以用來儲存Docker應用的資料,也可以用來在Docker容器間進行資料共享。
資料卷呈現給Docker容器的形式就是一個目錄,支援多個容器間共享,修改也不會影響映象。使用Docker的資料卷,類似在系統中使用 mount 掛載一個檔案系統。
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資料卷可以實現:
1)繞過“拷貝寫”系統,以達到本地磁碟IO的效能,(比如執行一個容器,在容器中對資料卷修改內容,會直接改變宿主機上的資料卷中的內容,所以是本地磁碟IO的效能,而不是先在容器中寫一份,最後還要將容器中的修改的內容拷貝出來進行同步。)
2)繞過“拷貝寫”系統,有些檔案不需要在docker commit打包進映象檔案。
3)資料卷可以在容器間共享和重用資料
4)資料卷可以在宿主和容器間共享資料
5)資料卷資料改變是直接修改的
6)資料卷是持續性的,直到沒有容器使用它們。即便是初始的資料卷容器或中間層的資料卷容器刪除了,只要還有其他的容器使用資料卷,那麼裡面的資料都不會丟失。
 
Docker資料持久化:
容器在執行期間產生的資料是不會寫在映象裡面的,重新用此映象啟動新的容器就會初始化映象,會加一個全新的讀寫入層來儲存資料。
如果想做到資料持久化,Docker提供資料卷(Data volume)或者資料容器捲來解決問題,另外還可以通過commit提交一個新的映象來儲存產生的資料。

一、建立一個資料卷

如下為容器新增一個資料卷,並將容器名改為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

二、掛載宿主機檔案或目錄到容器資料卷

可以直接掛載宿主機檔案或目錄到容器裡,可以理解為目錄對映,這樣就可以讓所有的容器共享宿主機資料,從而只需要改變宿主機的資料來源就能夠影響到所有的容器資料。

注意:
-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(這兩個資料卷目錄是在容器裡的,容器建立的時候會自動生成這兩目錄)

注意一個細節:
下面的建立命令中,沒有加-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 /]# 

檢視宿主機上與資料卷對應的目錄路徑:

[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,或是刪除了其它容器,但只要是有容器在使用該資料卷,那麼它裡面的資料就不會丟失!(除非是沒有容器在使用它們)

四、備份資料卷

$ 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資料卷資料(注意下面:命令中的-i和-t這兩個引數加不加都可以;--rm加上,備份後就會自動刪除這個容器,如果不加這個--rm引數,那麼備份後的容器就會保留,docker ps -a就會檢視到)
[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目錄。

五、恢復或遷移資料卷

可以恢復給同一個容器或者另外的容器,新建容器並解壓備份檔案到新的容器資料卷
$ 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

六、刪除資料卷

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 volume 命令:建立資料卷===============

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 目錄。

相關文章