什么是 Union File System?

Union File System,简称 UnionFS,是一种把其他文件系统联合到一个联合挂载点的文件系统服务。UnionFS 把不同文件系统的文件和目录“透明地”覆盖,形成一个单一一致的文件系统。
当对这个虚拟后的联合文件系统进行写操作的时候,系统是真正写到了一个新的文件中,并没有改变原来的文件,这是因为 unionfs 用到了一个重要的资源管理技术,叫写时复制。

写时复制 CoW

写时复制是一种对可修改资源实现高效复制的资源管理技术。
它的思想是,如果一个资源是重复的,但没有任何修改,这时并不需要立即创建一个新的资源,这个资源可以被新旧实例共享。创建新资源发生在第一次写操作,也就是对资源进行修改的时候。
通过这种资源共享的方式,可以显著地减少未修改资源复制带来的消耗,但是也会在进行资源修改时增加小部分的开销。
Docker 使用 AUFS 的 CoW 技术来实现 image layer 共享和减少磁盘空间占用。

AUFS

AUFS 是 Docker 选用的第一种存储驱动,AUFS 完全重写了早期的 UnionFS 1.x,其主要目的是为了可靠性和性能,并且引入了一些新的功能。AUFS 具有快速启动容器、高效利用存储和内存的优点。

Docker 是如何利用 AUFS 存储 image 和 container 的?

image layer 和 AUFS

每一个 Docker image 都是由一系列 read-only layer 组成的。image layer 的内容都存储在 Docker hosts filesystem 的 /var/lib/docker/aufs/diff 目录下。

container layer 和 AUFS

启动一个 container 的时候,Docker 会为其创建一个 read-only 的 init layer ,用来存储与这个容器内环境相关的内容;Docker 还会为其创建一个 read-write 的 layer 来执行所有写操作。即使容器停止,这个可读写层仍然存在,因而重启容器不会丢失数据,只有当一个容器被删除的时候,这个可读写层才会一起删除。

AUFS 如何为 container 删除一个文件?
如果要删除 file1, AUFS 会在 container 的 read-write 层生成一个 .wh.filel 文件来隐藏所有 read-only 层的 file1 文件。