首页 > 如何实现镜像文件的挂载 > 如何实现镜像文件的挂载,Docker如何挂载本地目录及实现文件共享

如何实现镜像文件的挂载,Docker如何挂载本地目录及实现文件共享

互联网 2021-09-16 17:57:54 Tags:如何实现镜像文件的挂载

如何实现镜像文件的挂载CSDN社区镜像挂载的工作原理 Oracle Solaris 管理:网络服务win7挂载iso镜像文件教程 forum.huawei.com利用Dism++制作一个属于自己的镜像文件 黑客入门Docker如何挂载本地目录及实现文件共享 服务器 亿速云docker 挂载宿主机文件目录 简书docker 查看容器的挂载目录操作 / 张 张生荣mou格式文件如何打开百度知道 Baidu

Docker如何挂载本地目录及实现文件共享发布时间:2021-08-21 10:43:31来源:亿速云阅读:67作者:小新栏目:服务器

这篇文章给大家分享的是有关Docker如何挂载本地目录及实现文件共享的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

docker挂载本地目录的方法总结:

Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。

譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:

# docker run -it -v /test:/soft centos /bin/bash

这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。

貌似简单,其实不然,下面我们来验证一下:

一、容器目录不可以为相对路径

[[email protected] ~]# docker run -it -v /test:soft centos /bin/bashinvalid value "/test:soft" for flag -v: soft is not an absolute pathSee 'docker run --help'.

直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线“/”开头。

二、宿主机目录如果不存在,则会自动生成

如果宿主机中存在/test目录,首先删除它

[[email protected] ~]# rm -rf /test[[email protected] ~]# ls /bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

启动容器

[[email protected] ~]# docker run -it -v /test:/soft centos /bin/bash[[email protected] /]# lsbin dev etc home lib lib64 lost+found media mnt opt proc root run sbin soft srv sys tmp usr var

查看宿主机,发现新增了一个/test目录

[[email protected] ~]# 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指定一个目录,这个又是如何对应呢?

启动一个容器

[[email protected] ~]# docker run -it -v /test2 centos /bin/bash[[email protected] /]# lsbin 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目录的属性

[[email protected] ~]# docker run -it -v /test:/soft centos /bin/bash[[email protected] /]# ll -d /soft/drwxr-xr-x 2 root root 6 Sep 24 03:48 /soft/

查看宿主机内/test目录的属性

[[email protected] ~]# ll -d /test/drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/

在容器内新建用户,修改/soft的属主和属组

[[email protected] /]# useradd victor[[email protected] /]# chown -R victor.victor /soft/[[email protected] /]# ll -d /soft/drwxr-xr-x 2 victor victor 6 Sep 24 03:48 /soft/

再来看看宿主机内/test目录的属主和属组是否会发生变化?

[[email protected] ~]# ll -d /test/drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/

竟然变为mycat了。。。

原来,这个与UID有关系,UID,即“用户标识号”,是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。

首先查看容器内victor对应的UID是多少,

[[email protected] /]# cat /etc/passwd | grep victorvictor:x:1000:1000::/home/victor:/bin/bash

victor的UID为1000,那么宿主机内1000对应的用户是谁呢?

[[email protected] ~]# cat /etc/passwd |grep 1000mycat:x:1000:1000::/home/mycat:/bin/bash

可以看出,宿主机内UID 1000对应的用户是mycat。

六、容器销毁了,在宿主机上新建的挂载目录是否会消失?

在这里,主要验证两种情况:一、指定了宿主机目录,即 -v /test:/soft。二、没有指定宿主机目录,即-v /soft

第一种情况:

[[email protected] ~]# rm-rf/test

--首先删除宿主机的/test目录

[[email protected] ~]# ls /  --可以看到,宿主机上无/test目录bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var[[email protected] ~]# docker run -it --name=centos_test -v /test:/soft centos /bin/bash --启动容器,为了删除方便,我用--name参数指定了容器的名字[[email protected] /]# exitexit[[email protected] ~]# docker rm centos_test  --删除容器centos_test[[email protected] ~]# 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/随机配置一个目录,那么我们看看这种情况下的容器销毁是否会导致相应目录的删除

首先启动容器

[[email protected] ~]# docker run -it --name=centos_test -v /soft centos /bin/bash[[email protected] /]# 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目录

销毁容器,看目录是否存在

[[email protected] ~]# docker rm centos_testcentos_test[[email protected] ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301total 0drwxr-xr-x 2 root root 6 Sep 24 14:25 _data

发现该目录依旧存在,即便重启了docker服务,该目录依旧存在

[[email protected] ~]# systemctl restart docker[[email protected] ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301total 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可以支持把一个宿主机上的目录挂载到镜像里。

docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash

通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。

Docker如何挂载本地目录及实现文件共享

现在镜像内就可以共享宿主机里的文件了。

默认挂载的路径权限为读写。如果指定为只读可以用:ro

docker run -it -v /home/dock/Downloads:/usr/Downloads:ro ubuntu64 /bin/bash

docker还提供了一种高级的用法。叫数据卷。

数据卷:“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。

看示例:

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

创建一个普通的容器。用--name给他指定了一个名(不指定的话会生成一个随机的名子)。

Docker如何挂载本地目录及实现文件共享

再创建一个新的容器,来使用这个数据卷。

docker run -it --volumes-from dataVol ubuntu64 /bin/bash

--volumes-from用来指定要从哪个数据卷来挂载数据。

Docker如何挂载本地目录及实现文件共享

感谢各位的阅读!关于“Docker如何挂载本地目录及实现文件共享”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

docker上一篇新闻:在Cassandra集群中表的数据清理与恢复下一篇新闻:pw域名是什么香港云服务器10000元红包免费领

红包可用于(云服务器、高防服务器、裸金属服务器、高防IP、云数据库、CDN加速)购买和续费

猜你喜欢如何在Linux服务器中创建假桌面运行模拟浏览器有头模式Tomcat是怎么处理Http请求的微服务与API有什么区别SpringBoot在怎么外置Tomcat如何使用Nginx搭建高可用高并发的Wcf集群如何在CentOS7上搭建NginxTcp协议怎么实现HTTP服务器Node.js 中使用反向代理的原因是什么Nginx 中怎么实现动静分离与负载均衡Nginx的作用有哪些
免责声明:非注明原创的信息,皆为程序自动获取自互联网,目的在于传递更多信息,不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给网站管理员发送电子邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),网站管理员将在收到邮件24小时内删除。