Docker学习六:文件存储驱动——联合文件系统

一、联合文件系统简介

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

联合文件系统是 Docker 镜像和容器的基础,它让Docker 可以把镜像做成分层的结构,从而使得镜像的每一层可以被共享。

联合文件系统只是一个概念,真正实现联合文件系统才是关键,联合文件系统的实现方案有很多,Docker 中最常用的联合文件系统有三种:AUFS、Devicemapper 和 OverlayFS

二、AUFS 文件系统

1. 配置 Docker 的 AUFS 模式

AUFS 目前并未被合并到 Linux 内核主线,因此只有 Ubuntu 和 Debian 等少数操作系统支持 AUFS。

# 查看系统是否支持 AUFS
# $ grep aufs /proc/filesystems
nodev   aufs
# 如果输出结果包含aufs,则代表当前操作系统支持 AUFS

AUFS 推荐在 Ubuntu 或 Debian 操作系统下使用,如果想要在 CentOS 等操作系统下使用 AUFS,需要单独安装 AUFS 模块,安装完成后使用上述命令输出结果中有aufs即可。

当操作系统支持AUFS后,可以配置 Docker 的启动参数。

# /etc/docker 下新建 daemon.json 文件配置以下内容
{
  "storage-driver": "aufs"
}

# 重启 Docker
$ sudo systemctl restart docker

# 看配置是否生效
$ sudo docker info
Client:
 Debug Mode: false
Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 1
 Server Version: 19.03.12
 Storage Driver: aufs
  Root Dir: /var/lib/docker/aufs
  Backing Filesystem: extfs
  Dirs: 1
  Dirperm1 Supported: true
2. AUFS原理
1. 文件存储

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

Lark20201014-171313.png

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

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

  • diff 文件夹:存储镜像内容,每一层都存储在以镜像层 ID 命名的子文件夹中。
  • layers 文件夹:存储镜像层关系的元数据,在 diif 文件夹下的每个镜像层在这里都会有一个文件,文件的内容为该层镜像的父级镜像的 ID。
  • mnt 文件夹:联合挂载点目录,未生成容器时,该目录为空。

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

  • diff 文件夹:当容器运行时,会在 diff 目录下生成容器层。
  • layers 文件夹:增加容器层相关的元数据。
  • mnt 文件夹:容器的联合挂载点,这和容器中看到的文件内容一致。
2. 工作过程
a. 读取文件
  • 文件在容器层中存在时:当文件存在于容器层时,直接从容器层读取。
  • 当文件在容器层中不存在时:当容器运行时需要读取某个文件,如果容器层中不存在时,则从镜像层查找该文件,然后读取文件内容。
  • 文件既存在于镜像层,又存在于容器层:当我们读取的文件既存在于镜像层,又存在于容器层时,将会从容器层读取该文件。
b. 修改文件或目录

AUFS 对文件的修改采用的是写时复制的工作机制,具体操作如下:

  • 第一次修改文件:当我们第一次在容器中修改某个文件时,AUFS 会触发写时复制操作,AUFS 首先从镜像层复制文件到容器层,然后再执行对应的修改操作。AUFS 写时复制的操作将会复制整个文件,如果文件过大,将会大大降低文件系统的性能,因此当有大量文件需要被修改时,AUFS 可能会出现明显的延迟。但是,写时复制操作仅仅在第一次修改文件时触发,对日常使用没有太大影响。
  • 删除文件或目录:当文件或目录被删除时,AUFS 并不会真正从镜像中删除它,因为镜像层是只读的,AUFS 会创建一个特殊的文件或文件夹,这种特殊的文件或文件夹会阻止容器的访问。
3. 演示AUFS
a. 准备演示目录和文件
# 在 /tmp 目录下创建 aufs 目录
$ cd /tmp
/tmp$ mkdir aufs

# 准备挂载点目录
/tmp$ cd aufs
/tmp/aufs$ mkdir mnt

# 准备容器层内容
# 创建镜像层目录
/tmp/aufs$ mkdir container1
# 在镜像层目录下准备一个文件
/tmp/aufs$ echo Hello, Container layer! > container1/container1.txt

# 准备镜像层内容
# 创建两个镜像层目录
/tmp/aufs$ mkdir image1 && mkdir image2
# 分别写入数据
/tmp/aufs$ echo Hello, Image layer1! > image1/image1.txt
/tmp/aufs$ echo Hello, Image layer2! > image2/image2.txt

# 准备好的目录和文件结构如下
/tmp/aufs$ tree .
.
|-- container1
|   `-- container1.txt
|-- image1
|   `-- image1.txt
|-- image2
|   `-- image2.txt
`-- mnt
4 directories, 3 files
b. 创建 AUFS 联合文件系统
# 使用 mount 命令创建 AUFS 类型的文件系统
/tmp/aufs$ sudo mount -t aufs -o dirs=./container1:./image2:./image1  none ./mnt
# dirs 参数第一个冒号默认为读写权限,后面的目录均为只读权限,与 Docker 容器使用 AUFS 的模式
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值