镜像介绍
镜像是一种轻量级的,可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。所有的应用,可以通过打包成镜像直接部署。
UnionFS(联合文件系统)
UnionFS(联合文件系统)是一种分层、轻量级、高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。UnionFS是Docker镜像的基础。镜像可以通过分层来进行集成,基于基础镜像,可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从表面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
镜像加载原理
Docker 实际上是由一层一层的文件系统组成(UnionFS)。
BootFS 主要包含 bootloader 和 kernel,bootloader 主要是引导加载 kernel,Linux 启动时会加载 bootfs,Docker 的最底层也是 BootFS,包含 boot 加载器和内核。当 boot 加载完后,整个内核就都在内存中,此时内存的使用权会由 BootFS 转交给内核,系统也会卸载 BootFS。
RootFS 在 BootFS 之上,包含的是典型 Linux 系统中的 /dev、/proc、/bin、/etc 等标准文件和目录。RootFS 就是各种不同的操作系统发行版,如 Ubuntu、Centos 等。
对于一个精简的 OS,FootFS 可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为最底层直接用 Host 的 kernel,自己只需要提供 RootFS 就可以了。因此不同发行版本 Linux 的 BootFS 基本是一致的,RootFS 会有差异,不同发行版本 Linux 可以公用 BootFS。
镜像分层原理
Docker 镜像都是只读的,当容器启动时,一个新的可写层会加载到镜像顶部,这一层就是通常说的容器层,容器层之下的都叫镜像层。所有的 Docker 镜像都起始于一个基础镜像层,当修改或增加新的内容时,就会在当前镜像层上创建新的镜像层。
Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
当下载一个镜像时,也是分层下载的。如图所示,下载 redis 镜像,总共有六层。其中第一层之前已经下载过了,就不会重复下载了。
通过下面的命令查看 redis 镜像的详细信息,可以看到 redis 镜像的 rootfs 有六层。
docker inspect redis:latest
镜像散列值(摘要)
Docker 1.10 中引入了新的内容寻址存储模型。作为模型的一部分,每一个镜像现在都有一个基于其内容的密码散列值。因为摘要是镜像内容的一个散列值,所以镜像内容的变更一定会导致散列值的改变。这意味着摘要是不可变的。