1. 概念
Docker镜像是由文件系统叠加而成。最底端是一个引导文件系统,即bootfs。当一个容器启动时,它将被移到内存,而引导文件系统会被卸载,以留出更多的内存供initd磁盘镜像使用。
Dcoker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上,rootfs可以是一种或多种操作系统。
2. 流程
传统的linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并完成了完整性检查后,它才会被切换为读写模式。
在Docker里,root文件系统永远只能是只读状态,并且Docker利用联合加载技术又会在root文件系统层之上加载更多的只读文件系统。
3. 联合加载技术
联合加载技术指的是一次同事加载多个文件系统,但是在外面看只能看到一个文件系统。联合加载会将各层文件系统叠加在一起,这样最终的文件系统会包含所有底层的文件和目录。
Docker将这样的文件系统称为镜像。一个镜像可以放到另一个镜像的顶部。位于下面的镜像称为父镜像(parent image),最底部的镜像称为基础镜像(base image)。
当一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统。
4. 图例
当Docker第一次启动一个容器时,初始的读写是空的。当文件系统发生变化时,这些变化都会应用到这一层上。比如如果想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已经被读写层中的该文件副本所隐藏。这种机制称为写时复制(copy on write)。
每个只读镜像层都是只读的,并且以后永远不会变化。当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶端添加一个读写层,这个读写层再加上下面的镜像层已经一些配置数据,就构成了一个容器。