OverlayFS是内核提供的文件系统,其中overlay和overlay2是docker的存储驱动,只是版本不同,
overlay2是overlay的改进版。
要熟悉Docker的镜像存储相关知识,首先从Docker镜像存储方式来说起。
一、Docker中镜像存储
Docker中的镜像采用分层构建设计,每个层可以称之为“layer”,这些layer被存放在/var/lib/docker//目录下。
这里的storage-driver可以有很多种如:AUFS、OverlayFS、VFS、Brtfs等。
可以通过docker info命令查看存储驱动。
本机采用的是Centos7系统,通过docker info可以看出
Storage Driver:overlay2 , 表明镜像存储驱动版本为overlay2
注意:通常ubuntu类的系统默认采用的是AUFS,centos7.1+系列采用的是OverlayFS。
二、OverlayFS
1、简介
OverlayFS是一种堆叠文件系统。它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等等)。并不直接参与磁盘空间结构的划分,仅仅将原来底层文件系统中不同的目录进行“合并”,然后向用户呈现,这也就是联合挂载技术。
对比AUFS,OverlayFS更高效,简便,故而使用率更高。
但是在Linux系统中,其内核为Docker提供的存储驱动OverlayFS目前只有两种:overlay和overlay2。
overlay2是相对于overlay的一种改进,在inode利用率方面比overlay更有效。
但是overlay有环境需求:docker版本17.06.02+,宿主机文件系统需要时ext4或xfs格式。
2、overlayfs联合挂载:
overlayfs通过三个目录:lower目录、upper目录、以及work目录实现,其中lower目录可以是多个,work目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为为merged目录。
docker使用overlay文件系统来构建和管理镜像与容器的磁盘结构。
overlay文件系统分为lowerdir、upperdir、merged, 对外统一展示为merged,upperdir和lower的同名文件会被upperdir覆盖。
具体层次如下
overlay的使用方法:
[root@ops2-1 /var/lib/docker/overlay]
#mount -t overlay overlay -o lowerdir=./lower,upperdir=./upper,workdir=./work ./merged
注:workdir必须和upperdir是mount在同一个文件系统下,而lower不是必须的。
lower目录可以是一个目录链
挂载文件系统的基本命令如下:
mount -t overlay overlay -o lowerdir=/lower1:/lower2:/lower3,upperdir=/upper,workdir=/work /merge , 如果没有upperdir,merged是只读的。
其中:lower1:lower2:lower3 表示不同的lower层目录,不同的目录使用":"分隔,层次关系依次为lower1>lower2>lower3 (注:多lower层功能支持在Linux-4.0合入,Linux-3.18版本只能指定一个lower dir;然后upper和work目录分别表示upper层目录和文件系统挂载后用于存放临时和间接文件的工作基目录(work base dir),最后的merged目录就是最终的挂载点目录。),若执行顺利,执行以上命令完成之后,overlayfs就成功挂载到merged目录下了。
挂载选项支持(即“-o”参数):
1)lowerdir=xxx:指定用户需要挂载的lower层目录(支持多lower,最大支持500层)
2)upperdir=xxx:指定用户需要挂载的upper层目录;
3)workdir=xxx:指定文件系统的工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见;
4)default_permissions:功能未使用;
5)redirect_dir=on/off:开启或关闭redirect directory特性,开启后可支持merged目录和纯lower层目录的rename/renameat系统调用;
注:lowerdir、upperdir和workdir为基本的挂载选项
3、吃个栗子
使用mount命令挂载overlayfs语法如下:
mount -t overlay overlay -o lowerdir=lower1:lower2:lower3,upperdir=upper,workdir=work merged_dir
创建三个目录A、B、C,以及worker目录:
然后使用mount联合挂载到/tmp/test 下:
然后我们再去查看/tmp/test目录,你会发现目录A、B、C被合并到了一起,并且相同文件名的文件会进行“覆盖”。
注意:这里覆盖并不是真正的覆盖,而是当合并时候目录中两个文件名称都相同时,merged层目录会显示离它最近层的文件:
同时,我们也可以通过mount命令查看其挂载的选项:
mount | grep overlay
至此,这便是联合挂载方法。
欢迎收藏点评,谢谢!