
上一篇:Docker(7)—自定義鏡像并設定鏡像挂載
1.什麼是匿名挂載和具名挂載?
所謂匿名挂載(匿名卷),即在進行資料卷挂載的時候不指定主控端的資料卷目錄,
-v
指令之後直接跟上
容器内資料卷所在的路徑
。
而具名挂載(命名卷)即在進行資料卷挂載的時候既指定
主控端資料卷所在路徑
,又指定
容器資料卷所在路徑
先通過下面這種指令的方式感受一下兩者的差別:
#匿名挂載(匿名卷)
docker run -d -p 6379:6379 --name mycentos -v /src/volume01
#具名挂載(命名卷) -v 主控端資料卷所在路徑:容器資料卷所在路徑
docker run -d -p 6379:6379 --name mycentos -v /home/docker_volume:/src/volume01
除此種方式之外,我們也可以在在dockerfile建構docker鏡像的時候使用
VOLUME
保留字來對資料卷進行挂載,此種挂載方式是匿名挂載的,我們可以指定一個或多個資料卷,這樣隻要啟動了該自定義容器鏡像,則會自動進行資料挂載,不會出現
忘記挂載導緻資料不安全
的情況。
VOLUME ["容器内資料卷路徑1","容器内資料卷路徑2"……]
由于匿名挂載的時候隻是指定了
容器内資料卷的路徑
,至于該
容器内資料卷的路徑
到底和
主控端
中的哪個檔案進行資料挂載,可以使用下面指令進行檢視:
#檢視目前正在運作的鏡像容器id
[root@privateCloud / ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38d2810685e1 fc67f9b77899 "/bin/sh -c /bin/bash" 2 hours ago Up 2 hours 80/tcp focused_williams
#使用 inspect 檢視鏡像資訊
[root@privateCloud / ]# docker inspect 38d2810685e1(這是容器id)
#在彈出來的資訊中找到下面的資料:
"Mounts": [
{
"Type": "volume",
"Name": "040a163ac1eb50ebc53b9014f2438baf3583491bfc38c0ae47c9d08ec4b009f8",
"Source": "/var/lib/docker/volumes/040a163ac1eb50ebc53b9014f2438baf3583491bfc38c0ae47c9d08ec4b009f8/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "b7e238d439bb63d681d0c962bf44632fc76f2e82e249964023842198bfb3c16c",
"Source": "/var/lib/docker/volumes/b7e238d439bb63d681d0c962bf44632fc76f2e82e249964023842198bfb3c16c/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
從上面的 Mounts 中可以看到 Destination 和 Source 分别就是 容器内的資料卷 和 主控端内的容器卷
2.匿名卷和命名卷的差別?
命名卷在用過一次之後以後挂載容器的時候還是可以繼續使用,是以一般在需要儲存資料的時候使用
命名卷
的方式,下面例子用以展示
命名卷
對于資料的儲存方式:
#1.檢視目前的鏡像
[root@privateCloud / ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 4 months ago 237MB
#2.啟動centos鏡像并且使用命名挂載的方式進行資料卷挂載(此centos是官網下載下傳的官方鏡像包)
[root@privateCloud / ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac
48dece440eb377a466d72327895c5ed24a75823e70ffebf40fee0e2fe9e4c66e
#3.檢視剛剛啟動的容器id
[root@privateCloud / ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48dece440eb3 470671670cac "/bin/bash" 4 minutes ago Up 4 minutes mycentos
#4.進入容器内部
[root@privateCloud / ]# docker exec -it 48dece440eb3 /bin/bash
#5.檢視/usr/local/,發現多了一個 volume01檔案夾
[root@48dece440eb3 /]# cd /usr/local/
[root@48dece440eb3 local]# ls
bin etc games include lib lib64 libexec sbin share src volume01
#6.建立一個txt檔案
[root@48dece440eb3 local]# cd volume01/
[root@48dece440eb3 volume01]# touch file01.txt
[root@48dece440eb3 volume01]# vi file01
#随便輸入一段話
this file create in container
[root@48dece440eb3 volume01]# ls
file01.txt
#7.使用 ctrl+p+Q 不停止容器退出
#8.進行主控端 容器卷 所在路徑
[root@privateCloud /home/centos_volume ]# cd /home/centos_volume/
#9.發現多了一個 file01檔案,說明資料挂載成功
[root@privateCloud /home/centos_volume ]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 1 17:17 file01.txt
#10.此時将啟動的容器停掉:
[root@privateCloud /home/centos_volume ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48dece440eb3 470671670cac "/bin/bash" 8 minutes ago Up 8 minutes mycentos
[root@privateCloud /home/centos_volume ]# docker stop 48dece440eb3
48dece440eb3
#11.然後重新進入該容器
[root@privateCloud /usr/local ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 4 months ago 237MB
[root@privateCloud /usr/local ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac
#12.直接到 /usr/local/volume01路徑
[root@privateCloud /usr/local ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a842a7e8d514 470671670cac "/bin/bash" 2 minutes ago Up 2 minutes mycentos
[root@privateCloud /usr/local ]# docker exec -it a842a7e8d514 /bin/bash
[root@a842a7e8d514 /]# cd /usr/local/volume01/
[root@a842a7e8d514 volume01]# ls
file01.txt
#13.檢視該file01.txt檔案
[root@a842a7e8d514 volume01]# cat file01.txt
this file create in container
#1.檢視鏡像
[root@privateCloud /usr/local ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 4 months ago 237MB
#2.使用匿名挂載的方式隻指定容器内資料卷所在路徑啟動鏡像
[root@privateCloud /usr/local ]# docker run -it -d --name mycentos -v /usr/local/centos 470671670cac
175034d3759bb678877fcaaba6db2b9cd50aa9e61a7cb5770a48370032f07d1f
#3.進入 容器内資料卷所在路徑
[root@privateCloud /usr/local ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
175034d3759b 470671670cac "/bin/bash" About a minute ago Up About a minute mycentos
[root@privateCloud /usr/local ]# docker exec -it 175034d3759b /bin/bash
[root@175034d3759b /]# cd /usr/local/centos/
#4.編輯一個檔案
[root@175034d3759b centos]# vi file02
[root@175034d3759b centos]# cat file02
this file create in container222222222
#5.使用ctrl+p+Q指令不停止并退出容器
#6.檢視目前容器資料卷挂載在主控端的檔案路徑
[root@privateCloud /home ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
175034d3759b 470671670cac "/bin/bash" 7 minutes ago Up 7 minutes mycentos
[root@privateCloud /home ]# docker inspect 175034d3759b
#7.從顯示的資訊中找到Mounts
"Mounts": [
{
"Type": "volume",
"Name": "226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e",
"Source": "/var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data",
"Destination": "/usr/local/centos",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
#8.進入主控端挂載的路徑目錄中
[root@privateCloud /home ]# cd /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data
[root@privateCloud /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data ]# ll
total 4
-rw-r--r-- 1 root root 39 Jun 1 17:45 file02
#9.發現該目錄下也生成了file02檔案
[root@privateCloud /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data ]# cat file02
this file create in container222222222
#10.關閉目前容器并重新使用匿名方式啟動
[root@privateCloud / ]# docker run -it -d -v /usr/local/centos 470671670cac
19a23edc6aebd23109437cac91e0011737d3e0cb29d0fad99ea884193409ec9e
#11.進入容器
[root@privateCloud / ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19a23edc6aeb 470671670cac "/bin/bash" 32 seconds ago Up 32 seconds laughing_wiles
[root@privateCloud / ]# docker exec -it 19a23edc6aeb /bin/bash
[root@19a23edc6aeb /]# cd /usr/local/centos/
#12.發現重新啟動之後,該資料卷之下的資料沒有了,但是命名卷在重新開機之後資料就還在
[root@19a23edc6aeb centos]# ls
[root@19a23edc6aeb centos]#