Docker存储原理

1.Linux的Namespace、CGroups和UnionFS三大技术支撑了Docker的实现

Namespace(命名空间)是容器隔离的基础,它建立了容器间的安全边界。容器间的隔离使用到的命名空间包括:User、Mnt、Network、UTS、IPC、Pid。

CGroup(Control Group 控制组)是内核功能,用于限制、记录和隔离进程组的 CPU、内存、磁盘 I/O 等资源的使用,主要的 CGroup 子系统有 cpu、blkio、device、freezer、memory。

UnionFS(联合文件系统),允许将多个不同的文件系统或目录(称为分支)合并成一个单一的、虚拟的文件系统视图,UnionFS 在资源利用、系统维护、数据管理等方面有着重要的作用。

2.UnionFS

Docker的镜像通过分层机制构建,每个镜像层都是一个只读的模板,记录了所需的文件系统和配置。当执行Docker命令时,会基于现有镜像层创建一个新的可写层,用于构建容器运行时。这种分层机制使得镜像构建和部署变得非常高效。每条 Dockerfile 命令都会生成一个新的镜像层,使得镜像大小得以控制。Docker 使用UnionFS 技术实现了镜像的分层存储和容器的数据持久化。UnionFS 可以将多个目录合并为 一个虚拟文件系统,使得不同层级的文件和目录得以保留和共享。在容器运行时,可写层会覆盖 镜像层中的文件和目录,但不会影响底层的数据,这样既保证了容器的数据持久化,又使得镜像构建变得非常高效。

(1)例如创建如下目录:

(2)在文件写入以下内容:

(3)以mountedfs为挂载点挂载aufs文件系统:

mount -t aufs -o br:upperlayer:layer1:layer2 none mountedfs

AUFS (Another Union File System) 是一种联合文件系统(Union File System),它的核心技术能力就是将多个物理目录(被称为分支)联合挂载到同一个虚拟目录下,对外呈现为一个统一的文件系统

-o br:upperlayer:layer1:layer2

  1. br 的含义

br 是 Branch(分支)的缩写。它告诉 AUFS:要把哪些现有的系统目录(即"分支")联合在一起。

  1. : 的作用(非常关键)

冒号(:)用于分隔不同的分支目录,并且顺序决定了优先级。AUFS 严格按照从左到右的顺序来查找和读写文件。

  1. 逐层分析你的命令

-o br=upperlayer:layer1:layer2

  • upperlayer (最左侧):

    • 身份:读写(read-write)层。

    • 优先级:最高。AUFS 访问任何文件,都会先在这里找。

    • 你的实例:你之前困惑的 file4 应该被创建在这里。如果当时你在正确的挂载点 (mountedfs) 里新建文件,文件物理上就会出现在 upperlayer 目录里。

  • layer1 (中间):

    • 身份:只读(read-only)层(默认下层都是只读)。

    • 优先级:中等。只有当 upperlayer 里不存在某个文件时,AUFS 才会来这一层找。

  • layer2 (最右侧):

    • 身份:只读(read-only)层。

    • 优先级:最低。只有当 upperlayerlayer1 里都找不到文件时,才会最后来这一层找。

(4)mountedfs中file1来自于layer1;从左到右的顺序来查找和读写文件

(5)在挂载点读写文件时,新文件/修改才会按照 AUFS 的写时复制(CoW)规则写入 **最上层(upperlayer),**因为挂载到目录在MOUNTEDFS,所以file4在mountedfs中显示

(6)删除file1

UFS 的处理机制详解

对于 file4(新建文件)

  • 动作:直接创建

  • 物理位置upperlayer/file4

  • 挂载点视图 :可见 file4

对于 .wh.file1(删除下层文件)

  • 背景file1 原本存在于 layer1/(只读层)

  • 你的操作 :在挂载点执行 rm file1

  • AUFS 的处理

    1. 无法删除 layer1/file1(因为是只读层)

    2. upperlayer/ 创建一个白出文件.wh.file1

    3. 这个白出文件就像一个"遮罩",告诉 AUFS:"file1 已经被删除了,不要显示下层的那个"

(7)新建一个file1

相关推荐
虎头金猫2 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS2 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
AI职业加油站2 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏2 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
玉&心2 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing2 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
-梅2 天前
linux(8) 软硬链接
linux·运维·服务器
赵文宇(温玉)2 天前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang2 天前
上传本地镜像到harbor中
docker·容器·持续部署
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github