理解docker镜像
Docker镜像由相互层叠的文件系统组成。基础是引导文件系统bootfs,它类似于典型的Linux/Unix引导文件系统。Docker用户可能永远不会与启动文件系统交互。实际上,当容器启动后,它将被移到内存中,并且卸载启动文件系统来释放initrd磁盘映像使用的RAM。
看起来很像一个典型的Linux虚拟化堆栈。实际上,Docker接下来在引导文件系统的顶层构建一个根文件系统,即rootfs。这个rootfs可以是一个或多个操作系统(例如,Debian或Ubuntu文件系统)。
在更传统的Linux引导中,根文件系统以只读方式挂载,然后在引导后切换为可读写,并执行完整性检查。但是,在Docker世界中,根文件系统保持只读模式,Docker利用联合挂载的优势将更多的只读文件系统添加到根文件系统中。 联合挂载是一种允许一次装载多个文件系统但看起来是一个文件系统的装载。 联合挂载使文件系统彼此重叠,以便生成的文件系统可以包含来自任何或所有底层文件系统的文件和子目录。
Docker调用每个文件系统镜像。镜像可以层叠在一起。下面的图像称为父镜像,可以遍历每个层,直到到达镜像堆栈的底部,最终镜像称为基础镜像。最后,当容器从映像启动时,Docker会在下面的任何层上安装一个读写文件系统。Docker容器运行的任何进程都将在这个地方执行。
我们看一个图(此图来源书,太好看了)
image.png
当Docker第一次启动一个容器时,初始的读写层是空的。当变化发生时,它们被应用到这一层;例如,如果您想更改一个文件,那么该文件将从下面的只读层复制到读写层。文件的只读版本仍然存在,但现在隐藏在副本下面。
这种模式传统上称为“写时拷贝”,这是Docker如此强大的特性之一。每个只读镜像层都是只读的。当一个容器被创建时,Docker从镜像的堆栈中构建,然后在上面添加读写层。这一层,与它下面的镜像层的知识和一些配置数据相结合,这就是docker镜像大概需要理解的东西。