51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

linux overlay 详解

linux overlay 详解

OverlayFS是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等),并不直接参与磁盘空间结构的划分,仅仅将原来系统文件中的文件或者目录进行"合并一起",

最后向用户展示"合并"的文件是在同一级的目录, 这就是联合挂载技术, 相对于AUFS (<1.12 早期使用的存储技术), OverlayFS速度更快,实现更简单。

Linux内核为Docker提供的OverlayFS驱动有两种:Overlay和Overlay2

Overlay2是相对于Overlay的一种改进,在Inode利用率方面比Overlay更有效。

但是Overlay有环境需求:

	(1)Docker版本17.06.02+;
	(2)宿主机文件系统需要是EXT4或XFS格式;

OverlayFS实现方式:

OverlayFS通过三个目录:lower目录、upper目录、以及work目录实现。

	lower:
    		一般对应的是只读数据。
    	upper:
    		可以进行读写操作的目录。
    	work:
    		目录为工作基础目录,挂载后会自动创建一个work子目录(实际测试手动卸载后该目录并不会被删除)
    		该目录主要是存储一些临时存放的结果或中间数据的工作目录。

值得注意的是,在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为merged目录。

docker container inspect `docker container ps -lq`

OverlayFS结构分为三个层: LowerDir、Upperdir、MergedDir

LowerDir (只读)

只读的image layer,其实就是rootfs。
在使用Dockfile构建镜像的时候, Image Layer可以分很多层,所以对应的lowerdir会很多(源镜像)。
Lower 包括两个层:
(1)系统的init
1)容器在启动以后, 默认情况下lower层是不能够修改内容的, 但是用户有需求需要修改主机名与域名地址, 那么就需要添加init层中的文件(hostname, resolv.conf,hosts,mtab等文件), 用于解决此类问题;
2)修改的内容只对当前的容器生效, 而在docker commit提交为镜像时候,并不会将init层提交。
3)init文件存放的目录为/var/lib/docker/overlay2/<init_id>/diff
(2)容器的镜像层
不可修改的数据。

Upperdir (读写)

upperdir则是在lowerdir之上的一层, 为读写层。容器在启动的时候会创建, 所有对容器的修改, 都是在这层。比如容器启动写入的日志文件,或者是应用程序写入的临时文件。

MergedDir (展示)

merged目录是容器的挂载点,在用户视角能够看到的所有文件,都是从这层展示的。

参考案例

(1)创建工作目录
mkdir -pv /baimei2023/lower{0..2} /baimei2023/{uppper,work,merged}
(2)挂载文件系统
mount -t overlay overlay -o lowerdir=/baimei2023/lower0:/baimei2023/lower1:/baimei2023/lower2,upperdir=/baimei2023/uppper,workdir=/baimei2023/work /baimei2023/merged/
(3)查看挂载信息
mount | grep merged
(4)尝试在lower层写入准备初始数据
ll /baimei2023/ -R
cp /etc/hosts /baimei2023/lower0/
cp /etc/issue /baimei2023/lower1/
cp /etc/resolv.conf /baimei2023/lower2/
ll /baimei2023/ -R
(5)尝试在upper层写入准备初始数据
cp /etc/hostname /baimei2023/uppper/
ll /baimei2023/ -R
(6)尝试在merged目录写入数据,观察数据实际写入的应该是upper层
cp /etc/fstab /baimei2023/merged/
ll /baimei2023/ -R
(7)重新挂载,但不挂载upperdir层
umount /baimei2023/merged
mount -t overlay overlay -o lowerdir=/baimei2023/lower0:/baimei2023/lower1:/baimei2023/lower2,workdir=/baimei2023/work /baimei2023/merged/
(8)再次尝试写入数据失败,因为没有写层。
cp /etc/os-release /baimei2023/merged/
docker 依赖的linux内核技术chroot cgroup namespace overlay : 连接

赞(1)
未经允许不得转载:工具盒子 » linux overlay 详解