千家信息网

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

发表于:2025-02-12 作者:千家信息网编辑
千家信息网最后更新 2025年02月12日,这篇文章给大家分享的是有关Docker如何挂载本地目录及实现文件共享的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。docker挂载本地目录的方法总结:Docker容器启动的
千家信息网最后更新 2025年02月12日Docker如何挂载本地目录及实现文件共享

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

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/bashinvalid value "/test:soft" for flag -v: soft is not an absolute pathSee '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 /]# lsbin 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 /]# 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目录的属性

[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 victorvictor:x:1000:1000::/home/victor:/bin/bash

victor的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_testcentos_test[root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301total 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/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参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。

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

默认挂载的路径权限为读写。如果指定为只读可以用: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 run -it --volumes-from dataVol ubuntu64 /bin/bash

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

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

目录 容器 宿主 宿主机 路径 数据 用户 文件 参数 情况 生成 方式 验证 冒号 命令 目录名 结果 镜像 信息 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 excel分类汇总数据库 王者荣耀战队服务器地址怎么查 服务器搭建邮件poster r软件如何做数据库的合并 学电脑软件开发学校 软件开发遇到的问题有哪些 东莞无限软件开发零售价 主动网络技术与虚拟专用网 网络安全实战演练招募 东营卫星同步时钟软件开发 怀化同路人软件开发有限公司 网络安全管理指标设计 nas达芬奇协同数据库体验 服务器零接触运维特性 跑跑卡丁车手游进不去服务器 网络安全等级评测公司资质 阿里云服务器版本是什么 软件开发公司成本账务处理 大手牵小手网络安全 服务器安全证书下载安装 网络安全培训的工资 天玑科技是工业互联网吗 2018年最新网络安全事件 文化贸易的数据用什么数据库 顺义区推广软件开发多少钱 自动化和网络安全哪个好 阿里云服务器版本是什么 姑苏区专业网络技术品质保障 网络安全军工概念股票有哪些 直播软件开发需要
0