本文共 7872 字,大约阅读时间需要 26 分钟。
所谓匿名挂载(匿名卷),即在进行数据卷挂载的时候不指定宿主机的数据卷目录,-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 psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES38d2810685e1 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 分别就是 容器内的数据卷 和 宿主机内的容器卷
命名卷在用过一次之后以后挂载容器的时候还是可以继续使用,所以一般在需要保存数据的时候使用命名卷
的方式,下面例子用以展示命名卷
对于数据的保存方式:
例:
#1.查看目前的镜像[root@privateCloud / ]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 470671670cac 4 months ago 237MB#2.启动centos镜像并且使用命名挂载的方式进行数据卷挂载(此centos是官网下载的官方镜像包)[root@privateCloud / ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac48dece440eb377a466d72327895c5ed24a75823e70ffebf40fee0e2fe9e4c66e#3.查看刚刚启动的容器id[root@privateCloud / ]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES48dece440eb3 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]# lsbin 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]# lsfile01.txt#7.使用 ctrl+p+Q 不停止容器退出#8.进行宿主机 容器卷 所在路径[root@privateCloud /home/centos_volume ]# cd /home/centos_volume/#9.发现多了一个 file01文件,说明数据挂载成功[root@privateCloud /home/centos_volume ]# lltotal 0-rw-r--r-- 1 root root 0 Jun 1 17:17 file01.txt#10.此时将启动的容器停掉:[root@privateCloud /home/centos_volume ]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES48dece440eb3 470671670cac "/bin/bash" 8 minutes ago Up 8 minutes mycentos[root@privateCloud /home/centos_volume ]# docker stop 48dece440eb348dece440eb3#11.然后重新进入该容器[root@privateCloud /usr/local ]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos 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 psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa842a7e8d514 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]# lsfile01.txt#13.查看该file01.txt文件[root@a842a7e8d514 volume01]# cat file01.txt this file create in container
匿名卷则是随着容器的建立而建立,随着容器的关闭而消亡。匿名卷一般用来存储无关痛痒的数据。
#1.查看镜像[root@privateCloud /usr/local ]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 470671670cac 4 months ago 237MB#2.使用匿名挂载的方式只指定容器内数据卷所在路径启动镜像[root@privateCloud /usr/local ]# docker run -it -d --name mycentos -v /usr/local/centos 470671670cac175034d3759bb678877fcaaba6db2b9cd50aa9e61a7cb5770a48370032f07d1f#3.进入 容器内数据卷所在路径[root@privateCloud /usr/local ]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES175034d3759b 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 psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES175034d3759b 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 ]# lltotal 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 psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES19a23edc6aeb 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]#
转载地址:http://jphwi.baihongyu.com/