设为首页 收藏本站
查看: 1032|回复: 0

[经验分享] 详解Docker挂载本地目录及实现文件共享

[复制链接]

尚未签到

发表于 2018-5-26 11:43:41 | 显示全部楼层 |阅读模式
docker挂载本地目录的方法总结:
Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。
譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:
# docker run -it -v /test:/soft centos /bin/bash
这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
貌似简单,其实不然,下面我们来验证一下:
一、容器目录不可以为相对路径
[root@localhost ~]# docker run -it -v /test:soft centos /bin/bash
invalid value "/test:soft" for flag -v: soft is not an absolute path
See 'docker run --help'.直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线“/”开头。
二、宿主机目录如果不存在,则会自动生成
如果宿主机中存在/test目录,首先删除它
[root@localhost ~]# rm -rf /test[root@localhost ~]# ls /bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var启动容器
[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash[root@a487a3ca7997 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  soft  srv  sys  tmp  usr  var查看宿主机,发现新增了一个/test目录
[root@localhost ~]# ls /bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var三、宿主机的目录如果为相对路径呢?
这次,我们换个目录名test1试试
# docker run -it -v test1:/soft centos /bin/bash再到宿主机上查看是否新增了一个/test1目录,结果没有,是不是因为我用的是相对路径,所以生成的test1目录在当前目录下,结果发现还是没有。那容器内的/soft目录挂载到哪里去了?通过docker inspect命令,查看容器“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 ~]# docker run -it -v /test2 centos /bin/bash[root@ea24067bc902 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  test2  tmp  usr  var同样使用docker inspect命令查看宿主机的挂载目录
  "Mounts":[
        {
            "Name": "96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a",
            "Source": "/var/lib/docker/volumes/96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a/_data",
            "Destination": "/test2",
            "Driver": "local",
            "Mode": "",
            "RW": true
        }    ],  可以看出,同3中的结果类似,只不过,它不是相对路径的目录名,而是随机生成的一个目录名。
五、如果在容器内修改了目录的属主和属组,那么对应的挂载点是否会修改呢?
首先开启一个容器,查看容器内/soft目录的属性
[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash[root@b5ed8216401f /]# ll -d /soft/drwxr-xr-x 2 root root 6 Sep 24 03:48 /soft/查看宿主机内/test目录的属性
[root@localhost ~]# ll -d /test/drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/在容器内新建用户,修改/soft的属主和属组
[root@b5ed8216401f /]# useradd victor[root@b5ed8216401f /]# chown -R victor.victor /soft/[root@b5ed8216401f /]# ll -d /soft/drwxr-xr-x 2 victor victor 6 Sep 24 03:48 /soft/再来看看宿主机内/test目录的属主和属组是否会发生变化?
[root@localhost ~]# ll -d /test/drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/竟然变为mycat了。。。
原来,这个与UID有关系,UID,即“用户标识号”,是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。
首先查看容器内victor对应的UID是多少,
[root@b5ed8216401f /]# cat /etc/passwd | grep victor
victor:x:1000:1000::/home/victor:/bin/bashvictor的UID为1000,那么宿主机内1000对应的用户是谁呢?
[root@localhost ~]# cat /etc/passwd |grep 1000mycat:x:1000:1000::/home/mycat:/bin/bash可以看出,宿主机内UID 1000对应的用户是mycat。
六、容器销毁了,在宿主机上新建的挂载目录是否会消失?
在这里,主要验证两种情况:一、指定了宿主机目录,即 -v /test:/soft。二、没有指定宿主机目录,即-v /soft
第一种情况:
  [root@localhost~]# rm-rf/test--首先删除宿主机的/test目录
[root@localhost ~]# ls /    --可以看到,宿主机上无/test目录bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var[root@localhost ~]# docker run -it --name=centos_test -v /test:/soft centos /bin/bash  --启动容器,为了删除方便,我用--name参数指定了容器的名字[root@82ad7f3a779a /]# exitexit[root@localhost ~]# docker rm centos_test   --删除容器
centos_test[root@localhost ~]# ls /   --发现 /test目录依旧存在bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var  可以看出,即便容器销毁了,新建的挂载目录不会消失。进一步也可验证,如果宿主机目录的属主和属组发生了变化,容器销毁后,宿主机目录的属主和属组不会恢复到挂载之前的状态。
第二种情况,通过上面的验证知道,如果没有指定宿主机的目录,则容器会在/var/lib/docker/volumes/随机配置一个目录,那么我们看看这种情况下的容器销毁是否会导致相应目录的删除
首先启动容器
[root@localhost ~]# docker run -it --name=centos_test -v /soft centos /bin/bash[root@6b75579ec934 /]# exitexit通过docker inspect命令查看容器在宿主机上生成的挂载目录
  "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 ~]# docker rm centos_test
centos_test[root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301
total 0drwxr-xr-x 2 root root 6 Sep 24 14:25 _data发现该目录依旧存在,即便重启了docker服务,该目录依旧存在
[root@localhost ~]# systemctl restart docker[root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301
total 0drwxr-xr-x 2 root root 6 Sep 24 14:25 _data七、挂载宿主机已存在目录后,在容器内对其进行操作,报“Permission denied”。
可通过两种方式解决:
1> 关闭selinux。
临时关闭:# setenforce 0
永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。
2> 以特权方式启动容器
指定--privileged参数
如:# docker run -it --privileged=true -v /test:/soft centos /bin/bash
docker挂载本地目录实现文件共享:


Docker可以支持把一个宿主机上的目录挂载到镜像里。
?
  
1
docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash

通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。
  
DSC0000.png
现在镜像内就可以共享宿主机里的文件了。
默认挂载的路径权限为读写。如果指定为只读可以用:ro
?
  

1    docker run -it -v /home/dock/Downloads:/usr/Downloads:ro ubuntu64 /bin/bash
docker还提供了一种高级的用法。叫数据卷。
数据卷:“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。
看示例:
  

?
  
1
docker run -v /home/dock/Downloads:/usr/Downloads  --name dataVol ubuntu64 /bin/bash

创建一个普通的容器。用--name给他指定了一个名(不指定的话会生成一个随机的名子)。
  
DSC0001.png
再创建一个新的容器,来使用这个数据卷。
?
  
1
docker run -it --volumes-from dataVol ubuntu64 /bin/bash

--volumes-from用来指定要从哪个数据卷来挂载数据。
  
DSC0002.png
本文出自http://blog.csdn.net/magerguo/article/details/72514813

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-481324-1-1.html 上篇帖子: docker base auth 和kubernets结合 下篇帖子: jenkins docker
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表