挂载图

docker volume from 继承哪些 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命令

docker volume from 继承哪些 docker volume bind mount_Docker_02


要看具体的挂载点可以用,可以看到下图的demo中的Mountpoint就是实际宿主机中的挂载目录

docker volume inspect volume的name

docker volume from 继承哪些 docker volume bind mount_docker_03

上面是介绍的demo,下面来操作一下,开始前的volume清单

docker volume ls

docker volume from 继承哪些 docker volume bind mount_数据_04


修改mongo的dock-compose.yml中的挂载节点,改为docker的volume

docker volume from 继承哪些 docker volume bind mount_数据_05


然后运行的时候发现自动创建了mongo_testdocker volume

docker volume from 继承哪些 docker volume bind mount_docker_06


docker volume from 继承哪些 docker volume bind mount_Docker_07

docker volume from 继承哪些 docker volume bind mount_Docker_08

docker volume from 继承哪些 docker volume bind mount_Docker_09


这个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 volume from 继承哪些 docker volume bind mount_docker_10

一般我们都是在docker-compose中统一配置docker容器,大多数还是选择mount bind因为可以挂单个文件,volume不行,它只能挂目录.

直接mount就像下面docker-compose.yml中的$PWD/data:/data是直接将宿主机的目录和容器对应目录共享.如果双方任一方目录不存在docker都会自动创建,如果$PWD是空目录,后面容器中的/data目录内有东西.会把后面的容器中的/data冲掉

docker volume from 继承哪些 docker volume bind mount_Docker_11

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