Docker分层加载原理

Docker镜像加载原理

docker的镜像实际上就是由一层一层的文件系统组成(UnionFS层级文件系统)。

bootfs(boot file system)主要包含bootloader和kernel(内核),bootloader主要是引导kernel,linux系统刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后,整个内核就都在内存中了,此时的内存使用权已有bootfs转交给内核,此时系统也会写在bootfs。(相当于我们重装系统的引导器,装完系统后就不需要了)

rootfs(root file system),在bootfs之上,包含的就是典型的Linux系统中的/devv , /proc, /bin等标准目录和文件,rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等.

对于一个精简的OS(操作系统),rootfs可以很小,只需要包含最基本的命令工具和程序就可以了,因为底层直接使用Host的kernel,自己只需要提供rootfs就可以了。由此可见,对于不同的linux发行版,bootfs基本是一致的(公用的),而rootfs会有差别。

分层原理

所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。如下图:基于Ubuntu 16.04创建一个新的镜像,这就是镜像的第一层,如果在该镜像中添加Python包,就会在第一层的基础上创建第二层,如果继续添加一个安全补丁,就会创建第三层,以此类推。

在添加额外镜像层的同时,镜像始终保持的是当前所有镜像的组合(理解这一点很重要),下图每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。

下图比上图多了一层,在外部看整个镜像只有6个文件,这是因为第三层的文件7把文件5替换了(版本更新)

这种情况下,上层镜像中的文件覆盖了下层镜像的文件,使得文件的更新版本作为一个新的镜像层添加到镜像中。

Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像的镜像层堆栈,并保证多镜像对外展示统一的文件系统。下图便是将所有镜像层堆叠并合并,对外提供统一的视图(最终生成的镜像效果)。

分层下载的好处就是,假设有些应用,它的层是相同的,我们就可以直接复用。

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,也就是容器层,容器之下都叫镜像层!

posted @ 2022-01-17 19:36  迷路小孩  阅读(112)  评论(0)    收藏  举报