数据卷特性

 

数据卷特性

怎么样来做数据存储,或者数据存储到底有那些特点。

1、docker 镜像由多个只读层叠加而成(也就是叠加在一起通过的是我们的AUFS联合文件系统),启动容器时,docker会加载只读镜像层,并且在镜像栈顶部加一个读写层(这一层就是我们之前所说的可写层)

2、如果运行的容器修改了现有的一个已经存在的文件,那么该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本依然存在,只是已经被读写层中的该文件的副本所隐藏,次即“写时复制”机制。请看下图解释

在这张图中由layer0、layer1、layer2 三层,这三层呢我们就把他假设为拼接在一起,对于我们上层的用户来说就是一个完整的镜像,但是镜像中的每一层都不太一样,比如 A 文件在layer0中写的是A ,但是到了layer1 层中就改为了 D 文件。以此类推,也就是每一个层中显示的文件都不一样。

那如果我们在拿这个镜像运行为了一个容器,在这个容器的上层呢会加入一个可写层,但是可写层上面默认是空白的。不会包含下面这layer0、1、2层的所有文件,那如果我想把这个文件给他修改怎么办呢,我们可以直接在可写层进行修改,也就意味着它会将layer2 的文件拷贝至可写层,拷贝完成之后再对可写层的文件进行修改,并且修改完了以后的文件他还会把底层的文件进行隐藏。也就意味着我可写层现在有一个1.txt文件了,那下面镜像中的1.txt文件我就看不见了,我只能看我可写层中的1.txt文件,并且这个1.txt文件在修改的时候他是先把镜像的1.txt文件拷贝到可写层以后再去打开修改的。也就是所谓的写时复制,这个特征是非常重要的

以上就是我们数据卷的一些特性,那我们为什么要采用数据卷呢?或者数据卷有什么意义呢?接下来我就会给大家逐层解析。

8.1.1 数据卷的意义-1

关闭并重启容器,其数据不受影响;也就是我们stop、和start容器的时候都不受其影响,除非只有 rm 删除了以后,容器里面的数据才会全部丢失。这在我们刚开始讲的时候也提到过,那比如在有些环境中可能不是特别重要比如LVS是一个容器,这个容器就用来运行LVS的,由于LVS的配置比较简单即使被删除数据丢失以后我们也可以重新配置上。但是假如这是一个数据库mysql的这么一个容器呢?把这个mysql容器一删除,mysql容器里面的这些数据就全部没了。那怎么办呢?那这个时候我们就需要去采用我们卷的解决方案

这时候可能有些朋友就有疑惑了,那我们为什么不用本机的一些文件呢?首先我们需要知道以下问题。

1、容器他在运行的时候,他是先从镜像里链接过来的,加一个可写层去得到运行状态。为什么不用操作系统本身的一个根文件系统,原因是我们的容器是有自己的一套根系统是通过我们的namespace进行隔离开了。和我们的操作系统本身就不属于同一套根系统,所以无法使用。那这个时候可能又有疑问了,我们可以通过在引入一个镜像让他们两个镜像之间去共享同一个根文件系统?但是这是不是同一个道理,容器与容器之间它们的目录进行共享的话,那我们要采用的方式是不是只能在某个容器上面去搭建一个NFS,然后通过网络共享过来。因为两个容器之间不能直接共享互相的目录,所以针对以上问题唯一的解决方案就是使用我们的卷

2、卷是什么:我们可以把他理解为在我们宿主机上的某个目录,与容器里的某个目录互相绑定,我们访问容器里的某个目录,相当于访问的就是宿主机目录。访问宿主机的目录就相当于访问的是我们容器内部的目录 ,并且当容器删除以后宿主机的目录默认是不删除的,那这样的话容器内部需要持久化保存的一些数据是不是就实现了保存。

如下图:

上图中有个容器APACHE,并且有个目录叫/var/lib/docker这是我们宿主机或叫做我们的操作系统的一个目录。然后在apache容器中呢有两个目录,一个是/var/www/var/lib/pulp这两个目录需要去做持久化保存,那就可以对应到宿主机中的/var/lib/docker下的vfs/dir/UID1UID2两个目录,与之相互匹配。那假如有一个天我们把这个容器删除以后,我们再去访问宿主机的这两个vfs/dir/UID1和UID2目录,就可以看到它持久化的保存数据,这就是卷。

8.1.2 数据卷的意义-2

1、volume可以在运行容器的时候完成创建与绑定操作,也就意味在上面讲的环境下,是可以不需要人为进行绑定的,他是可以在通过启动为容器的时候,就会自动的与之对应关联,但是这需要借助到我们dockerfile中的volume语法。

2、volume的初衷就是实现数据持久化

那在下图呢有一个容器的演示过程也就是我们的容器初始化过程。

首先进程(Program)会把我们的整个文件系统分为两个部分,一个是/根部分、一个是数据存储部分,如果是我们的/根部分的话是与我们的layer也就是可写层,与之相互关联。那第二个数据层是与我们的volume卷相互关联。那这样的话有一天我们把这个容器删除了,那我们的数据目录还在我们的卷中。以上就是我们整个volume使用的意义或者叫做他的使用用法。

8.1.3 数据卷类型(分类)

其实对于我们的volume来说也是有一定的分类的。我们可以将他分为两类。

1、绑定卷

2、docker的管理卷

它们两则之间的区别:

绑定卷:是通过人为操作,我们需要输入对应的命令来与之关联;并且绑定卷它可以是操作系统宿主机上的任何一个可用目录空间。

docker管理卷:也需要人为去设置。但是一旦引导转换为我们的容器以后,他就是由docker自己来进行管理的,也就是docker会创建自己对应的目录,并且自己会与之挂载。存放在宿主机上目录是/var/lib/docker下。基于我们不同的联合文件挂载系统或者叫做存储引擎他的目录就会有稍微的变化,但是都会放在/var/lib/docker

点赞