【Docker 基础知识】存储驱动overlay和overlay2

OverlayFS是一个类似于AUFS 的现代联合文件系统,更快实现简单。 

OverlayFS是内核提供的文件系统,overlay和overlay2是docker的存储驱动

设置存储驱动方法

{
  "storage-driver": "overlay",
  "storage-opts": [
    "xxxxxxxx"
  ]
}


1 overlay介绍

1.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,Ove​​rlayFS 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更好的性能支持 

猜你喜欢

转载自blog.csdn.net/zhonglinzhang/article/details/80970411