1、什么是镜像层?
每个镜像都由多个镜像层组成。这些镜像层都是只读的,从下往上,以栈的方式组合在一起,组成镜像的根文件系统。
2、什么是容器层?
容器和镜像都是由多个层组成,最大的区别在于容器的最上面一层是读写层,叫做容器层。而镜像的所有层都是只读层,叫做镜像层。
容器启动后,Docker Daemon 会在容器使用的镜像上添加一个容器层。容器运行时,所有于数据变化相关的操作都是在这个读写层中完成的,如新建文件,修改文件等。删除容器时,Docker Daemon 同时会删除这个容器层。
每个容器运行时,都有自己的容器层,并在容器层中保存容器运行相关的数据。容器层之下的所有镜像层都是只读的,因此多个容器可以共享同一个镜像。
docker 中存储驱动用于管理镜像层和容器层。不同的存储驱动使用不同的算法和管理方式。在容器和镜像管理中,使用的两大技术是栈式层管理和写时复制。
3、镜像的存储方式
为了区别镜像层,Docker为每个镜像层计算了一个UUID,在docker 1.10 以前的版本中,会根据镜像层中的数据产生一个随机码,用随机码作为镜像层的UUID。在1.10的版本中,会根据镜像层中的数据,使用加密哈希算法生成镜像层的UUID。
这种新的方式增加的镜像层的数据的安全性。因为采用了加密哈希算法,所以避免了镜像层UUID冲突,只要镜像层内容不同,UUID就不一样。同时,在pull、push、load、和save等操作中,加密哈希算法也保证了镜像数据的完整性。
在1.10以前的版本,不能在镜像之间共享镜像层。采用全新的镜像存储方式之后,只要镜像层的数据相同,就可以在不同镜像之间共享。
而当容器运行时,镜像层采用加密哈希算法生成UUID,而容器层则采用随机数生成UUID。
4、镜像层和容器层图示
如下图所示:使用ubuntu 15.04 镜像启动一个容器。容器的存储空间由两部分组成,底层是镜像层,顶部是容器层。镜像层是只读层,容器层是可读写层。容器运行时,涉及文件写的操作,都是在容器层中完成的。