狂神说-Docker基础-学习笔记-05 Docker镜像原理
镜像是什么
镜像是一种轻量级,可执行的独立软件包,用来打包运行环境和基于运行环境开发的软件,镜像包含了运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来。
如何得到镜像
- 从远程仓库下载
- 从他人处获得
- 自己制作
Docker镜像加载原理
UnionFS(联合文件系统)
UnionFS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特征:一次加载多个文件系统,但从外面看起来只使用一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统——UnionFS
各个镜像的组成可以想象成如下图片所示
bootfs(boot file system)主要包含BootLoader和kernel,linux系统刚启动时会加载bootfs,在Docker镜像的最底层是bootfs。这一层 典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成是整个内核就都在内存之中了,此时内存的使用权已经由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的 /dev、/proc、/bin、/etc 等标准目录和文件。rootfs就是各种不同操作系统的发行版,如Ubuntu、CentOS等
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的Kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs——这就是Docker镜像只有几百MB甚至更少的原因
对于分层的理解
分层的镜像
在我们去拉取镜像的时候,观察日志的输出,可以看到是一层一层在下载!
这样的分层结构,最大的好处应该就是资源共享了。如上图所示,我在拉取Redis镜像是,如果有之前拉取的镜像中包含相同的适用于本镜像的层级就不会重新下载,而是选择进行复用。
理解
所有的Docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容是,就会在当前镜像层之上,创建新的镜像层。
如图所示,基于一个UbuntuOS创建了一个镜像,这是第一层镜像;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加安全补丁,就会创建第三个镜像层。
在添加额外的镜像层的同时,镜像始终保存是当前所有镜像的组合。
可以想象成如下图示的样子。
每个镜像包含三个文件,而镜像包含了来自两个镜像层的6个文件。
要是对上图的镜像进行更新,更新的位置是文件5,而扫描已有镜像发现存在另一镜像层中的文件7就是文件5的更新版本,那么就不用再另外下载了,现在就由来自三个镜像层的6个文件组成新的镜像。
如果需要抽取出该镜像那么,需要抽取所有文件的就是下图所示的文件了
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层会被加载到镜像的顶部——这一层就是通常所说的容器层,容器之下都是镜像层。
对容器进行操作、配置,如果将容器层和原来的镜像层进行打包,可以得到一个新的镜像。