详解Docker目录挂载的方法总结
Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。
譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:
#dockerrun-it-v/test:/softcentos/bin/bash
这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
貌似简单,其实不然,下面我们来验证一下:
一、容器目录不可以为相对路径
[root@localhost~]#dockerrun-it-v/test:softcentos/bin/bash invalidvalue"/test:soft"forflag-v:softisnotanabsolutepath See'dockerrun--help'.
直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线“/”开头。
二、宿主机目录如果不存在,则会自动生成
如果宿主机中存在/test目录,首先删除它
[root@localhost~]#rm-rf/test [root@localhost~]#ls/ binbootdevetchomeliblib64mediamntoptprocrootrunsbinsrvsystmpusrvar
启动容器
[root@localhost~]#dockerrun-it-v/test:/softcentos/bin/bash [root@a487a3ca7997/]#ls bindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsoftsrvsystmpusrvar
查看宿主机,发现新增了一个/test目录
[root@localhost~]#ls/ binbootdevetchomeliblib64mediamntoptprocrootrunsbinsrvsystesttmpusrvar
三、宿主机的目录如果为相对路径呢?
这次,我们换个目录名test1试试
#dockerrun-it-vtest1:/softcentos/bin/bash
再到宿主机上查看是否新增了一个/test1目录,结果没有,是不是因为我用的是相对路径,所以生成的test1目录在当前目录下,结果发现还是没有。那容器内的/soft目录挂载到哪里去了?通过dockerinspect命令,查看容器“Mounts”那一部分,我们可以得到这个问题的答案。
"Mounts":[ { "Name":"test1", "Source":"/var/lib/docker/volumes/test1/_data", "Destination":"/soft", "Driver":"local", "Mode":"z", "RW":true } ],
可以看出,容器内的/soft目录挂载的是宿主机上的/var/lib/docker/volumes/test1/_data目录
原来,所谓的相对路径指的是/var/lib/docker/volumes/,与宿主机的当前目录无关。
四、如果只是-v指定一个目录,这个又是如何对应呢?
启动一个容器
[root@localhost~]#dockerrun-it-v/test2centos/bin/bash [root@ea24067bc902/]#ls bindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystest2tmpusrvar
同样使用dockerinspect命令查看宿主机的挂载目录
"Mounts":[ { "Name":"96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a", "Source":"/var/lib/docker/volumes/96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a/_data", "Destination":"/test2", "Driver":"local", "Mode":"", "RW":true } ],
可以看出,同3中的结果类似,只不过,它不是相对路径的目录名,而是随机生成的一个目录名。
五、如果在容器内修改了目录的属主和属组,那么对应的挂载点是否会修改呢?
首先开启一个容器,查看容器内/soft目录的属性
[root@localhost~]#dockerrun-it-v/test:/softcentos/bin/bash [root@b5ed8216401f/]#ll-d/soft/ drwxr-xr-x2rootroot6Sep2403:48/soft/
查看宿主机内/test目录的属性
[root@localhost~]#ll-d/test/ drwxr-xr-x2rootroot6Sep2411:48/test/
在容器内新建用户,修改/soft的属主和属组
[root@b5ed8216401f/]#useraddvictor [root@b5ed8216401f/]#chown-Rvictor.victor/soft/ [root@b5ed8216401f/]#ll-d/soft/ drwxr-xr-x2victorvictor6Sep2403:48/soft/
再来看看宿主机内/test目录的属主和属组是否会发生变化?
[root@localhost~]#ll-d/test/ drwxr-xr-x2mycatmycat6Sep2411:48/test/
竟然变为mycat了。。。
原来,这个与UID有关系,UID,即“用户标识号”,是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。
首先查看容器内victor对应的UID是多少,
[root@b5ed8216401f/]#cat/etc/passwd|grepvictor victor:x:1000:1000::/home/victor:/bin/bash
victor的UID为1000,那么宿主机内1000对应的用户是谁呢?
[root@localhost~]#cat/etc/passwd|grep1000 mycat:x:1000:1000::/home/mycat:/bin/bash
可以看出,宿主机内UID1000对应的用户是mycat。
六、容器销毁了,在宿主机上新建的挂载目录是否会消失?
在这里,主要验证两种情况:一、指定了宿主机目录,即-v/test:/soft。二、没有指定宿主机目录,即-v/soft
第一种情况:
[root@localhost~]#rm-rf/test--首先删除宿主机的/test目录 [root@localhost~]#ls/--可以看到,宿主机上无/test目录 binbootdevetchomeliblib64mediamntoptprocrootrunsbinsrvsystmpusrvar [root@localhost~]#dockerrun-it--name=centos_test-v/test:/softcentos/bin/bash--启动容器,为了删除方便,我用--name参数指定了容器的名字 [root@82ad7f3a779a/]#exit exit [root@localhost~]#dockerrmcentos_test--删除容器 centos_test [root@localhost~]#ls/--发现/test目录依旧存在 binbootdevetchomeliblib64mediamntoptprocrootrunsbinsrvsystesttmpusrvar
可以看出,即便容器销毁了,新建的挂载目录不会消失。进一步也可验证,如果宿主机目录的属主和属组发生了变化,容器销毁后,宿主机目录的属主和属组不会恢复到挂载之前的状态。
第二种情况,通过上面的验证知道,如果没有指定宿主机的目录,则容器会在/var/lib/docker/volumes/随机配置一个目录,那么我们看看这种情况下的容器销毁是否会导致相应目录的删除
首先启动容器
[root@localhost~]#dockerrun-it--name=centos_test-v/softcentos/bin/bash [root@6b75579ec934/]#exit exit
通过dockerinspect命令查看容器在宿主机上生成的挂载目录
"Mounts":[ { "Name":"b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301", "Source":"/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data", "Destination":"/soft", "Driver":"local", "Mode":"", "RW":true } ],
对应的是/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data目录
销毁容器,看目录是否存在
[root@localhost~]#dockerrmcentos_test centos_test [root@localhost~]#ll/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301 total0 drwxr-xr-x2rootroot6Sep2414:25_data
发现该目录依旧存在,即便重启了docker服务,该目录依旧存在
[root@localhost~]#systemctlrestartdocker [root@localhost~]#ll/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301 total0 drwxr-xr-x2rootroot6Sep2414:25_data
七、挂载宿主机已存在目录后,在容器内对其进行操作,报“Permissiondenied”。
可通过两种方式解决:
1>关闭selinux。
临时关闭:#setenforce0
永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。
2>以特权方式启动容器
指定--privileged参数
如:
#dockerrun-it--privileged=true-v/test:/softcentos/bin/bash
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。