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,机械硬盘。

测试场景overlay2devicemapper (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
docker info | grep "Storage Driver"

# 修改 /etc/docker/daemon.json
{
"storage-driver": "overlay2"
}

# 重启 Docker
systemctl restart docker

切换前必须注意:切换 Driver 后,旧的镜像和容器数据不会自动迁移,需要提前清理:

# 停止并删除所有容器
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)

# 删除所有本地镜像(确保重要镜像已推到 Registry)
docker rmi $(docker images -q)

# 清空 Docker 存储目录(默认 /var/lib/docker)
rm -rf /var/lib/docker/*

# 修改 daemon.json 后重启
systemctl restart docker

五、生产环境选型建议

结论直接给:

  1. 优先选 overlay2:内核 4.0+ 的系统(CentOS 8+、Ubuntu 18.04+)默认已是这个,无需修改
  2. CentOS 7(内核 3.10):先升级内核到 5.x,再切换 overlay2;升不了的场景用 devicemapper direct-lvm 模式
  3. aufs:遇到了直接换,社区已停止维护
  4. devicemapper loop-lvmdocker info 里出现 WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use 就必须处理,不能忽略

大多数情况下新装 Docker 在现代系统上会自动选 overlay2,不需要手动配置。这篇文章更多是帮你理解遇到问题时背后的原因,以及碰到旧机器时知道怎么排查。