赞
踩
我们知道,docker镜像都是分层的,从我们pull下来的过程就知道这个现象,现在有这么一个Dockerfile文件
- FROM centos:7
- RUN yum install net-tools-y
- RUN yum install httpd -y
- RUN yum install elink -y
- CMD ["/bin/bash"]
它的分层图如下:
分层的好处在于共享资源,比如说有很多的镜像,可以从base镜像构建而来,那么docker host当中只需要在硬盘上保存一份base镜像即可,同时内存当中也只需要加载一份base镜像即可,也就是说我开多少的相同的镜像,内存在上涨值并不明显,就可以给所有的使用该base镜像的容器提供服务,而且镜像的每一层可以被单独的共享,也就是这一层如果跟其他的镜像重复的话,这一层就可以单独拿出来进行共享。
这个时候会有一个知识点就是,我们多个容器要是共享一份base镜像的话,上面又说我们宿主机中只保存一份base镜像,要是我么在其他正在使用该base镜像的容器修改这个根目录下的文件内容,会不会对其他使用该base镜像的容器产生影响呢,答案是不会的,这个时候需要了解一下docker的另外一项技术,叫做写时拷贝,即copy-on-write。
对于上图的容器层,那么什么叫做容器,容器是把镜像实例化,然后union mount技术是把相同的目录挂载之后,显示的是两个目录共同的结果,比如说A目录挂载到C上,B目录页挂载到C上,那么此时我们在C上看到的就是A和B的内容。
我们知道主机在真正挂载的时候,把镜像层的数据以只读的形式挂载上来,然后挂载一个空白层,让用户写数据或者存放数据,空白层是RW格式。
分析:两个目录,一个RO权限,一个RW权限,我们容器层是这两个目录同时挂载到最下面的目录上,那么这个目录看到的就是上面两个目录的内容。。。
除了union mount,其实很多情况下也被解释为COW的工作原理,对于如何理解COW的工作原理,我们这里解释一下,我们之前学习lvm逻辑卷快照原理的时候,就了解到COW原理,即写时复制。
写时复制是怎么做到的呢,当我们计算机当中有一个数据的时候,并在数据当中产生了两个空间,此时我们想要对一个照快照,这个判断快照得多大。即若原始硬盘数据有100G,那么逻辑卷快照是多大呢才能把这个100G的数据照下来呢,我们硬盘照快照瞬间的变化量乘以2等于快照的大小。在硬盘的一个地方划分一个空间,其实对硬盘照快照就是区分出哪些是快照之前的,哪些是快照之后的数据,照快照的瞬间,硬盘会产生两样操作,无非就在读数据,无非就在写数据。读旧数据从原始数据位置开始读,读新的数据从快照的地方开始读。写数据的话,就是增加新的数据,修改原始数据,删除旧的数据三项操作。
我们主机当中就是把这一瞬间把所有有变化的数据放置到快照里面去,把所有没有变化的数据不动,即就在原始位置,现在我需要增加一个数据,照快照的一瞬间写入硬盘5M数据,那么这5M数据都放到快照里面去,当用户需要读数据的时候,读旧数据从原始数据出,新数据从快照里面出。
改数据的话,把这个文件要改的文件放置到原始数据当中,把改之后的数据放置到快照里面。。
删除的话,删除之后不显示在快照里面,没删除的数据在原始数据里面。
逻辑卷快照COW的原理就是,在照快照的一瞬间,产生变化量的数据放在一起。
我们增删改查的数据全部放在容器层内,其他数据放在我们镜像层内。
分析
总结:当我们启动容器的时候,一个新的可写层会加载到镜像的顶部,这层通常称为容器层,容器层之下的被称为镜像层。所有对容器的增删改查,都是在容器层的。这也就是为什么我们开启bash进入镜像的时候,在里面进行一些操作对我们的镜像没有影响的原因。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。