Docker 存储驱动之 overlay

发布时间: 更新时间: 总字数:1255 阅读时间:3m 作者: IP上海 分享 网址

OverlayFS是一个类似于AUFS 的现代联合文件系统,但更快,实现更简单。Docker 为OverlayFS提供了一个存储驱动程序。OverlayFS是内核提供的文件系统,overlayoverlay2docker提供的存储驱动

overlay 原理

OverlayFS 将单个 Linux 主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载。OverlayFS 关联的底层目录称为 lowerdir, 对应的高层目录称为 upperdir。合并过后统一视图称为 merged。

下图是一个 docker 镜像和 docke 容器的分层图,docker 镜像是 lowdir,docker 容器是 upperdir。而统一的视图层是 merged 层

OverlayFS arch

overlay 和 overlay2 性能对比

使用 overlay 和 overlay2 驱动性能好于 aufs 和 devicemapper,在实际生产环境 overlay2 的性能高于 btrfs

  • 页缓存:overlayfs 支持页缓存共享,也就是说如果多个容器访问同一个文件,可以共享同一个页缓存。这使得 overlay/overlay2 驱动高效地利用了内存
  • copy_up:aufs 和 overlayfs,由于第一次写入都会导致 copy_up,尤其是大文件,会导致写延迟,以后的写入不会有问题。由于 overlayfs 层级 比 aufs 的多,所以 ovelayfs 的拷贝高于 aufs
  • inode 限制:使用 overlay 存储驱动可能导致 inode 过度消耗,特别是当容器和镜像很多的情况下,所以建议使用 overlay2.

高性能建议

  • 使用高性能磁盘如:SSD
  • 如果是搞 IO:建议使用外挂高性能盘

但 overlay2 驱动程序本身最多支持 128 个较低的 OverlayFS 层。此功能可为与层相关的 Docker 命令(如 docker buildand)提供更好的性能 docker commit,并在后备文件系统上占用更少的 inode。

Docker OverlayFS 挂载

Docker 镜像通常使用 OverlayFS(分层文件系统)

  • LowerDir: 只读的镜像层
  • UpperDir: 容器的可写层
  • Merged: 容器看到的统一视图

OverlayFS 同时挂载多个存储层

OverlayFS 是一种联合文件系统,它允许您将多个目录(层)堆叠在一起,形成一个统一的视图。通常,OverlayFS 至少包含一个下层(lowerdir)和一个上层(upperdir)。下层是只读的,而上层是可写的,所有对联合文件系统的修改都会写入上层。

注意:

  • 多个只读下层(lowerdir):这是 OverlayFS 的一个常见且强大的功能,可以通过冒号分隔的方式指定多个只读下层
    • OverlayFS 会按照您指定的顺序从左到右查找文件。如果同一个文件存在于多个下层中,那么最左边(最先指定)的下层中的文件会遮盖掉右边(后面指定)下层中的同名文件。
  • 可写上层(upperdir):只允许一个可写的上层来处理所有修改
    • OverlayFS 不支持同时指定多个可写的 upperdir,如果您尝试这样做,将会遇到错误

以下是挂载多个只读下层的示例:

# 1. 创建目录结构
mkdir overlay_root && cd overlay_root
mkdir lower1 lower2 lower3 upper work mount_point

# 2. 在不同的下层创建示例文件
echo "This is from lower1" > lower1/fileA.txt
echo "This is from lower1" > lower1/common_file.txt

echo "This is from lower2" > lower2/fileB.txt
echo "This is from lower2" > lower2/common_file.txt # 会被lower1的同名文件覆盖

echo "This is from lower3" > lower3/fileC.txt

# 3. 挂载 OverlayFS
# lowerdir: 指定多个下层,用冒号分隔(注意:在mount命令中是冒号,不是逗号)
#           文件查找顺序是 lower1 -> lower2 -> lower3
sudo mount -t overlay overlay -olowerdir=lower1:lower2:lower3,upperdir=upper,workdir=work mount_point

# 4. 验证文件
$ mount -l | grep mount_point
overlay on /root/overlay_root/mount_point type overlay (rw,relatime,lowerdir=lower1:lower2:lower3,upperdir=upper,workdir=work)

$ ls mount_point
common_file.txt  fileA.txt  fileB.txt  fileC.txt
cat mount_point/fileA.txt      # From lower1
cat mount_point/fileB.txt      # From lower2
cat mount_point/fileC.txt      # From lower3
cat mount_point/common_file.txt # From lower1 (因为lower1在lower2前面)

# 5. 卸载
sudo umount mount_point

docker 设置存储方式

/etc/docker/daemon.json

{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
本文总阅读量 次 本站总访问量 次 本站总访客数
Home Archives Categories Tags Statistics