docker文件存储驱动:AUFS 文件系统原理及生产环境的最佳配置

简介: docker文件存储驱动:AUFS 文件系统原理及生产环境的最佳配置

什么是联合文件系统


20210507224045836.png

联合文件系统(Union File System,Unionfs)是一种分层的轻量级文件系统,它可以把多个目录内容联合挂载到同一目录下,从而形成一个单一的文件系统,这种特性可以让使用者像是使用一个目录一样使用联合文件系统。


那联合文件系统对于 Docker 是一个怎样的存在呢?它可以说是 Docker 镜像和容器的基础,因为它可以使 Docker 可以把镜像做成分层的结构,从而使得镜像的每一层可以被共享。例如两个业务镜像都是基于 CentOS 7 镜像构建的,那么这两个业务镜像在物理机上只需要存储一次 CentOS 7 这个基础镜像即可,从而节省大量存储空间。


说到这儿,你有没有发现,联合文件系统只是一个概念,真正实现联合文件系统才是关键,那如何实现呢?其实实现方案有很多,Docker 中最常用的联合文件系统有三种:AUFS、Devicemapper 和 OverlayFS。


今天我主要讲解 Docker 中最常用的联合文件系统里的 AUFS,为什么呢?因为 AUFS 是 Docker 最早使用的文件系统驱动,多用于 Ubuntu 和 Debian 系统中。在 Docker 早期,OverlayFS 和 Devicemapper 相对不够成熟,AUFS 是最早也是最稳定的文件系统驱动。

AUFS 工作原理


AUFS 是联合文件系统,意味着它在主机上使用多层目录存储,每一个目录在 AUFS 中都叫作分支,而在 Docker 中则称之为层(layer,但最终呈现给用户的则是一个普通单层的文件系统,我们把多层以单一层的方式呈现出来的过程叫作联合挂载

20210507224435706.png

如图 1 所示,每一个镜像层和容器层都是 /var/lib/docker 下的一个子目录,镜像层和容器层都在 aufs/diff 目录下,每一层的目录名称是镜像或容器的 ID 值,联合挂载点在 aufs/mnt 目录下,mnt 目录是真正的容器工作目录。


下面我们针对 aufs 文件夹下的各目录结构,在创建容器前后的变化做详细讲述。


当一个镜像未生成容器时,AUFS 的存储结构如下。


diff 文件夹:存储镜像内容,每一层都存储在以镜像层 ID 命名的子文件夹中。


layers 文件夹:存储镜像层关系的元数据,在 diif 文件夹下的每个镜像层在这里都会有一个文件,文件的内容为该层镜像的父级镜像的 ID。


mnt 文件夹:联合挂载点目录,未生成容器时,该目录为空。


当一个镜像已经生成容器时,AUFS 存储结构会发生如下变化。


diff 文件夹:当容器运行时,会在 diff 目录下生成容器层。


layers 文件夹:增加容器层相关的元数据。


mnt 文件夹:容器的联合挂载点,这和容器中看到的文件内容一致。


以上便是 AUFS 的工作原理,那你知道容器的在工作过程中是如何使用 AUFS 的吗?

AUFS 是如何工作的?


AUFS 的工作过程中对文件的操作分为读取文件和修改文件。下面我们分别来看下 AUFS 对于不同的文件操作是如何工作的。


1. 读取文件

当我们在容器中读取文件时,可能会有以下场景。


文件在容器层中存在时:当文件存在于容器层时,直接从容器层读取。


当文件在容器层中不存在时:当容器运行时需要读取某个文件,如果容器层中不存在时,则从镜像层查找该文件,然后读取文件内容。


文件既存在于镜像层,又存在于容器层:当我们读取的文件既存在于镜像层,又存在于容器层时,将会从容器层读取该文件。


2. 修改文件或目录

AUFS 对文件的修改采用的是写时复制的工作机制,这种工作机制可以最大程度节省存储空间。


具体的文件操作机制如下。


第一次修改文件:当我们第一次在容器中修改某个文件时,AUFS 会触发写时复制操作,AUFS 首先从镜像层复制文件到容器层,然后再执行对应的修改操作。


AUFS 写时复制的操作将会复制整个文件,如果文件过大,将会大大降低文件系统的性能,因此当我们有大量文件需要被修改时,AUFS 可能会出现明显的延迟。好在,写时复制操作只在第一次修改文件时触发,对日常使用没有太大影响。


删除文件或目录:当文件或目录被删除时,AUFS 并不会真正从镜像中删除它,因为镜像层是只读的,AUFS 会创建一个特殊的文件或文件夹,这种特殊的文件或文件夹会阻止容器的访问。

aufs实战


生产环境不推荐在 CentOS 下使用 AUFS,如果你想在 CentOS 下安装 AUFS 用于研究和测试,可以参考这个链接

目录
相关文章
|
1月前
|
存储 缓存 Linux
docker的底层原理六: 联合文件系统(UnionFS)
本文介绍了Docker使用的联合文件系统(UnionFS),它通过分层存储和写时复制(CoW)机制,实现了容器的轻量级、高性能存储,支持了镜像继承、数据持久化和隔离性。
54 0
|
1月前
|
存储 Linux Docker
使用Docker存储驱动
【10月更文挑战第9天】
17 3
|
1月前
|
Java jenkins 持续交付
Centos7下docker的jenkins下载并配置jdk与maven
通过上述步骤,您将成功在CentOS 7上的Docker容器中部署了Jenkins,并配置好了JDK与Maven,为持续集成和自动化构建打下了坚实基础。
105 1
|
1月前
|
网络协议 Docker 容器
docker中的DNS配置
【10月更文挑战第5天】
294 1
|
1月前
|
安全 Linux 调度
docker的底层原理三: 内核共享
本文阐述了Docker容器通过共享宿主机的内核来实现轻量级运行,同时利用命名空间、控制组、文件系统和网络隔离等技术确保容器的安全性和资源控制。
66 6
|
1月前
|
存储 监控 Shell
docker的底层原理二:容器运行时环境
本文深入探讨了Docker容器运行时环境的关键技术,包括命名空间、控制组、联合文件系统、容器运行时以及分离的进程树,这些技术共同确保了容器的隔离性、资源控制和可移植性。
39 5
|
1月前
|
Linux 调度 数据安全/隐私保护
docker的底层原理五: 控制组
本文介绍了Docker中控制组(cgroups)的功能,包括CPU和内存控制、磁盘I/O和网络带宽限制、设备访问控制、审计和报告,以及层次化控制结构,确保容器资源使用的隔离性和限制性。
19 0
|
1月前
|
存储 Linux 数据中心
docker的底层原理四: 资源隔离
本文详细解释了Docker利用Linux内核的Namespace和Cgroups技术实现资源隔离,包括CPU、内存、网络、存储、文件系统、进程间通信、用户和用户组以及进程ID和主机名的隔离,确保容器的独立性和系统的安全性。
52 0
|
存储 运维 监控
阿里云的文件存储NAS使用心得
阿里云的文件存储NAS使用心得
373 0
|
存储 弹性计算 固态存储
阿里云服务器1TB存储收费标准(数据盘/对象存储OSS/文件存储NAS)
阿里云服务器1TB存储多少钱?系统盘最大可选到500GB,数据盘选到1TB价格为3655元一年。也可以选择对象存储OSS和文件存储NAS
6267 2
阿里云服务器1TB存储收费标准(数据盘/对象存储OSS/文件存储NAS)
下一篇
无影云桌面