"docker文件系统AUFS"

  "AUFS"

Posted by Xu on July 26, 2017

关于Docker文件系统AUFS的一些见解

研究过Docker文件系统的同学应该知道AUFS文件系统属于一种联合挂载系统,它可以把不同文件系统下的目录挂载到同一文件系统之下构成统一的文件系统的视角,因为在一个容器的build过程中,通过Dockerfile的每一条命令的执行都会构建一层镜像层,通过在可读写层的数据的修改后将修改部分的数据保存在顶层的镜像层然后将整体commit成一个容器镜像,所以每一层镜像都只保存被修改的数据内容,而它的实现则依赖于COW的技术支持,只有当我修改该部分数据的时候,才会从底层去找该部分数据并拷贝到顶层的可读写层然后修改保存。

上图: Dockerfs

这个图就明显的显示出容器在根据Dockerfile来build的过程中,每一行命令构成一个镜像层,但命令的执行不会影响底层镜像数据,build结束后构成一整个容器镜像,并提供顶层的可读写层供容器运行的时候使用,每一层镜像层只会保存该层命令所修改部分的数据(COW机制),并不是该容器整个文件系统的内容,所以为了获取该容器的整个文件系统的视角,我们需要综合每一层镜像层中的数据,然后联合挂载到var/lib/docker/aufs/mnt目录下提供整个容器文件系统的视角,/var/lib/docker/aufs/diff则保存着每一层镜像层中的实际数据,也就是修改部分的数据,/var/lib/docker/aufs/layer目录下记录每个镜像层的父镜像id信息

在容器的启动过程中,需要挂载容器文件系统,得到容器整体文件系统的视角,当该镜像层呢只有一层时,没有父镜像层,则不需要挂载,因为该镜像层直接可作为容器的整体文件系统的视角,若容器由多层镜像构成,则需要综合所有镜像层数据联合挂载到mnt目录下提供该容器整体文件系统的视角。