Docker核心技术和实现原理

时间:2025-04-04 07:14:13
UnionFS (联合文件系统)是一种分层、轻量级并且高性能的文件系统,它支持对
文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚
拟文件系统下。 UnionFS 是一种为 Linux FreeBSD NetBSD 操作系统设计的把其
他文件系统联合到一个联合挂载点的文件系统服务。它使用 branch 把不同文件系统的
文件和目录 透明地 覆盖,形成一个单一一致的文件系统。这些 branches 或者是
read-only 或者是 read-write 的,所以当对这个虚拟后的联合文件系统进行写操作的时
候,系统是真正写到了一个新的文件中。看起来这个虚拟后的联合文件系统是可以对
任何文件进行操作的,但是其实它并没有改变原来的文件,这是因为 unionfs 用到了一
个重要的资管管理技术叫写时复制。
写时复制( copy-on-write ,下文简称 CoW ),也叫隐式共享,是一种对可修改资
源实现高效复制的资源管理技术。它的思想是,如果一个资源是重复的,但没有任何
修改,这时候并不需要立即创建一个新的资源;这个资源可以被新旧实例共享。创建
新资源发生在第一次写操作,也就是对资源进行修改的时候。通过这种资源共享的方
式,可以显著地减少未修改资源复制带来的消耗, 但是也会在进行资源修改的时候增
加小部分的开销。

再看 Docker 镜像是什么

image 里面是一层层文件系统 Union FS 。联合文件系统,可以将几层目录挂载到
一起,形成一个虚拟文件系统。虚拟文件系统的目录结构就像普通 linux 的目录结构一
样, docker 通过这些文件再加上宿主机的内核提供了一个 linux 的虚拟环境。
每一层文件系统我们叫做一层 layer ,联合文件系统可以对每一层文件系统设置三
种权限,只读( readonly )、读写( readwrite )和写出( whiteout-able ),但是 docker
镜像中每一层文件系统都是只读的。
构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层
的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可
见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到
一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
可以看到镜像分层结构有以下特性
(1)镜像共享宿主机的 kernel
(2) base 镜像是 linux 的最小发行版
(3)同一个 docker 主机支持不同的 Linux 发行版
(4)采用分层结构,可以上层引用下层,最大化的共享资源
(5)容器层位于可写层,采用 cow 技术进行修改,该层仅仅保持变化的部分,并不
修改镜像下面的部分
(6)容器层以下都是只读层
(7) docker 从上到下找文件

镜像实现原理

Docker 分层存储实现原理

1. 分层存储实现方式

docker 镜像技术的基础是联合文件系统 (UnionFS),其文件系统是分层的Linux 中各发行版实现的 UnionFS 各不相同,所以 docker 在不同 linux 发行版中使用的也不同。通过 docker info 命令可以查看当前系统所使用哪种 UnionFS,常见的几种
发行版使用如下: