插件窝 干货文章 linux overlay在容器中的应用

linux overlay在容器中的应用

文件 Overlay 容器 OverlayFS 970    来源:    2025-05-14

Linux Overlay 文件系统在容器中的应用

Overlay 文件系统是 Linux 内核提供的一种联合文件系统(Union Filesystem),它在容器技术中扮演着至关重要的角色,特别是在 Docker 和 Kubernetes 等容器平台中。

OverlayFS 的基本原理

OverlayFS 通过将多个目录(层)合并成一个统一的视图来工作,主要包含以下概念:

  1. lowerdir:只读的基础层,可以有多个
  2. upperdir:可写的上层,用于存储修改
  3. merged:合并后的统一视图
  4. workdir:OverlayFS 内部使用的临时工作目录

在容器中的应用

1. 容器镜像的分层存储

容器镜像采用分层结构,每个 Dockerfile 指令都会创建一个新的层:

  • 基础镜像层:作为 lowerdir
  • 后续修改层:作为 upperdir
  • 运行时层:容器运行时创建的可写层

2. 容器启动时的文件系统

当容器启动时,OverlayFS 的工作方式:

overlay /var/lib/docker/overlay2/<id>/merged 
  overlay 
    lowerdir=/var/lib/docker/overlay2/l/<layer1>:...:/var/lib/docker/overlay2/l/<layerN>,
    upperdir=/var/lib/docker/overlay2/<id>/diff,
    workdir=/var/lib/docker/overlay2/<id>/work

3. 写时复制(Copy-on-Write)机制

  • 读取文件:从最上层开始查找,找不到则向下层查找
  • 修改文件:如果文件在 lowerdir,会先复制到 upperdir 再修改(写时复制)
  • 删除文件:在 upperdir 创建 whiteout 文件(.wh.)

OverlayFS 的优势

  1. 高效的存储利用:共享基础镜像层,减少存储占用
  2. 快速启动:不需要复制整个文件系统
  3. 节省内存:相同基础镜像的容器共享内存中的文件页缓存
  4. 分层管理:便于镜像构建和分发

实际配置示例

手动挂载 OverlayFS

# 创建必要的目录
mkdir -p /tmp/overlay/{lower,upper,work,merged}

# 挂载 OverlayFS
mount -t overlay overlay -o lowerdir=/tmp/overlay/lower,upperdir=/tmp/overlay/upper,workdir=/tmp/overlay/work /tmp/overlay/merged

Docker 中使用 OverlayFS

在 Docker 中,默认使用 overlay2 存储驱动:

# 查看当前存储驱动
docker info | grep "Storage Driver"

# 如果未使用 overlay2,可以配置 Docker 使用它
# 编辑 /etc/docker/daemon.json
{
  "storage-driver": "overlay2"
}

性能优化考虑

  1. 选择合适的存储驱动:对于大多数现代 Linux 发行版,overlay2 是最佳选择
  2. 文件系统选择:建议使用 xfs 或 ext4 作为底层文件系统
  3. inode 限制:确保有足够的 inode,特别是在大量小文件的场景
  4. 磁盘空间监控:upperdir 会随着容器运行而增长,需要监控

常见问题排查

  1. "no space left on device" 但磁盘空间充足

    • 可能是 inode 耗尽:df -i
  2. 性能问题

    • 检查是否使用了支持 d_type 的文件系统(overlay2 要求)
    • 使用 xfs_infotune2fs -l 检查文件系统特性
  3. 兼容性问题

    • 某些应用(如 MySQL)可能需要配置 --data-dir 到 volume
    • 避免在 overlay 文件系统上使用 mmap

OverlayFS 为容器技术提供了高效、灵活的文件系统解决方案,是现代容器基础设施的重要组成部分。