镜像

镜像就是一个独立的,轻量级的软件包,其中包括了运行软件所需的全部内容(代码、环境变量、库、配置文件等),所有的应用直接打包成docker镜像就可以直接跑起来。

联合文件系统

我们下载的时候,看到的一层一层的就是这个。
每一个镜像的需求都是不一样的。例如有的需要OS+网络配置+JDK,有的需要OS+网络配置+Mysql。这些镜像还有可能运行到同一台宿主机上。那么我都要重复下载OS、网络配置?难道不可以复用嘛?类似maven,将公共的jar抽取出来,在公共的基础上封装自己的业务逻辑

为了解决上面的问题,就需要用到联合文件系统(UFS)

联合文件系统(UninoFS)是一种分层、轻量级并且高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(可以通过这个虚拟文件系统访问到各个不同的目录),UninoFS文件系统是Docker镜像的基础,镜像可以通过分层来实现的,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
镜像原理之联合文件系统 - 图1
特性:一次加载多个文件系统,但是从外面看起来就只有一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有的底层文件。

Docker镜像加载原理

Docker的镜像实际上是由一层一层的文件系统组成,这种层级的文件系统就是联合文件系统。
系统启动时,黑屏->开机->显示屏幕 ->加载Bootfs(boot file system)主要包括BootLoader和Kernel,BootLoader主要时引导加载Kernal,Linux刚启动时会加载Bootfs文件系统。
在Docker镜像的最底层是Bootfs,这一层与我们典型的Linux系统时一样的,包含boot加载器和内核,当boot加载完成之后整个内核都在内存中了,此时内存的使用权已由Bootfs转交给内核,此时也会卸载Bootfs。

Rootfs(root file system)在Bootfs之上,包含的就是典型的Linux系统中各种标准目录和文件、程序等。

Rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos。

对于一个精简的OS(内核),Rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host(主机的)的Kernel,自己只需要提供Rootfs就可以了,由此可见对于不同的Linux发行版,Bootfs基本是一致的,因此不同的发行版可以公用Bootfs

简单理解:


1. 对于Docker安装OS来说:就是Docker使用了Linux本身的bootfs,只需要安装自己所需的rootfs。
2. 对于Docker安装普通镜像来说:就是Docker本身是分层下载镜像,所以可以提取出公共层镜像,进行复用。

分层原理

所有的镜像都起源于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
比如:基于CentOS创建一个新的镜像,这就是新镜像的第一层,如果在该镜像中添加JDK,就会在基础镜像层之上创建第二个镜像层,如果继续添加一个Tomcat,就会创建第三个镜像层,该镜像当前已经包含3个镜像层。

使用docker inspect 命令可以在layers节点下查看所有的镜像层

在添加额外的镜像层的同时,镜像是始终保持着当前所有镜像的组合。

注意:假如在Docker中添加一个最新版本的JDK镜像,那么Docker会用这个新的JDK镜像去替代旧的JDK镜像,而不会去新增加一层。


特点

Docker的镜像都是只可读的。若要创建一个容器,就是在镜像层上面加上可读写层,也叫做容器层。容器层之下的都是镜像层
image.png