Docker为什么选择了AUFS?

1.AUFS

  • AUFS本质上仍是堆栈式的联合文件系统
  • 从功能上讲,AUFS可以将分布在不同地方的目录挂载到同一个虚拟文件系统当中
    (1)首先我们将思路切换到 Linux启动阶段。、
    典型的 Linux启动时,首先加载 bootfs(Boot File System)目录。这个目录里面包括 Bootloader和kerenl。Bootloader用来加载启动 kerenl。当kerenl成功加载到内存中后, bootfs就会释放掉, kerenl随之开始加载rootfs。
    (2)rootfs(Root FileSystem)包含的是 Linux系统中标准的 /dev、/proc、/bin、/etc等文件。
    因为 rootfs是后续kerenl启动的基础,对于 kerenl来说异常重要,因此此时 kerenl将 Rootfs加锁—设为 readonly。在只读权限下, kerenl进行一系列的检查操作。当kerenl确认 rootfs包含的文件正确无误后,将 readonly改为readwrite(可读可写),以后用户就可以按照正确的权限对这些目录进行操作了。
    (3)说到这里,就轮到到 AUFS登场了。
    当 Docker利用 LXC虚拟化出来一个容器之后,就相当于购买了一台裸机,有内存、CPU、硬盘,但没有操作系统。
    Docker参考 Linux的启动过程,将一个readonly权限的 bootfs挂载到容器文件系统中,然后通过 AUFS,再将readonly权限的 rootfs添加到 bootfs之上,当rootfs检查完毕之后,再将用户所要使用的文件内容挂载到 rootfs之上,同样是readonly权限。
    每次挂载一个 FS文件层,并且每层之间只会挂载增量(在这里大家可以借助于 SVN进行理解,相当每个 FS层都是 SVN提交上去的数据增量)。
  • 这些文件层就是堆栈式文件系统中所保存的数据。
    将不同的文件层挂载到同一个文件系统中的文件系统,就是联合文件系统
    而AUFS就是用来管理、使用这些文件层的文件系统,因此也称之为高级多层次统一文件系统( Advanced Multi Layered Unification Filesystem)。

2.但是每个 FS层都是 readonly权限,那么容器内部如何向这些文件写入数据呢?

  • 其实当 Docker利用 AUFS加载完昀高一层之后,会在更上面再添加一个 FS层,而这个层是 readwrite权限。
    容器内部的应用,对当前文件系统所有的写操作(包括删除)都会保存在这个 FS层当中,而当容器向 Docker发出 commit命令后,Docker会将这个 FS层中的数据作为单独一个文件层保存到 AUFS之中

  • 而一个镜像( image)就可以理解为:特定 FS层的集合。
    所以可以看出镜像的层次关系,处于下层的 image是上层 image的父类,而没有父类 image的就是baseimage。因此需要从 image启动 container时,Docker会依次加载 baseimage和父类 image,而用户所有的操作就都保存在更高层的readwrite的 layer中。

  • Docker如何利用AUFS特性,解决容器初始化和写时复制问题?
    (1)通过将镜像“分隔”为 AUFS的文件层,使得所有容器都可以共享文件层,且不会发生写冲突。
    (2)但在 Docker中,所有的镜像都是只读的,所有的镜像也都不保存用户信息,只会用于新建和复制。
    (3)而对于容器而言,其所看到的所有文件都是可读写的,只不过所有的写操作都被保存在更上层的文件层当中

  • 参考:Docker的前世今生

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章