当前位置: 首页 > news >正文

Docker:存储原理

Docker:存储原理

    • 镜像
      • 联合文件系统
      • overlay
      • 镜像存储结构
      • 容器存储结构
    • 存储卷
      • 绑定挂载
      • 存储卷结构


镜像

联合文件系统

联合文件系统Union File System是一种分层,轻量且高效的文件系统。其将整个文件系统分为多个层,层与层之间进行覆盖,并对外表现为一个一致的文件系统。

在这里插入图片描述

上图有三种操作,A(add)表示新建文件,C(change)表示修改文件,D(delete)表示删除文件。这个文件系统分为三层,但是对外用户只能看到红色这一层。

比如a.txt,在第二层就被删除了,那么用户看不到这个文件,但是其实这个文件依然被存储在文件系统的第一层中。删除文件只是一种标记,表示上层不可见,不会真的删除文件

再比如b.txt,在第一层创建,在第二层修改,那么第二层的内容就会覆盖掉第一层的内容,用户看到第二层的内容。但是对于b.txt,其实保存了两份在文件系统中,第一份在第一层,第二份在第二层。

在红色层,其实是没有存储任何具体的文件的,而是存储了大量文件的引用。比如访问c.txt,其实访问到的是第二层中的文件,其并没有把文件系统内部的文件再进行一次拷贝。但是如果用户要修改文件,此时触发写时拷贝,那么会把该文件拷贝一份到当前层,然后再修改。比如b.txt在第二层进行了修改,其实就是把第一层的文件拷贝一份到第二层,然后再进行修改。所以先前才说b.txt在文件系统中保存了两份。


overlay

overlay是联合文件系统的一种具体实现,其也是Docker采用的联合系统方案。

在这里插入图片描述

overlay采用三层结构,每一层由一个目录管理。从下往上依次是:

  • lowerdir:最底层,内部的所有文件都是只读文件
  • upperdir:中间层,可以读写,可以在该层创建,删除,修改文件
  • merged:最顶层,也就是用户所看到的层,其基于前两层提供一个统一的视图

除去这三个层,还有一个workdir层,这层并不展示给用户,当upperdir层要修改文件时,会先在workdir层进行修改,只有操作完成后,才会同步到upperdir层。

  1. 读取文件: 用户读取文件时,可以同时看到upperdir或者lowerdir层,只要文件没有被覆盖,就可以被读取到
  2. 写入文件:如果文件在upperdir层,直接进行修改,如果文件在lowerdir层,发生写时拷贝,将文件拷贝到upperdir层再修改
  3. 删除文件:如果文件在upperdir层,那么直接删除文件,如果文件在lowerdir层,不会删除文件,而是标记为不可见

对于大部分Linux系统,都是自带overlay文件系统的,可以基于mount命令模拟一下overlay文件系统。

  1. 创建四个目录,表示不同层

在这里插入图片描述

overlay中,其实一层就是一个目录,创建四个目录,后续在这四个目录上创建一个overlay文件系统。

  1. 写入文件

在这里插入图片描述

lowerupper目录中写入一些文件,low.txt只在lower层出现,up.txt只在upper层出现,both.txt在两个层都出现。

  1. 创建文件系统
mount -t overlay overlay 
-o lowerdir=./lower,upperdir=./upper,workdir=./work ./merged

这个命令,会创建一个overlay文件系统,-t overlay表示文件系统类型,第二个overlay是一个应用程序,表示用这个程序来操控文件系统。

-o指定文件系统的相关参数,用,逗号分隔,可以看出分别代表lowerdirupperdirworkdir三个层。

最后的./merged不是-o的参数,这是挂载点,表示用户最后通过./merged目录访问整个文件系统。

在这里插入图片描述

执行命令挂载成功后,./merged就被初始化了,其可以看到low.txtup.txtboth.txt

此处merged目录中,所有文件都是一个引用,文件都存储在lowerupper中。这可以通过查询inode来证明,如果两个文件的inode一样,那么在硬盘中指向的就是同一块空间,通过ls-i参数。

在这里插入图片描述

查询mergeupperup.txt文件,第一栏都是562812,也就是说两者inode相同,就是同一个文件。

借此,可以查看merge/both.txt使用的哪一层的内容:

在这里插入图片描述

可以看到merge/both.txtupper/both.txtinode = 562810,相同的,也就是说lower层的both.txt被覆盖了,用户看不到这层的both.txt

  • 修改merged/low.txt

在这里插入图片描述

此时不仅仅是merged内部的low.txt改变了,而upper层多出一个low.txt,这是因为写时拷贝。如果修改的文件在lower层,会把文件拷贝到upper层再修改,不会影响原文件。

因此后续cat输出文件内容时,可以看到upper/low.txt是最新写入的内容,而lower/low.txt是一个空文件。

  • 删除merge/low.txt

在这里插入图片描述

删除文件后,lower层内部的文件还在,在upper目录下,多出一个low.txtwork也多出一个新内容。

看看多出的upper/low.txt

在这里插入图片描述

其权限为c---------,也就是没有任何权限,这就是一个删除标记,表示这个文件虽然在lower中存在,但是已经被标记为删除了,所以用户看不到这个文件。

  • 删除merge/up.txt

在这里插入图片描述

此时这个up.txt真的就被删除了,没有任何标记,因为upper层本身就是可以读写的,删除文件 并不会被标记。

实验完毕,可以通过umount卸载这个文件系统:

umount 挂载路径

在这里插入图片描述


那么这个联合文件系统,到底和Docker什么关系?

在这里插入图片描述

其实Docker就是使用的overlay结构存储文件,镜像层就是lowerdir层,容器层就是upperdir层,用户看到的是merged层。

一个镜像可以实例化为多个容器,就是因为所有容器都共用一个lowerdir,因为这个层只读,不会修改镜像的内容,任何容器做的所有修改,都在自己的upperdir中。


镜像存储结构

docker inspect centos查看一个centos镜像的详细信息:

在这里插入图片描述

可以看到,在GraphDriver中,包含了三个熟悉的目录,MergedDirUpperDirWorkDir,并且使用的文件系统为overlay2

查看这个UpperDir的内容:

在这里插入图片描述

这就是操作系统的根目录!所以每当创建一个centos容器时,看到的就是这个目录,让用户感觉自己处于一个新的操作系统中。

由于centos镜像,本身就是一个非常底层的镜像,所以它没有lowerDir,此时可以基于centos镜像再创建一个镜像:

在这里插入图片描述

以上操作,创建了一个centos容器,然后进去创建了三个文件,退出后通过commit创建了一个test:v1镜像。

docker inspect test:v1查看这个镜像的信息:

在这里插入图片描述

这个新建的镜像,就有LowerDir了,查看LowerDir的内容,其实就是centos镜像的内容,说明新的镜像把老的镜像作为了基底。

而在UpperDir中,是之前在容器内部创建的三个文件。


容器存储结构

刚才发现,在一个镜像内部,有upperdir层,lowerdir层,那么容器层去哪里了,不是说upper层是容器吗?为什么镜像也有upper层?

把刚才的test:v1镜像,实例化为一个容器:

docker run -d --name test test:v1

然后再查看容器的详细信息:

docker container inspect test

在这里插入图片描述

可以发现,容器也分为LowerDirUpperDir等等内容,在LowerDir,有很长一个路径,细看可以看出是由:冒号分隔的三段路径:

/data/var/lib/docker/overlay2/9f8d970f2ece5d2ad7985cad1d12821e0c10355f60846ce5429207788b8b81ed-init/diff
/data/var/lib/docker/overlay2/20c74607fa2b73e5e419e6f2167e4220aa2b3f3e164cbaa928e8ed87421d3051/diff
/data/var/lib/docker/overlay2/ef10e4f37d8b8015c2319620bc8e391a824275741bc50e34bbf92392cb53c474/diff

依次输出这三段路径的内容:

在这里插入图片描述

熟悉的目录出现了,依次是centos层,test:v1新增的层,以及一个init层。

原先镜像的所有层,在容器实例化后,都变成了容器的LowerDir

此处的init层,内部包含两个目录devetc,这在centos层中也有。其实这个init层,是容器初始化时的层,因为初始化时修改了devetc,由于写时拷贝,会把文件拷贝到init层再修改。

docker通过overlay来对容器分层,而镜像本身也被overlay分层了,所以这里使用了两次联合文件系统。

在这里插入图片描述

对于容器来说,将镜像作为LowerDir进行处理。而对于镜像来说,镜像本身的资源结构也被分层管理了,镜像的所有层,都作为容器的LowerDir层。


存储卷

绑定挂载

存储卷是基于绑定挂载实现的,绑定挂载是Linux中的一种挂载操作,它允许将一个文件或目录挂载到文件系统的另一个位置,从而在两个不同的路径下访问相同的文件或目录这种挂载方式不会复制文件,而是创建一个指向原始文件或目录的引用

可以使用mount命令来执行绑定挂载:

mount --bind <source> <target>
  • source:要挂载的原始文件或目录的路径
  • target:挂载点,即你希望文件或目录出现在的位置

要卸载绑定挂载,可以使用umount命令:

umount 挂载点

这将卸载/mnt/data的挂载点,但不会删除/data目录或其内容。

试验一下:

在这里插入图片描述

首先创建两个目录,在第一个目录中有三个文件,第二个目录是一个空目录。

dir2绑定挂载到dir1

在这里插入图片描述

此时dir2也出现了这三个文件,并且查询1.txt,可以发现两个文件的inode是一样的。


存储卷结构

Docker的存储卷,就是使用了绑定挂载,把宿主机的文件,与容器内部的文件进行绑定,此时两个文件其实是同一个文件,互相操作都是可以看到的。

那么问题来了,容器是有文件系统隔离的,在mount --bind时要指定两个文件,宿主机看不到容器内部的文件,容器内看不到宿主机的文件,如何才能mount --bind同时指定处于不同环境下的两个文件?

其实这是不可行的,被文件隔离的两个环境,是无法mount --bind绑定挂载两个文件的,因此要在容器创建后,文件隔离开启前,进行绑定挂载存储卷

在容器创建后,会经过一段时间的初始化,文件隔离很早就会开启,但是开启文件隔离后,还要chroot命令,容器与宿主机的文件系统才相互不可见。

所以要在执行chroot命令之前,就进行绑定挂载:

在这里插入图片描述

顺便说一下,联合文件系统中,容器也是要访问宿主机中的镜像底层文件的,这也要在choroot之前完成挂载,让容器可以看到宿主机中的镜像文件,这基于联合挂载,是一种和绑定挂载不同的挂载方式,也是联合文件系统依赖的挂载方式。

联合挂载完毕后,就是存储卷的绑定挂载,最后执行chroot,两个文件系统彻底隔离。


相关文章:

Docker:存储原理

Docker&#xff1a;存储原理 镜像联合文件系统overlay镜像存储结构容器存储结构 存储卷绑定挂载存储卷结构 镜像 联合文件系统 联合文件系统Union File System是一种分层&#xff0c;轻量且高效的文件系统。其将整个文件系统分为多个层&#xff0c;层与层之间进行覆盖&#x…...

ts:数组的常用方法(push、pop、shift、unshift、splice、slice)

前端css中filter的使用 一、主要内容说明二、例子&#xff08;一&#xff09;、push方法&#xff08;尾添加&#xff09;1.源码1 &#xff08;push方法&#xff09;2.源码1运行效果 &#xff08;二&#xff09;、pop方法&#xff08;尾删除&#xff09;1.源码2&#xff08;pop方…...

物联网网关确保设备安全

物联网&#xff08;IoT&#xff09;网关在确保设备安全方面扮演着至关重要的角色。 作为连接物联网设备和云端或企业系统的中介&#xff0c;物联网网关可以实施多种安全措施来保护设备和数据。 是物联网网关确保设备安全的关键方法&#xff1a; 1. 设备认证和授权 认证&…...

Vue学习笔记(五)

Class绑定 数据绑定的一个常见需求场景式操纵元素的CSS class列表&#xff0c;因为class是attribute,我们可以和其他attribute一样使用v-bind将它们和动态的字符串绑定。但是&#xff0c;在处理比较复杂的绑定时&#xff0c;通过拼接生成字符串是麻烦且易出错的。因此&#xf…...

Nestjs返回格式小结

在 NestJS 中&#xff0c;除了 text/event-stream&#xff08;用于 Server-Sent Events&#xff09;之外&#xff0c;还有多种格式的返回方式&#xff0c;具体取决于你的应用需求。以下是一些常见的返回格式及其示例&#xff1a; 1. JSON 格式 Get(json) getJsonResponse(Res…...

【力扣刷题实战】相同的树

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 相同的树 题目描述 示例 1&#xff1a; 示例 2&#xff1a; 示例 3&#xff1a; 解题思路 题目理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#…...

Golang | Leetcode Golang题解之第515题在每个树行中找最大值

题目&#xff1a; 题解&#xff1a; func largestValues(root *TreeNode) (ans []int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {maxVal : math.MinInt32tmp : qq nilfor _, node : range tmp {maxVal max(maxVal, node.Val)if node.Left ! nil {q …...

Zookeeper 对于 Kafka 的作用是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper 对于 Kafka 的作用是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Zookeeper 对于 Kafka 的作用是什么&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 在 Kafka…...

Thread类及线程的核心操作

一. Thread类的常见构造方法 1. Thread() Thread类无参的构造方法, 用于创建Thread类的实例对象. 2. Thread(String name) 带一个参数的Thread类构造方法, 创建一个线程对象, 并给其命名. [注]: 如果不专门给线程命名, 那么线程默认的名字就是Thread-0, Thread-1, Thread-…...

算法|牛客网华为机试11-20C++

牛客网华为机试 上篇&#xff1a;算法|牛客网华为机试1-10C 文章目录 HJ11 数字颠倒HJ12 字符串反转HJ13 句子逆序HJ14 字符串排序HJ15 求int型正整数在内存中存储时1的个数HJ16 购物单HJ17 坐标移动HJ18 识别有效的IP地址和掩码并进行分类统计HJ19 简单错误记录HJ20 密码验证…...

OpenAI低调发布多智能体工具Swarm:让多个智能体协同工作!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…...

性能之光 年度电竞性能旗舰iQOO 13发布

2024年10月30日&#xff0c;被定义为“性能之光”的年度电竞性能旗舰——iQOO 13正式发布&#xff0c;售价3999元起。iQOO 13作为iQOO 品牌在性能上的又一次深入探索&#xff0c;它像是一束光&#xff0c;引领行业不断拉高性能上限&#xff0c;让用户看到更多的可能性。 iQOO …...

如何避免因不熟悉数据保护法规而受损

在当今数字化时代&#xff0c;数据保护法规的遵守对于企业至关重要。不熟悉新的数据保护法规会导致法律风险增加、财务损失、声誉受损、客户信任下降等多方面的负面影响。其中&#xff0c;法律风险增加尤为严重&#xff0c;因为不符合规定可能引发高额罚款和法律诉讼。企业若未…...

LLaMA Factory 核心原理讲解

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…...

Java题集练习5

Java题集练习5&#xff08;集合&#xff09; 1.三种集合差别&#xff0c;集合类都是什么&#xff0c;数据结构是什么&#xff0c;都什么时候用 三者关系 Set集合 Set接口是Collection接口的一个子接口是无序的&#xff0c;set中不包含重复的元素&#xff0c;也就是说set中不…...

操作系统学习笔记-2.3哲学家和管程问题

哲学家问题 问题描述 假设有五位哲学家围坐在一张圆桌旁&#xff0c;每位哲学家面前放有一盘意大利面&#xff0c;他们各自间隔放置一根叉子。哲学家的行为分为“思考”和“进餐”两种状态。为了进餐&#xff0c;哲学家需要同时拿起左手边和右手边的两根叉子。用餐结束后&…...

2023年信息安全工程师摸底测试卷

目录 1.密码算法 2.等级保护 3.密码学 4.安全评估 5.网络安全控制技术 6.恶意代码 7.身份认证 8.资产管理 9.密码分类 10.被动攻击 11.商用密码服务​编辑 12.超文本传输协议 13.数字水印技术 14.信息系统安全设计 15.重放攻击 16.信息资产保护 17.身份认证 …...

ReactOS系统中平衡二叉树。给定地址超导其所属区块MmFindRegion()

系列文章目录 PMM_REGION NTAPI MmFindRegion( PVOID BaseAddress, PLIST_ENTRY RegionListHead, PVOID Address, PVOID* RegionBaseAddress ); 宏函数 //给定地址找到其中所属区块 #define CONTAINING_RECORD(address,type,field) ((type FAR *\(PCHAR)(address)-(PCHAR)(&…...

基于TESSY的单元测试与分类树方法深入解析

在现代软件开发中,单元测试是确保软件质量和可靠性的关键步骤之一。特别是对于嵌入式软件,由于其应用环境的特殊性和高安全性要求,单元测试显得尤为重要。本文将基于《TESSY 用户手册》的内容,详细介绍如何使用TESSY 进行单元测试,并深入探讨分类树方法(Classification T…...

整理了一些大模型的课程,非常详细,大模型零基础入门到精通,收藏我这一篇就够了

目前有多个科普类的大模型课程&#xff0c;这些课程涵盖了从基础理论到实际应用的各个方面。以下是一些主要的科普类大模型课程&#xff1a;复旦大学“大模型开发与赋能”专题讲习班&#xff1a;由复旦大学计算机学院邱锡鹏教授带来的《大模型科普讲解》课程&#xff0c;通过深…...

区块链国赛题目--食品溯源(模块三)

区块链国赛题目–食品溯源(模块三) 任务 3-1:区块链应用前端功能开发 1.请基于前端系统的开发模板,在登录组件 login.js、组件管理文件components.js 中添加对应的逻辑代码,实现对前端的角色选择功能,并测试功 能完整性,示例页面如下: 具体要求如下: (1)有明…...

【Searxng】Searxng docker 安装

SearXNG将用户的查询请求分发至多个支持的搜索引擎&#xff0c;并收集返回的结果进行汇总处理。在这个过程中&#xff0c;它通过内置的过滤器功能屏蔽广告和其他不相关内容&#xff0c;确保搜索结果的纯净度。 一键部署 docker run \--name searxng \-p ????:8080 \-v ~/s…...

Java Lock/AQS ReentrantLock 源码

前言 相关系列 《Java & Lock & 目录》&#xff08;持续更新&#xff09;《Java & AQS & 目录》&#xff08;持续更新&#xff09;《Java & Lock/AQS & ReentrantLock & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Jav…...

魔法伤害--是谁偷走了我的0

起因&#xff1a;需要迁移数据进行数据更新&#xff0c;使用pandasorcal进行数据处理以及库迁移 首先把数据导出为xls格式数据文件&#xff0c;使用python import pandas as pdnew_obj pd.read_excel(ne,dtype{DAY: str, MONTH: str}) 原有导出数据格式为&#xff1a; 使用…...

【ArcGIS Pro实操第4期】绘制三维地图

【ArcGIS Pro实操第4期】绘制三维地图 ArcGIS Pro绘制三维地图-以DEM高程为例参考 如何使用ArcGIS Pro将栅格数据用三维的形式进行表达&#xff1f;在ArcGIS里可以使用ArcScene来实现&#xff0c;ArcGIS Pro实现原理跟ArcScene一致。由于Esri未来将不再对ArcGIS更新&#xff0c…...

Vuestic 整理使用

简单示例 1. 条件渲染 2. 列表渲染 3. 组件插槽 4. 插值语法 5. 前后端路由的区别(还是转一下,可以减少代码量)SFC 构建 … … Okay&#xff0c;可以干活了&#xff0c;通顺 数据表的操作更加简化了 数据类别通过后端路由区别,但是还得由前端路由转一下 简单了许多呀,上脚手…...

学习伊圣雨老师的 epoll 编程

&#xff08;1&#xff09;书里提出了疑问&#xff0c;epoll 函数的工作方式&#xff0c;区分为水平触发与边缘触发 &#xff1a; &#xff08;2&#xff09; 谢谢...

详细了解C++11(1)

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各…...

ITA的去锅盖处理流程

一、说明 锅盖是什么 锅盖的类型有哪些 二、去锅盖处理流程 去锅盖算法首先需要采集一份锅盖模板数据,该模板数据用户可以自定义保存,方便后面的开机重启直接导入使用。去锅盖处理包含两个历程:保存锅盖模板;去锅盖处理。 保存锅盖模板: ( 1 ) 打开采集锅盖模板开关。…...

日志管理系统的系统目标是什么?

在网络安全、数据管理、故障排查等领域&#xff0c;日志都被广泛使用并需要进行有效的管理与分析。因此&#xff0c;日志管理系统的系统目标显得尤为重要&#xff0c;如以下几方面。 1、确保数据的安全性及完整性 在企业和组织的日常运营中&#xff0c;各类信息数据都会通过系统…...

wordpress 新浪/seo软文推广工具

本文测试通过条件&#xff1a; VMware-Workstation-Pro-14.0.0.6661328 Ubuntu 16.04 先来一种物理卷和逻辑卷的关系图&#xff1a; 本图拍自书籍&#xff1a;Linux命令行与Shell脚本编程大全(第三版155页) 方法步骤&#xff1a; 一 在虚拟机中添加一块4G的硬盘&#xff0c;…...

网站建设与研发/可以看任何网站的浏览器

人生之大悲痛者&#xff0c;莫过于老无所养、幼无所托、青春无所伴。这是很现实的一种普遍存在的现象.若大的中国,到处可见.对于农民工及其家人来说&#xff0c;可以说人世间所有的苦难全都由他们来承担了&#xff01;这是他们自愿的选择吗&#xff1f;什么时候、什么原因&…...

wordpress 仿钛媒体/微博推广方法有哪些

最近再次复习C语言&#xff0c;用的教材是《C Primer》这本教材&#xff0c; 看到第二章的时候&#xff0c;里面有个问题困扰了我。 于是想上网查查怎么回事&#xff0c; 结果看了很久都没有得到一个满意的答案。 书上有这么一段话&#xff1a;当将一个超出数据类型取值范围的值…...

数字企业管理系统/漯河搜狗关键词优化排名软件

- 题目大意 输入几个单词&#xff0c;让你判断不同的单词有几个&#xff08;不必区分大小写&#xff09;。 - 解题思路 因为不区分大小写&#xff0c;所以现将单词换位统一格式&#xff0c;然后只需用set容器即可&#xff08;因为set中不会有重复的元素出现&#xff09;。 - 代…...

云南省建设厅官方网站证书/网络营销策略优化

var value $(‘input[name“sex”]:checked’).val();...

进行优化/郑州网站seo

OpenJDK中同时会有好几个项目在进行中。这些项目所带来的修改可能会加入到以后版本的JDK中。本文带你看一下OpenJDK中正在进行的重要项目&#xff0c;提前了解以后版本的JDK中会增加的功能。AmberAmber项目关注的是Java语言的小改动。Amber项目的一些成果已经被添加到JDK中。这…...