Docker 存储驱动(Storage Driver)差异对比

Docker 存储驱动(Storage Driver)差异对比
踱鸽&水晶蟹Docker 存储驱动(Storage Driver)差异对比
把一台旧服务器上的 Docker 服务迁到新机器时,发现两台机器的 docker info 输出不一样——旧机器是 devicemapper,新机器是 overlay2。当时觉得「反正都能跑」就没管,直到旧机器上某个容器内大量小文件写入变得极慢,才认真研究了这个话题。
一、为什么要关心 Storage Driver
Storage Driver 决定了 Docker 镜像层和容器可写层的存储与管理方式。选错了:
- 性能问题:大量小文件写入场景,不同 Driver 的吞吐差距可以达到 3-5 倍
- 稳定性问题:旧版 devicemapper 的
loop-lvm模式在生产环境经常出现 IO 等待飙高 - 兼容性问题:旧内核不支持 overlay2,迁移到新机器后行为不一致
大多数时候,现代系统装好 Docker 默认就是 overlay2,不需要手动干预。但遇到旧机器或高 IO 场景,值得花 5 分钟确认一下。
二、三种主流 Driver 原理简述
overlay2
基于 Linux 内核的 OverlayFS,采用联合挂载(Union Mount):
- 镜像的每一层都是只读的 lower 层,容器启动时在最上面加一个可写的 upper 层
- 读文件:从 upper 层开始向下查找,找到即返回
- 写文件:将需要修改的文件从 lower 层复制到 upper 层(Copy-on-Write),再原地修改
特点:操作在文件系统层完成,无需额外内核模块,内核 4.0+ 原生支持,是目前最推荐的选项。
devicemapper
工作在块设备级别,不是文件系统层:
- 使用 Linux 的 Device Mapper 框架,每个容器对应一个独立的虚拟块设备
- loop-lvm 模式:用文件模拟块设备,配置简单但性能差,磁盘有固定上限
- direct-lvm 模式:直接使用裸盘分区,性能可接受,但需要预先分配专用磁盘
特点:旧 CentOS 7(内核 3.x 不支持 overlay2)的默认选项。loop-lvm 绝对不上生产,docker info 里会有明显的 WARNING。
aufs
最早期的联合文件系统,Docker 最初在 Ubuntu 上的默认驱动:
- 实现方式与 overlay2 类似,也是分层联合挂载
- 没有合并进 Linux 主线内核,依赖发行版自行打补丁
- 社区维护已基本停止
特点:老 Ubuntu 系统的历史遗留,新系统已被 overlay2 完全替代,遇到了直接换。
三、实测对比
测试环境:CentOS 7.9,内核从 3.10 升级到 5.4 后对比 overlay2 与 devicemapper,机械硬盘。
| 测试场景 | overlay2 | devicemapper (loop-lvm) | devicemapper (direct-lvm) |
|---|---|---|---|
| 镜像层构建(复制 1000 个文件) | 约 2.1s | 约 6.8s | 约 3.2s |
| 容器启动耗时 | 约 0.3s | 约 1.2s | 约 0.5s |
| 容器内写入 10 万个小文件 | 约 18s | 约 65s | 约 28s |
| 磁盘空间利用率 | 镜像层共享,最省 | loop 文件固定大小,浪费较多 | 较好 |
以上为参考值,SSD 环境下各方案差距会缩小,但相对排序不变。
最明显的感受:loop-lvm 模式下 docker build 中有大量文件复制的步骤会卡很久;切换到 overlay2 后几乎感觉不到。
四、如何查看和切换当前 Driver
|
切换前必须注意:切换 Driver 后,旧的镜像和容器数据不会自动迁移,需要提前清理:
|
五、生产环境选型建议
结论直接给:
- 优先选 overlay2:内核 4.0+ 的系统(CentOS 8+、Ubuntu 18.04+)默认已是这个,无需修改
- CentOS 7(内核 3.10):先升级内核到 5.x,再切换 overlay2;升不了的场景用 devicemapper direct-lvm 模式
- aufs:遇到了直接换,社区已停止维护
- devicemapper loop-lvm:
docker info里出现WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use就必须处理,不能忽略
大多数情况下新装 Docker 在现代系统上会自动选 overlay2,不需要手动配置。这篇文章更多是帮你理解遇到问题时背后的原因,以及碰到旧机器时知道怎么排查。


