docker挂载的时候Volume与绑定挂载bind mount区别随笔

挂载图

在这里插入图片描述

将宿主机目录挂载进docker

可以通过以下两种起Docker容器的方式,把宿主机目录挂载进入容器的对应目录:

docker run -v /docker_dir ...
docker run -v /home:/docker_dir ...

当不指明宿主机目录时,Docker会默认在宿主机上创建一个临时目录: /var/lib/docker/volumes/[VOLUME_ID]/_data作为宿主机上的被挂载目录。

查看docker的volume可以用
docker volume ls命令
在这里插入图片描述
要看具体的挂载点可以用,可以看到下图的demo中的Mountpoint就是实际宿主机中的挂载目录
docker volume inspect volume的name
在这里插入图片描述

上面是介绍的demo,下面来操作一下,开始前的volume清单
docker volume ls
在这里插入图片描述
修改mongo的dock-compose.yml中的挂载节点,改为docker的volume
在这里插入图片描述
然后运行的时候发现自动创建了mongo_testdocker volume
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
这个mongo_test volume是被自动创建的,创建的时候是空的,这个时候mongo 容器会把容器内被挂载的目标目录复制一份到外面mongo_test对应的宿主机目录/var/lib/docker/volumes/mongo_test/_data

不过我还没搞懂这个mongo_test中的前缀mongo_是哪来的

可以看到volume其实还在docker的volumes目录下面
总结:
1,多个运行的容器之间共享数据,因为挂载点如果一样存储是一样的
2,当容器停止或者删除,该卷依然存在,数据不会丢失
3,多个容器可以同时挂载相同的卷
4,当明确删除卷时,卷才会被删除
5,将容器数据存储在远程主机上或者其他存储
6,将数据从一台docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

绑定挂载(bind mount)机制

绑定挂载其实是一个inode替换的过程,在Linux操作系统中,inode可以理解为存放文件内容的对象,而dentry,也叫目录项,就是访问这个inode所使用的“指针”。

在下图中,mount --bind /home /test ,会把/home挂载到/test上,实际上相当于吧/test的/dentry,指向修改为/home的inode,这样修改/test,实际上修改的是/home对应的inode。

在这里插入图片描述

一般我们都是在docker-compose中统一配置docker容器,大多数还是选择mount bind因为可以挂单个文件,volume不行,它只能挂目录.
直接mount就像下面docker-compose.yml中的$PWD/data:/data是直接将宿主机的目录和容器对应目录共享.如果双方任一方目录不存在docker都会自动创建,如果$PWD是空目录,后面容器中的/data目录内有东西.会把后面的容器中的/data冲掉
在这里插入图片描述

总结:
1,从主机共享配置文件到容器,默认情况下,挂载主机/etc/resolv.conf到每个容器,提供dns解析
2,在docker主机上开发环境和容器之间共享源代码,例如,可以将maven tag目录挂在到容器中,每次在docker主机上构建maven项目时,容器都可以访问构建的项目包
3,当docker主机的文件或者目录结构保证与容器所需的绑定挂在一致时

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值