Overlay2 是 Linux 的联合文件系统(UnionFS)实现之一,支持将多个目录(称为“层”)叠加为一个逻辑文件系统。其原理基于将只读层(镜像)和读写层(容器)组合起来,形成统一的文件视图。
Lowerdir
和 Upperdir
合并为统一视图。Upperdir
读取。如果文件不在 Upperdir
,则读取 Lowerdir
中的数据。Upperdir
,然后修改副本(Copy-on-Write)。Upperdir
中创建一个白条文件(Whiteout File),隐藏 Lowerdir
中的对应文件。Device Mapper 是 Linux 提供的一种块设备抽象层,通过逻辑卷管理(LVM)和快照功能,虚拟化存储设备。Docker 使用 Device Mapper 提供的“块存储”功能为容器实现数据存储和快照管理。
dm-thin
模块管理这些稀疏文件。特性 | Overlay2 | Device Mapper |
---|---|---|
类型 | 文件系统级驱动 | 块设备级驱动 |
性能 | 适合 I/O 密集型场景 | I/O 性能相对较差 |
复杂性 | 简单,易于配置 | 配置复杂,需要 LVM 支持 |
资源利用率 | 高效的镜像层共享 | 占用更多存储资源 |
适用场景 | 现代 Linux 系统,默认首选驱动 | 高数据隔离需求的企业级应用 |
支持的内核版本 | Linux 4.0 及以上 | 较低内核版本也支持 |
总结:
假设我们使用一个基于 Ubuntu
镜像的容器,并在其中创建一个新的文件 /app/data.txt
,然后修改该文件。
Ubuntu
镜像包含多个只读层,分别表示操作系统的基础文件,例如:
这些层是只读的,容器启动时不会直接修改它们。/bin/bash
,/lib/libc.so
/etc/hosts
,/etc/resolv.conf
/app/data.txt
时,该文件会直接存储在 Upperdir(可写层)。/etc/hosts
文件,系统会将原始文件从只读层复制到可写层(Copy-on-Write),然后对副本进行修改。/etc/hosts
文件时,优先查看 Upperdir 是否有副本。如果没有,才从只读层中读取原始文件。同样以 Ubuntu
镜像为基础启动容器,并创建和修改文件 /app/data.txt
。
/dev/sda
)上创建一个存储池(Pool),包括:Ubuntu
镜像存储为一个只读的稀疏逻辑卷(thin provisioned logical volume)。/app/data.txt
时,该文件的数据块直接写入到容器的逻辑卷中。/etc/hosts
文件时,只会复制相关的数据块到容器逻辑卷,然后对这些块进行修改。特点 | Overlay2 示例 | Device Mapper 示例 |
---|---|---|
镜像管理 | 使用文件系统层表示镜像数据,文件系统级共享 | 使用稀疏逻辑卷表示镜像,块级共享 |
写时复制 | 修改文件时复制到容器层 | 修改数据块时复制到容器逻辑卷 |
性能 | 适合大量文件读写场景 | 适合需要块存储隔离的场景 |
空间利用 | 镜像层共享效率高 | 占用较多块存储空间 |