OverlayFS是一个类似于AUFS 的现代联合文件系统,更快实现简单。
OverlayFS是内核提供的文件系统,overlay和overlay2是docker的存储驱动
设置存储驱动方法
{ "storage-driver": "overlay", "storage-opts": [ "xxxxxxxx" ] }
1 overlay介绍
OverlayFS将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载。OverlayFS底层目录称为lowerdir, 高层目录称为upperdir。合并统一视图称为merged。
下图分层图,镜像层是lowdir,容器层是upperdir,统一的视图层是merged层
当镜像层和容器层都有相同的文件,使用容器层的文件,overlay驱动使用两层,这就意味着,如果是多层的镜像就无法使用了,替代的方案是:
镜像层都在/var/lib/docker/overlay目录下,通过硬链接的方式把下部的层关联起来
Docker1.10之后,镜像层ID和/var/lib/docker中的目录名不再一一对应。
- lower-id是容器镜像顶层的ID,OverlayFS lowerdir
- upper包含与OverlayFS相对应的容器的读写层的内容upperdir。
- merged目录是lowerdir联合装载upperdir,包含正在运行的容器内的文件系统的视图。
- work目录是OverlayFS内部的。
通过mount查看overlay文件的挂载
[root@node1 fe4f8889e63ead3876bf0436d27af5ab3b122fa5891e3b8c88bf8927582d7cf2-init]# ls
lower-id merged upper work
1.2文件操作
读
- 如果文件在容器层不存在,则从lowdir中读取
- 只在容器层存在,则直接从容器中读取改文件
- 文件存在容器和镜像层,容器层upperdir会覆盖镜像层lowdir中的文件
修改
首次写入: 在upperdir中不存在,overlay和overlay2执行copy_up操作,把文件从lowdir拷贝到upperdir,由于overlayfs是文件级别的(即使文件只有很少的一点修改,也会产生的copy_up的行为)
copy_up操作只发生在文件首次写入,以后都是只修改副本
overlayfs只适用两层,因此性能很好,查找搜索都更快删除文件和目录: 当文件在容器被删除时,在容器层(upperdir)创建whiteout文件,镜像层的文件是不会被删除的,因为他们是只读的,但without文件 会阻止他们展现,当目录在容器内被删除时,在容器层(upperdir)一个不透明的目录,这个和上面whiteout原理一样,阻止用户继续访问,即便镜像层仍然存在
重命名
这个系统调用只在源和目标都在顶层,否则会报 error (“cross-device link not permitted”)
性能问题
* 页缓存:overlayfs支持页缓存共享,也就是说如果多个容器访问同一个文件,可以共享同一个页缓存。这使得overlay/overlay2驱动高效地利用了内存
* copy_up:aufs和overlayfs,由于第一次写入都会导致copy_up,尤其是大文件,会导致写延迟,以后的写入不会有问题。由于overlayfs层级 比aufs的多,所以ovelayfs的拷贝高于aufs
* inode限制:使用overlay存储驱动可能导致inode过度消耗,特别是当容器和镜像很多的情况下,所以建议使用overlay2.
2 overlay2介绍
overlay2支持128层,对docker build和docker commit更好的性能支持