联合文件系统

联合文件系统(UnionFS)是一种轻量级的高性能分层文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。联合文件系统是实现 Docker 镜像的技术基础。

Docker 镜像自身就是由多个文件层组成,每一层有基于内容的唯一的编号(层 ID)。可以通过 docker history 查看一个镜像由哪些层组成。对于 Docker 镜像来说,这些层的内容都是不可修改的、只读的。而当 Docker 利用镜像启动一个容器时,将在镜像文件系统的最顶端再挂载一个新的可读写的层给容器。容器中的内容更新将会发生在可读写层。当所操作对象位于较深的某层时,需要先复制到最上层的可读写层。当数据对象较大时,往往意味着较差的 IO 性能。因此,对于 IO 敏感型应用,一般推荐将容器修改的数据通过 volume 方式挂载,而不是直接修改镜像内数据。

Docker 目前支持的联合文件系统种类包括 AUFSbtrfsDevice Mapperoverlayoverlay 2vfszfs 等。多种文件系统目前的支持情况总结如下:

  • AUFS:最早支持的文件系统,对 Debian/Ubuntu 支持好,虽然没有合并到 Linux 内核中,但成熟度很高;

  • btrfs:参考 zfs 等特性设计的文件系统,由 Linux 社区开发,试图未来取代 Device Mapper,成熟度有待提高;

  • Device Mapper:RedHat 公司和 Docker 团队一起开发用于支持 RHEL 的文件系统,内核支持,性能略慢,成熟度高;

  • overlay:类似于 AUFS 的层次化文件系统,性能更好,从 Linux 3.18 开始已经合并到内核,但成熟度有待提高;

  • overlay 2:Docker 1.12 后推出,原生支持 128 层,效率比 Overlay FS 高,较新版本的 Docker 支持,要求内核大于 4.0;

  • vfs:基于普通文件系统(ext、nfs 等)的中间层抽象,性能差,比较占用空间,成熟度也一般。

目前,AUFS 应用最为广泛,支持也相对成熟,推荐生产环境考虑。

所有的镜像和容器都存储都在 Docker 指定的存储目录下,以 Ubuntu 宿主系统为例,默认路径是 /var/lib/docker。在这个目录下面,存储由 Docker 镜像和容器运行相关的文件和目录。

Last updated