OverlayFS是一个类似于AUFS 的现代联合文件系统,但更快,实现更简单。Docker 为OverlayFS提供了一个存储驱动程序。OverlayFS是内核提供的文件系统,overlay和overlay2是docker提供的存储驱动
overlay 原理
OverlayFS 将单个 Linux 主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载。OverlayFS 关联的底层目录称为 lowerdir, 对应的高层目录称为 upperdir。合并过后统一视图称为 merged。
下图是一个 docker 镜像和 docke 容器的分层图,docker 镜像是 lowdir,docker 容器是 upperdir。而统一的视图层是 merged 层

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"
]
}