1、docker镜像的本质。
镜像是一种轻量级、可执行的独立软件包,用于打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所有内容,包括代码、依赖的库、环境变量和配置文件等。所有的应用,直接打包镜像就可以直接跑起来。
镜像获取方式:从远程仓库下载、拷贝、自己制作DockerFile。
2、镜像的加载原理
(1)联合文件系统(UnionFS):UninFS联合文件系统是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂在到同一个虚拟文件系统下。
(2)联合文件系统的特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。重复的文件可以共用。
(3)docker的镜像实际上是有一层一层的文件系统组成,这种层级文件就是联合文件系统(UFS)
(4)系统的文件分为两种
- 第一种是bootfs(boot file system),主要包含bootloader和kernel,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等等。
(5)docker的架构
从上图可知,对于一个精简的OS而言,例如docker,rootfs可以 很小,只需要包含最基本的命令、工具和程序就可以了,因为底层直接用Host的Kernel,自己只需要提供rootfs就可以了。
这也是docker启动快、体量小的根本原因;而虚拟机每次启动都需要运行bootfs,这个引导过程非常耗时间。
3、镜像分层的原理
(1)共用已经存在的文件层级
(2)docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层就是容器层,容器之下的都是镜像层。
其过程大致如下。