docker容器的三大核心技术UnionFS(下)

  1. OverlayFS 与 Overlay2

OverlayFS 是 Linux 内核 3.18 引入的内核级联合文件系统,直接基于内核实现,性能优于 AUFS;Overlay2 是 OverlayFS 的改进版,支持最多 128 个只读层,解决了 OverlayFS 分层数量限制的问题,成为 Docker 默认存储驱动。

(1)核心原理与分层结构

核心组件:

lowerdir:多个只读层的集合(对应 Docker 镜像层),优先级从左到右递减。

upperdir:可写层(对应 Docker 容器的可写层,存储容器运行时的修改)。

workdir:临时工作目录(用于 OverlayFS 内部操作,如文件重命名、复制,必须为空且独占)。

merged:统一挂载点(容器内看到的根文件系统视图)。

与 AUFS 的关键差异:

OverlayFS 原生支持 "1 个可写层 + N 个只读层",Overlay2 通过嵌套叠加支持更多只读层(最多 128 层)。

依赖内核实现,无需用户态适配,IO 性能更高。

(2)实操示例:OverlayFS 挂载与验证

创建测试目录结构:

bash

mkdir overlay-test && cd overlay-test

mkdir layer1 layer2 upperlayer workdir mountedfs # workdir 为临时工作目录

echo "content for file1 in layer1" > layer1/file1

echo "content for file1 in layer2" > layer2/file1

echo "content for file2 in layer1" > layer1/file2

echo "content for file3 in layer2" > layer2/file3

挂载 OverlayFS 文件系统:

bash

mount -t overlay -o lowerdir=layer1:layer2,upperdir=upperlayer,workdir=workdir overlay mountedfs

参数说明:-o 指定 lowerdir/upperdir/workdir 路径;overlay 为文件系统类型

验证核心特性:

读取 mountedfs/file1,返回 layer1 中的内容(左侧优先级更高)。

在 mountedfs 中修改 file1,实际修改的是 upperlayer/file1,layer1/file1 保持不变(写时复制)。

查看 workdir,会生成临时文件(用于 OverlayFS 内部处理,用户无需手动操作)。

(3)Docker 中 Overlay2 的实际应用

以 Alpine 镜像创建容器为例,验证 Overlay2 在 Docker 中的存储结构:

启动容器:

bash

docker run --name conoverlay --rm -id alpine ash # 启动 Alpine 容器,容器 ID 假设为 6f8973ac28d6

查看 Overlay2 挂载信息:

bash

查看容器对应的 Overlay2 挂载点

mount | grep overlay

输出示例(关键路径解析):

overlay on /var/lib/docker/overlay2/<mount-id>/merged type overlay(...)

- <mount-id>:随机 ID,对应容器的 Overlay2 存储目录

- merged:容器根文件系统的挂载点(统一视图)

- lowerdir:镜像只读层路径;upperdir:容器可写层路径;workdir:临时工作目录

定位容器存储目录:

Docker 为每个容器在 /var/lib/docker/image/overlay2/layerdb/mounts/ 下创建以容器 ID 命名的目录,内含 mount-id 文件(记录 <mount-id>)。

通过 <mount-id> 可找到 /var/lib/docker/overlay2/<mount-id>/ 目录,包含 merged(挂载点)、diff(即 upperdir,可写层)、work(即 workdir)。

三、UnionFS 在 Docker 镜像与容器中的核心应用

  1. 镜像分层构建

Docker 镜像通过 Dockerfile 构建,每一条 Dockerfile 命令(如 FROM、COPY、RUN)都会生成一个只读镜像层,这些层通过 UnionFS 叠加形成完整的镜像文件系统。例如:

dockerfile

FROM python:3.12-slim # 基础镜像层(只读)

WORKDIR /app # 生成新的只读层

COPY requirements.txt . # 生成新的只读层

RUN pip install -r requirements.txt # 生成新的只读层

COPY . . # 生成新的只读层

优势:不同镜像可共享基础层(如多个 Python 应用共享 python:3.12-slim 基础层),减少磁盘占用;修改镜像时仅需重新构建变更层,提升构建效率。

  1. 容器运行时数据管理

容器启动时,Docker 基于镜像的只读层,通过 UnionFS 创建一个可写层(如 Overlay2 的 upperdir):

容器内的文件修改、创建、删除操作,均作用于可写层,底层镜像层保持不变。

容器删除时,仅需删除可写层,镜像层可重复用于其他容器,实现 "一次构建,多次运行"。

四、UnionFS 关键技术总结

特性 AUFS Overlay2(推荐)

内核依赖 用户态实现,需额外内核补丁 内核原生支持(Linux 4.0+)

分层数量限制 无明确限制,但层越多性能越差 支持最多 128 个只读层

性能 中等(用户态 IO 转发) 优秀(内核级 IO 处理)

写时复制(CoW) 支持 支持

删除屏蔽(Whiteout) 基于 .wh.* 文件 基于 .wh.* 文件

Docker 默认支持 早期支持,需手动开启 默认存储驱动(Docker 18.09+)

UnionFS 作为 Docker 存储的底层核心,通过分层叠加和写时复制机制,平衡了镜像的复用性、容器的灵活性和资源的高效性,是 Docker 实现 "轻量级虚拟化" 的关键技术之一。

相关推荐
qqxiaoxingxing6 小时前
HR重复性工作自动化落地指南:先梳理任务边界,再选工具
运维·自动化
王琦03187 小时前
持续集成持续交付企业示例
运维·ci/cd
Lsetea8 小时前
SSL证书指纹相同但文件哈希不同:PEM、DER与公钥摘要怎么比
运维·https·ssl证书·openssl·证书链
wtblszn8 小时前
废气处理余热回收设备远程运维系统方案
运维
乔旭伟8 小时前
Linux 服务器备份实战:一致性快照、日志归档与恢复演练
linux·运维·服务器
cpolar技术支持8 小时前
把配置发出去怕带出密钥?先把含凭据配置转成脱敏只读快照,用 cpolar 给同事核对差异
运维·python·内网穿透·cpolar·配置脱敏
我不会起名字3228 小时前
Redis 突然只能读不能写:MISCONF 报错的 3 类触发条件与 4 步恢复
运维·redis·持久化·排查·misconf
workflower9 小时前
Agentic AI 时代的企业ICT 基础设施运维
运维·人工智能·机器学习·重构·云计算·汽车
szxinmai主板定制专家9 小时前
ZYNQ 数据采集方案踩坑总结:电力强电磁干扰、工业现场多协议适配优化
运维·人工智能·fpga开发·机器人·zynq
猫咪很可爱9 小时前
Oracle RAC 启动失败排查:私网通信与内核参数优化实战
运维·数据库·oracle