首页 > 其他分享 >docker 的overlayFS 文件系统

docker 的overlayFS 文件系统

时间:2023-05-21 16:34:09浏览次数:44  
标签:upper lower overlay overlayFS upperdir 文件系统 lowerdir docker 目录

refer to: https://juejin.cn/post/7112352737051803684

一、overlay相关介绍

Docker 底层有三驾马车,Namespace、CGroup 和 UnionFS(联合文件系统),UnionFS 是 Docker 镜像的基础。

UnionFS(联合文件系统) 是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

UnionFS 是 Docker 镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。由于 Linux 下有多种的 UnionFS (如 AUFS、OverlayFS 和 Btrfs 等),所以我们以实现相对简单的 OverlayFS 作为分析对象

二、overlay 原理。

OverlayFS使用两个目录,把一个目录置放于另一个之上,并且对外提供单个统一的视角。这两个目录通常被称作层,这个分层的技术被称作union mount。术语上,下层的目录叫做lowerdir,上层的叫做upperdir。对外展示的统一视图称作merged。

image

1、在一个支持 overlay文件系统的 Linux (内核3.18以上)的操作系统上一个同级目录内(如/root下)创建四个文件目录 lower 、upper 、merged 、work其中 lower 和 upper 文件夹的内容如上图所示,merged 和work 为空,same文件名相同,内容不同。
2、在/root目录下执行如下挂载命令,可以看到空的merged文件夹里已经包含了 lower 及 upper 文件夹中的所有文件及目录。
$mount -t overlay overlay -olowerdir=./lower,upperdir=./upper,workdir=./work ./merged
3、使用df –h 命令可以看到新构建的 overlay 文件系统已挂载。
Filesystem Size Used Avail Use% Mounted on
overlay 20G 13G 7.8G 62% /root /merged

那么 lower 和 upper 目录里有相同的文件夹及相同的文件,合并到 merged 目录里时显示的是哪个呢?规则如下:
1. 文件名及目录不相同,则 lower 及 upper 目录中的文件及目录按原结构都融入到 merged 目录中;
2. 文件名相同,只显示 upper 层的文件。如上图在 lower 和 upper 目录下及下层目录 dir_A 下都有 same.txt 文件,但在合并到 merged 目录时,则只显示 upper 的,而 lower 的隐藏 ;
3. 目录名相同, 对目录进行合并成一个目录。如上图在 lower 及 upper 目录下都有 dir_A 目录,将目录及目录下的所有文件合并到 merged 的 dir_A 目录,目录内如有文件名相同,则同样只显示 upper 的,如上图中 dir_A 目录下的same.txt文件。

overlay只支持两层,upper文件系统通常是可写的;lower文件系统则是只读,这就表示着,当我们对 overlay 文件系统做任何的变更,都只会修改 upper 文件系统中的文件。那下面看一下overlay文件系统的读,写,删除操作。

三、OverlayFS and Docker

注意镜像层和容器层是如何处理相同的文件的:容器层(upperdir)的文件是显性的,会隐藏镜像层(lowerdir)相同文件的存在。容器映射(merged)显示出统一的视图。
  overlay驱动只能工作在两层之上。也就是说多层镜像不能用多层OverlayFS实现。替代的,每个镜像层在/var/lib/docker/overlay中用自己的目录来实现,使用硬链接这种有效利用空间的方法,来引用底层分享的数据。注意:Docker1.10之后,镜像层ID和/var/lib/docker中的目录名不再一一对应。
  创建一个容器,overlay驱动联合镜像层和一个新目录给容器。镜像顶层是overlay中的只读lowerdir,容器的新目录是可写的upperdir。

四、 OverlayFS挂载

挂载一个overlay文件系统,可以通过mount -t overlay -o <options> overlay <mount point>来实现。

<mount point>是最终overlay的挂载点。

其中overlay的options有如下:

lowerdir=<dir>:指定用户需要挂载的lower层目录,lower层支持多个目录,用“:”间隔,优先级依次降低。最多支持500层。
upperdir=<dir>:指定用户需要挂载的upper层目录,upper层优先级高于所有的lower层目录。
workdir=<dir>:指定文件系统挂载后用于存放临时和间接文件的工作基础目录。
default_permissions:
redirect_dir=on/off:开启或关闭redirect directory特性,开启后可支持merged目录和纯lower层目录的rename/renameat系统调用。
index=on/off:开启或关闭index特性,开启后可避免hardlink copyup broken问题。
下面将lower和upper进行overlay,挂载到merge目录,临时workdir为work目录。


mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay merge
如下同样将lower和upper进行overlay到merge,但是merge为只读属性。
mount -t overlay -o lowerdir=upper:lower overlay merge

五、 OverlayFS使用

在使用如上mount进行OverlayFS合并之后,遵循如下规则:

lowerdir和upperdir两个目录存在同名文件时,lowerdir的文件将会被隐藏,用户只能看到upperdir的文件。
lowerdir低优先级的同目录同名文件将会被隐藏。
如果存在同名目录,那么lowerdir和upperdir目录中的内容将会合并。
当用户修改mergedir中来自upperdir的数据时,数据将直接写入upperdir中原来目录中,删除文件也同理。
当用户修改mergedir中来自lowerdir的数据时,lowerdir中内容均不会发生任何改变。因为lowerdir是只读的,用户想修改来自lowerdir数据时,overlayfs会首先拷贝一份lowerdir中文件副本到upperdir中。后续修改或删除将会在upperdir下的副本中进行,lowerdir中原文件将会被隐藏。
如果某一个目录单纯来自lowerdir或者lowerdir和upperdir合并,默认无法进行rename系统调用。但是可以通过mv重命名。如果要支持rename,需要CONFIG_OVERLAY_FS_REDIRECT_DIR。

参考文档:

https://www.jianshu.com/p/ad19a76cac0c

https://www.cnblogs.com/arnoldlu/p/13055501.html

标签:upper,lower,overlay,overlayFS,upperdir,文件系统,lowerdir,docker,目录
From: https://www.cnblogs.com/fengfengyang/p/17418736.html

相关文章

  • Docker 启动 [email protected] 并使用 Navicat 客户端连接
    docker运行mysql镜像dockerrun--namesome-mysql-p3306:3306-eMYSQL_ROOT_PASSWORD=my-secret-pw-dmysql:5.7其中some-mysql是您要分配给容器的名称my-secret-pw是要为MySQLroot用户设置的密码-p将容器的3306端口发布到主机的端口3306-e设置容器的环境......
  • mongodb基本概念 && docker安装
    https://blog.csdn.net/packge/article/details/1265393201mongoDb采用内存加磁盘的方式存储数据;2mongoDb支持数据分片,当单一的服务器中磁盘不够用的时候,还可以串联其他服务器;3客户端的请求到达内存时,先在日志中记录下操作记录,然后再去操作内存;4内存中的日志每10ms向磁盘中的......
  • ubuntu 下的文件系统initramfs解压缩
    ubuntu下的文件系统initramfs解压缩_lsinitramfs_Robert_Y_Zhang的博客-CSDN博客https://blog.csdn.net/weixin_40191420/article/details/107486888系统: ubuntu 16.04解压镜像:/boot/initrd.img-4.15.0-107-generic需要额外安装的工具:sudoapt-getinstallbinwalk-y使......
  • 用Docker发布Study.BlazorOne.Blazor到公网测试服务器
    #1、准备公网上的测试数据库。之前我们在VisualStudio里面调试的时候,使用的都是localhost的数据库。现在需要在公网上准备一个SQLServer。然后执行下面的步骤1)把Study.BlazorOne.DbMigrator设置为启动项目;2)修改appsettings.json中的连接字符串将本地localhost的配置注释掉,加上......
  • 云原生之使用Docker部署etherpad文档编辑器
    (云原生之使用Docker部署etherpad文档编辑器)一、Etherpad介绍1.Etherpad简介Etherpad是一个高度可定制的开源在线编辑器,提供真正实时的协作编辑。2.Etherpad特点Etherpad允许您实时协作编辑文档,就像在浏览器中运行的实时多人编辑器一样。与您的朋友、同学或同事一起撰写......
  • 使用docker安装 rabbitmq
    在Docker中安装RabbitMQ的步骤:安装Docker:如果您还没有安装Docker,请先按照官方文档进行安装。搜索RabbitMQ镜像:打开终端并运行以下命令来搜索可用的RabbitMQDocker镜像:dockersearchrabbitmq选择要使用的RabbitMQ版本:根据您的需求,选择一个RabbitMQ版本。例如,如果您想使用RabbitMQ......
  • docker生成nginx镜像
    dockerrun-d-p80:80\-p8088:8088\-v/home/xxx/xxx/xxx/conf/nginx.conf:/etc/nginx/nginx.conf\-v/home/xxx/xxx/xxx/dist:/home/usc/dist\--namenginx\nginx:latest#-p指定端口-v挂载目录--name指定容器的名称nginx:latest指定镜像的版......
  • 【中间件】通过 docker-compose 快速部署 Zookeeper 保姆级教程
    目录一、概述二、前期准备1)部署docker2)部署docker-compose三、创建网络四、Zookeeper编排部署1)下载Zookeeper2)配置3)启动脚本bootstrap.sh4)构建镜像Dockerfile5)编排docker-compose.yaml6)开始部署五、简单测试验证六、常用的zookeeper客户端命令1)创建节点2)查看节点3)更新节......
  • docker学习
    转自:https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html1、概念Docker把应用程序及其依赖,打包在image文件里面。只有通过这个文件,才能生成Docker容器。image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个......
  • 使用docker 安装 smoove
     001、[liujiaxin01@PC1~]$dockerimagelsREPOSITORYTAGIMAGEIDCREATEDSIZE 002、[liujiaxin01@PC1~]$dockersearchsmoove 003、[liujiaxin01@PC1~]$dockerpullbrentp/smoove 004、[liujiaxin01@PC1~]$dockerimagels......