挂载图
将宿主机目录挂载进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_test
的docker 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主机的文件或者目录结构保证与容器所需的绑定挂在一致时