不知道你在使用docker的时候,有没有注意到 volume mount和bind mount的使用? 进一步说,他们之间的区别到底是什么?,接下来的内容,我们就为你揭开他们的神秘面纱。,首先,说相同之处:,再来说说,他们的不同之处:,此外,与将数据持久化到容器的可写层相比,volume通常是更好的选择,因为volume不会增加使用它的容器的大小,而且volume的内容存在于给定容器的生命周期之外。,也就是说,当容器被移除了之后,volume中的内容还是可以独立存在的。,下图演示了volume和bind mount,以及和容器之间的关系图:,
,我们可以看到:,下面,我们分别展示,volume的挂载、使用的一些操作,我们可以通过下面的命令创建一个容器,使用volume,其中:-v选项,后面的第一个参数myvol2就是volume的名字,如果在容器使用volume时,volume不存在,那么会自动创建这个volume,可以查看该volume在docker 宿主机上的具体的路径,Mountpoint就指明了这个volume在文件系统上的具体位置。,容器通过:-v myvol2:/app 将volume挂载到容器的/app目录中,向/app目录写文件:,查看卷中的文件是否已经被创建,没错,确实这个文件就是写到了这个目录中了。,注意:这个volume的内容写的过程是由docker来进行管理的。,查看容器中mount信息,可以看到Mounts部分的信息:,容器移除后,volume是否还存在吗?,和你想的一模一样,volume还在,其中的写入的内容,仍然存在,注意!,移除容器和移除volume是2个独立的操作。,另外一个 非常重要的点 :如果将volume挂载到目录中,如果目录中原来就是有文件或子目录的,那么挂载之后,会将内容拷贝到卷中来。,啥意思?,比如,我们有个镜像,在/app目录下有个a.log文件,挂载数据卷,发现容器运行后,/app目录下的文件,被拷贝到volume中,而没有,覆盖!这个点,十分的有意思!之前肯定你没有关注过!,如何以只读的方式挂载volume,方法非常的简单:,只需要加上ro选项即可,示例:,查看容器的Mounts部分的信息,发现:"RW": false,也就是,非Read-Write的模式,试试向其中写入文件:,和你猜的一样,会提示:只读文件系统。,OK,OK,说完了volume的原理,相关的操作,接下来,要看的就是bind mount,使用bind mount时,将宿主机上的文件或者目录挂载到容器上。文件或者目录在主机上,是以绝对路径的方式来使用。,相比之下,当使用volume时,在主机上的Docker存储目录中创建一个新目录,由Docker管理该目录的内容。,要挂载的文件或目录不需要在Docker主机上已经存在。如果它还不存在,则按需创建它。bind mount的性能非常好,但是它们依赖于主机的文件系统具有特定的目录结构。,建议:如果你正在开发新的Docker应用程序,请考虑使用命名的volume。因为,对于bind mount来说,你不能使用Docker CLI命令来直接管理。,使用以下得命令,将一个容器通过bind 挂载的方式,将宿主机的目录,挂载到容器中,查看容器的bind挂载情况,可以看到,关闭、删除容器,OK,接下来的这个点,非常的关键,如果绑定挂载到容器中的一个非空的目录会如何?,nginx镜像中/usr/share/nginx/html是非空的,有登录页,发现,挂载了之后,是空的,也就是把镜像中的内容给覆盖了。,这个和volume是一个巨大的区别! 注意 !,OK,我们这里总结一下,让你更好的理解voLume 和 bind 类型的挂载的区别:,后面的文章中,会带你看看,如何安装volume驱动,来创建特定类型的volume,实现多个节点间的数据共享······