目录
Docke 作为容器运行底层引擎,在组织和运行时候每个程序只运行一个程序及子程序,对于启动这个容器它底层可能不止一层的镜像联合挂载的启动而成
最上层时可写层【读写层】,对于容器的所有的操作包括数据,对内容的修改都是在最上层;对下层的操作比如:删除的操作,是通过写时复制的操作来实现
什么是数据卷?
Docker 镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层
如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本任然存在,只是已经被读写层中该文件的副本所隐藏,此即 " 写时复制(COW)"机制
如图Layer0上的文件A,在Layer1上修改为C,在Layer2标记为删除D,对于最上层用户来说一定是不可见的;如图Layer0上的文件A,在Layer1上标记为删除D,在Layer2创建了一模一样同名文件/修改C,用户是可见的
对于这种层级关系,修改、删除的操作效率一般会非常的低,比较存在这么多层,还有哪些隐藏还不是真正的删除的一类的操作,对于哪些IO要求非常高的应用:redies,mysql,在实现持久化存储的时候,就会对IO性能要求很高
当我们运行了Mysql容器,如果写的数据在容器中,容器删除后数据也会删除,为了绕过这种使用的机制我们可以建立数据卷来解决,我们可以理解为在物理机之上找一个文件目录,于容器上的某一个访问目录建立关联关系,进行有效数据【临时文件】同步即使删除了容器,只要重新关联了物理的数据目录,还是可以正常访问数据的;但是容器重新关连了别的物理机相同的目录是没有数据
这样我们就可以把容器当作有生命的动态容器对象来使用,容器关闭就是容器删除的时候,但是底层镜像还在,我么们还可以重新启动;假设我们在重新的启动的时候忘记掉了那个容器管理的是物理机的那个逻辑卷,怎么办?可以的话我们可以用文件来保存那个容器对应的物理机的目录,这大多数是容器编排工具使用的,我们大部分只是通过命令行来启动进行关联,如果通过配置文件的启动,容器就会不限于启动在特定的物理机上
如图容器其A与物理机A的/data/data目录关联,物理机的/data/data/在与文件文件系统NFS的/data/data目录关联做到数据持久化存储;这样就不害怕容器A删除后没有数据,也不会局限于特定主机,可以多集群部署