前言:
作者简介:小曾同学.com,小伙伴们也可以叫我小曾,一个致力于测试开发的博主⛽️
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!
前不久给大家分享了Docker的基本理论知识,稍微介绍了镜像相关的概念,本篇文章则着重剖析Docker镜像底层原理
。让小伙伴们理解为什么我们启动一个 Docker 会是秒极启动,为什么拉取镜像时是一层层拉取。
希望通过本篇文章让小伙伴们理解几个问题:
在开启分享之前先分享一个前提知识。Linux 操作系统中的文件管理系统:
Linux 文件系统
主要由boofts 和 rootfs
两部分组成,其中
bootloader
(引导加载程序)和 kernel
(内核)所以,不同的Linux发行版,bootfs基本是一样的,只是 rootfs 不同,如ubuntu、centos等,相当于他们共用一个 bootfs 系统。
简而言之,镜像的本质就是一个分层文件系统。详解如下,
镜像就是一种轻量级、可执行的独立软件包
,它包含运行某个软件所需要的所有内容。例如,开发把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是 images 镜像文件。
其中打包的具体内容可以包括 代码、运行时需要的库、环境变量和配置文件等。
镜像也可以看做是java中的类。然后new出来的对象可以看作是Docker容器实例,这样应该就好理解了吧。
当我们在下载镜像时,会看到镜像下载流程是一层层下载。
例如,docker pull tomcat
实际上,镜像是由一层层的文件系统叠加而成,这些一层层的文件系统就叫做UnionFS(联合文件系统)
,
UnionFS 系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
UnionFS 是 Docker 镜像的基础,镜像可以通过分层来进行继承,基于基础镜像可以制作各种具体的应用镜像。
在Docker底层有个bootfs(boot file system)系统,在bootfs中主要包含 bootloader 和 kernel,bootloader 主要是引导加载kernel,Linux 系统刚启动时会加载 bootfs 文件系统,在Docker 镜像的最底层是引导文件系统 bootfs。这一层与典型得到Linux/Unix 系统一样,包含boot加载器和内核。当 boot加载完成之后整个内核就都在内存中了。
Why:Docker中一个 Ubuntu 镜像为什么只有几十兆,而一个 Ubuntu 操作系统的 iso 文件要好几个G?
答:对于一个精简OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以,因为底层直接用host的kernel,自己只需要提供rootfs就行了,由此可见,对于不同linux发行版,bootfs基本是一致的,rootfs会有差别,因为不同的发行版可以公用bootfs。
最大的一个好处是共享资源
、方便复制迁移
,便于复用
。
比如说有多个镜像都从相同的base镜像构建而来,那么Docker host只需要在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
再比如,我们开启一个Ubuntu容器,在容器中下载vim、ifconfig命令,然后再将这个容器commit成新的镜像,再用这个新的镜像开启新的容器,那么新的容器中自动会有vim、ifconfig命令,这就是复用。