Docker 的联合文件系统

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 的联合文件系统相关的知识,希望对你有一定的参考价值。

参考技术A Devicemapper 是 Linux 内核提供的框架,从 Linux 内核 2.6.9 版本开始引入,Devicemapper 与 AUFS 不同,AUFS 是一种文件系统,而Devicemapper 是一种映射块设备的技术框架。

Devicemapper 提供了一种将物理块设备映射到虚拟块设备的机制,目前 Linux 下比较流行的 LVM (Logical Volume Manager 是 Linux 下对磁盘分区进行管理的一种机制)和软件磁盘阵列(将多个较小的磁盘整合成为一个较大的磁盘设备用于扩大磁盘存储和提供数据可用性)都是基于 Devicemapper 机制实现的。

Devicemapper是如何数据存储的?
当 Docker 使用 Devicemapper 作为文件存储驱动时,Docker 将镜像和容器的文件存储在瘦供给池(thinpool)中,并将这些内容挂载在 /var/lib/docker/devicemapper/` 目录下。
这些目录储存 Docker 的容器和镜像相关数据,目录的数据内容和功能说明如下:

Docker 的 Devicemapper 模式有两种:第一种是 loop-lvm 模式,该模式主要用来开发和测试使用;第二种是 direct-lvm 模式,该模式推荐在生产环境中使用。
默认使用 loop-lvm 模式。

1.使用以下命令停止已经运行的 Docker:

2.编辑 /etc/docker/daemon.json 文件,如果该文件不存在,则创建该文件,并添加以下配置:

其中 directlvm_device 指定需要用作 Docker 存储的磁盘路径,Docker 会动态为我们创建对应的存储池。例如这里我想把 /dev/xdf 设备作为我的 Docker 存储盘,directlvm_device 则配置为 /dev/xdf。
3.启动 Docker:

4.验证 Docker 的文件驱动模式:
使用 docker info 查看,当看到 Storage Driver 为 devicemapper,并且 Pool Name 为 docker-thinpool 时,这表示 Devicemapper 的 direct-lvm 模式已经配置成功。

overlay2 是目前Docker 官方推荐的文件系统,也是目前安装 Docker 时默认的文件系统。

overlay2 和 AUFS 类似,它将所有目录称之为层(layer),overlay2 的目录是镜像和容器分层的基础,而把这些层统一展现到同一的目录下的过程称为联合挂载(union mount)。overlay2 把目录的下一层叫作lowerdir,上一层叫作upperdir,联合挂载后的结果叫作merged。

l目录包含缩短的层标识符作为符号链接。这些标识符用于避免达到mount命令参数的长度限制。

镜像层的 link 文件内容为该镜像层的短 ID,diff 文件夹为该镜像层的改动内容,lower 文件为该层的所有父层镜像的短 ID。diff 目录为容器的读写层,容器内修改的文件都会在 diff 中出现,merged 目录为分层文件联合挂载后的结果,也是容器内的工作目录。

通过 docker image inspect 命令来查看某个镜像的层级关系

使用 docker inspect 命令来查看容器的工作目录:

overlay2 的工作过程中对文件的操作分为读取文件和修改文件。
容器内进程读取文件分为以下三种情况。

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

如何清理docker呢?由于版本较古老,没有 prune 命令。使用以下脚本来清理:

以上是关于Docker 的联合文件系统的主要内容,如果未能解决你的问题,请参考以下文章

Docker02:Docker核心技术探索 分层联合文件系统

Docker 联合文件系统

Docker 的联合文件系统

Docker 文件系统-AUFS 原理解析(31)

docker命名空间控制组及联合文件系统概念

Docker入门之联合文件系统