OverlayFS 文件系统介绍
引言
OverlayFS(Overlay Filesystem)是 Linux 内核中的一种联合文件系统(Union Filesystem),它通过叠加多个目录形成一个单一的文件系统视图。作为 Docker 的默认存储驱动之一,OverlayFS 在提高性能和简化容器文件系统管理方面发挥了重要作用。本文将详细介绍 OverlayFS 的基本概念、工作原理和在 Docker 中的应用。
一、OverlayFS 的基本概念
OverlayFS 是一种联合文件系统,允许将多个目录叠加在一起,形成一个统一的文件系统视图。它主要由以下几个部分组成:
- 上层目录(Upper Layer): 上层目录是可写的,用于存放文件系统的最新状态。所有对文件系统的写操作都会首先作用于上层目录。
- 下层目录(Lower Layer): 下层目录是只读的,存放文件系统的基础数据。下层目录可以是一个或多个,多个下层目录会被按顺序叠加。
- 合并目录(Merged Directory): 合并目录是上层目录和下层目录叠加形成的统一视图。用户通过合并目录访问文件系统时,看到的是上层目录和下层目录的组合结果。
二、OverlayFS 的工作原理
OverlayFS 通过将上层目录和下层目录的内容合并,提供一个统一的文件系统视图。其工作原理可以概括为以下几点:
- 读取操作: 当从合并目录中读取文件时,OverlayFS 首先检查上层目录中是否存在该文件。如果存在,则直接读取上层目录中的文件;如果不存在,则从下层目录中读取该文件。
- 写入操作: 当向合并目录中写入文件时,OverlayFS 会将该文件写入上层目录。如果上层目录中不存在该文件且下层目录中存在该文件,则会将下层目录中的文件复制到上层目录,然后在上层目录中进行写操作(写时复制机制)。
- 删除操作: 当从合并目录中删除文件时,OverlayFS 并不会直接删除下层目录中的文件,而是会在上层目录中创建一个“白色节点”(Whiteout)。白色节点表示该文件在上层目录中被删除,即使下层目录中仍然存在该文件,合并目录中也不会显示。
三、OverlayFS 在 Docker 中的应用
OverlayFS 是 Docker 的默认存储驱动之一,它通过高效的分层存储和写时复制机制,显著提升了容器的启动速度和资源利用效率。在 Docker 中,OverlayFS 的应用主要体现在以下几个方面:
3.1 镜像和容器的分层存储
Docker 镜像和容器采用分层存储的方式,每个镜像层和容器层都是只读或可写的目录。OverlayFS 将这些目录叠加在一起,形成一个完整的文件系统视图。例如,一个 Docker 镜像可能包含多个层,每个层都依赖于下层的数据。容器启动时,Docker 会在镜像层之上创建一个可写层,通过 OverlayFS 将各层合并,提供给容器使用。
3.2 写时复制机制
OverlayFS 的写时复制机制在 Docker 中得到了充分利用。当容器对文件系统进行写操作时,只有被修改的文件会被复制到可写层中,从而减少了数据复制的开销,提高了存储效率。例如,当多个容器共享同一个基础镜像时,每个容器的可写层只记录自身的变化数据,而基础镜像层的数据只需存储一次,大大节约了存储空间。
3.3 容器的快速启动和销毁
由于 OverlayFS 通过叠加现有目录提供文件系统视图,因此 Docker 容器的启动和销毁过程非常快速。当创建一个新容器时,只需在镜像层之上添加一个新的可写层;当销毁容器时,只需删除该可写层,而不影响镜像层的数据。这种机制使得容器的启动和销毁非常高效,适合快速部署和频繁更新的应用场景。
四、OverlayFS 的优缺点
4.1 优点
- 高性能: OverlayFS 采用写时复制机制,只在需要时复制数据,减少了不必要的数据复制和存储开销。
- 灵活性: 支持多个下层目录的叠加,提供灵活的文件系统视图,适用于复杂的文件系统需求。
- 资源利用率高: 多个容器可以共享同一个基础镜像层,减少了存储空间的浪费,提高了资源利用率。
4.2 缺点
- 复杂性: 由于涉及多层目录的叠加和写时复制机制,文件系统的管理和调试变得更加复杂。
- 兼容性: 虽然 OverlayFS 是现代 Linux 内核的标准组件,但在某些老旧内核或特定文件系统上可能不完全兼容,需要额外的配置和测试。
五、OverlayFS 的优化建议
尽管 OverlayFS 性能优异,但在实际应用中仍需进行优化,以确保最佳性能和可靠性。以下是一些优化建议:
- 选择合适的基础镜像: 使用轻量级和优化的基础镜像可以减少镜像层的数量和大小,提高容器的启动速度。
- 减少写操作: 尽量减少容器运行期间的写操作,将需要频繁写入的数据存储在数据卷或绑定挂载中,以减少 OverlayFS 的写时复制开销。
- 定期清理无用数据: 定期清理无用的镜像和容器,释放存储空间,避免文件系统层数过多影响性能。
六、结论
OverlayFS 作为 Docker 默认的存储驱动之一,通过高效的分层存储和写时复制机制,显著提升了容器的性能和资源利用率。尽管 OverlayFS 在管理和调试上存在一定的复杂性,但其优异的性能和灵活性使其成为 Docker 容器文件系统的理想选择。通过合理使用和优化 OverlayFS,我们可以更好地发挥 Docker 的潜力,实现高效、可靠的容器化应用部署和管理。
相关文章:
OverlayFS 文件系统介绍
引言 OverlayFS(Overlay Filesystem)是 Linux 内核中的一种联合文件系统(Union Filesystem),它通过叠加多个目录形成一个单一的文件系统视图。作为 Docker 的默认存储驱动之一,OverlayFS 在提高性能和简化容…...
【C++】用Lua绑定C/C++对象,实现对脚本调用(依赖LuaBridge实现)
【C++】使用LuaBridge为Lua绑定C/C++对象,实现对脚本调用 问题: 如何在C++实现对如下脚本读取,在不改变代码的情况下实现修改脚本打开不同链接? <?xml version="1.0" encoding="utf-8"?> <root><script src="lua:lua_demo&quo…...
Java面试——Tomcat
优质博文:IT_BLOG_CN 一、Tomcat 顶层架构 Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。Service主要包含两个部分:Connector和…...
2024年7月个人工作生活总结
本文为 2024年7月工作生活总结。 研发编码 “康威定律(Conway’s Law)”思考 康威定律是 50 年前(1967 年)由 梅尔文康威 提出的,最初的说法如下: Any organization that designs a system (defined broa…...
快速方便地下载huggingface的模型库和数据集
快速方便地下载huggingface的模型库和数据集 方法一:用于使用 aria2/wgetgit 下载 Huggingface 模型和数据集的 CLI 工具特点Usage 方法二:模型下载【个人使用记录】保持目录结构数据集下载不足之处 方法一:用于使用 aria2/wgetgit 下载 Hugg…...
JAVA小白学习日记Day10
1.线程锁 使用Runnable接口和Lambda表达式: 在 EasyThreadA 类的 mainA 方法中,通过创建 Runnable 实例 run,并使用Lambda表达式。 EasyThreadA::method 绑定到 run 上。然后创建两个线程 a 和 b,分别启动它们,它们会…...
分布式相关理论详解
目录 1.绪论 2.什么是分布式系统,和集群的区别 3.CAP理论 3.1 什么是CAP理论 3.2 一致性 3.2.1 计算机的一致性说明 1.事务中的一致性 2.并发场景下的一致性 3.分布式场景下的一致性 3.2.2 一致性分类 3.2.3 强一致性 1.线性一致性 a) 定义 a) Raft算法…...
Linux基础知识之Shell命令行及终端中的快捷键
1.察看历史命令快捷键 按键 操作 ctrl p 返回上一次输入命令字符 ctrl n 返回下一次输入命令字符 ctrl r 输入单词甚至词组搜索匹配历史命令 alt p 输入字符查找与字符相接近的历史命令 alt . 向之前执行的命令的最后一个参数轮循, 并将之添加到当前光标之后…...
研究生选择学习Android开发的利与弊?
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「Android的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!产品经理可以学学Axure快…...
怎么评价程序员40岁了竟然还在撸代码?
怎么评价外卖员40岁了竟然还在送外卖? 怎么评价滴滴司机40岁了竟然还在跑滴滴? 怎么评价老师40岁了竟然还在教书?难道程序员的本职工作不是敲代码吗?无论你是管理层还是螺丝钉,工业环境下怎么可能一行代码都不敲呢&…...
SQL优化(一)基础概念
基数(cardinality) 表中某个列的唯一键的数量叫做基数,主键列的基数就是表中数据的总行数。 可以用select count(distinct 列名) from 表名来计算基数。 基数的高低影像列的数据分布。 例如:先用Scott账户创建一个测试表test …...
【C++高阶】哈希:全面剖析与深度学习
目录 🚀 前言一: 🔥 unordered系列关联式容器1.1 unordered_map1.2 unordered_set 二: 🔥 哈希的底层结构 ⭐ 2.1 哈希概念⭐ 2.2 哈希冲突⭐ 2.3 哈希函数⭐ 2.4 哈希冲突解决2.4.1 🌄闭散列2.4.2 &#x…...
PHP西陆招聘求职系统小程序源码
🔥【职场新宠】西陆招聘求职系统,你的职场加速器🚀 🎉【开篇安利:一站式求职新体验】🎉 还在为找工作焦头烂额吗?是时候告别传统招聘网站的繁琐与低效了!今天给大家种草一个超赞的…...
系统移植(十一)根文件系统(未整理)
文章目录 一、根文件系统中各个目录文件功能解析:二、对busybox进行配置和编译(一)执行make help命令获取make的帮助信息(二)对busybox源码进行配置,配置交叉编译器(三)执行make men…...
mac中docker常用命令总结
在Mac中,Docker的常用命令可以总结如下表格: 命令用途docker run运行一个新的容器实例。可以指定镜像名来启动容器,并支持多种参数来调整容器的运行方式。docker ps列出当前正在运行的容器。可以通过添加-a参数来列出所有容器(包…...
Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3(含分析过程)
Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3(含分析过程) 目录 Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 [ 项目介绍 ] [ 获取数据 ] [ 创建测试集 ]| 1/3&#x…...
Linux 4: Bash
1 Bash环境 1 命令执行的顺序 1 绝对路径、相对路径 2 alias 3 内置的builtin 4 $PATH找到的第一个命令 2 bash的登录信息,保存在哪里? 保存在/etc/issue. 3 bash的环境配置文件 1 如果是login shell,读以下,有优先级:如果…...
第十四天学习笔记2024.7.25
Git安装 1.安装git 2.创建git仓库 3.创建文件并且提交文件 (git add . 将文件提交到缓存)(git commit -m 说明)(git log 查看历史) 4.分支创建与解决分支冲突问题 创建主机(git 192.1…...
花几千上万学习Java,真没必要!(三十七)
IO 流: 读取数据到内存的过程:可以包括从硬盘、网络或其他存储设备中将数据加载到内存中,以便程序能够访问和处理这些数据。 写入数据到硬盘的过程:通常是将内存中的数据保存到硬盘或其他持久性存储设备中,以便长期存…...
SSA-GRU(自适应平滑自回归门控循环单元)预测模型及其Python和MATLAB实现
SSA-GRU(自适应平滑自回归门控循环单元)预测模型是结合了SSA(Singular Spectrum Analysis,奇异谱分析)和GRU(Gated Recurrent Unit,门控循环单元)模型的一种时间序列预测方法。以下是…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
