容器文件系统OverlayFS

我们知道,容器运行需要镜像,镜像就是容器中程序运行需要的二进制文件、库文件、配置文件和其他依赖项全部打包成的一个大的文件包。

那么,如果没有针对容器的文件系统,每运行一个容器,就需要一个单独的镜像。假设镜像大小为500MB(实际的容器镜像大小从几MB到几十GB不等),那么运行100个容器的话,就需要500MBx100=50GB的镜像文件空间。而当这些容器的基础镜像相同的时候,50GB空间中,绝大部分的底层依赖数据是冗余的,剩余不同的内容则是每个容器自己的应用程序。

那可不可以只存储一份基础镜像,而所有基于该镜像的容器都可以共享这份通用的数据,不同容器启动的时候,只需要下载自己独特的程序部分即可?

答案是可以的。UnionFS就是这样一类针对容器的文件系统。UnionFS的主要功能是把多个目录一起挂载在同一个目录下。例如,可以把ubuntu18.04这个基础镜像放在目录ubuntu18.04/下,容器自己的应用程序app_1_bin放在app_1/目录下,把这两个目录挂载到container_1/这个目录下,作为容器1的文件系统;同样的,把app_2的目录ubuntu18.04/和app_2/挂载到container_2目录下,作为容器2的文件系统。

 OverlayFS是UnionFS的一种实现,是目前各个主流Linux发型版本里缺省使用的容器文件系统。我们在容器环境里执行df命令,看到的文件系统类型是“overlay”,这跟在宿主机上执行结果是不一样的,小伙伴有兴趣可以试试。

 复现网上一个常见示例:

mkdir upper_dir lower_dir merged_dir work_dir

echo "I'm from lower dir!" > lower_dir/in_lower.txt

echo "I'm from upper dir!" > upper_dir/in_upper.txt

echo "I'm from lower dir!" > lower_dir/in_both.txt

echo "I'm from upper dir!" > upper_dir/in_both.txt
sudo mount -t overlay overlay -o lowerdir=./lower_dir,upperdir=./upper_dir,workdir=./work_dir ./merged_dir

执行完挂载命令后,我们进入到merged_dir中,看到如下内容:

merged_dir是我们的挂载点,也就是用户看到的目录,用户对文件的操作是在这里进行的。在这个目录下,我们可以看到lower_dir、upper_dir中的内容,in_both.txt同时处于lower_dir和upper_dir中,但这里只显示了upper_dir中的in_both.txt,也就是说,在挂载目录里,upper层的文件会覆盖lower层的同名文件。

在OverlayFS中,如果有文件的创建、修改、删除等操作,都是在上层目录upperdir中进行。

lower_dir中的文件是只读的,在实际的容器文件系统中,OverlayFS是支持多个lowerdir的,这也就是我们经常在执行docker load命令加载镜像的时候,会出现很多分层的原因。挂载多个lowerdir的命令大致如下:

mount -t overlay overlay
      -o lowerdir:/dir1:/dir2:/dir3:...:/dir25,upperdir=...

在我们之前的操作中,还有一个work_dir目录,它只是一个存放临时文件的目录,OverlayFS中如果有文件修改,就会在中间过程中存放临时文件在workdir目录下。

我们在merged_dir中修改文件,包括新建文件、删除文件、修改原有文件,会是什么样子呢?

新建文件:通过命令行新建一个文件new_file.txt,成功后,我们可以看到,这个文件出现在upper_dir中,而lower_dir没变化。

删除文件:删除in_both.txt,lower_dir中的内容不变,在upper_dir中,该文件状态发生了变化,如下图所示,表示该文件不能再出现在挂载点了。

修改文件:修改merged_dir中看到的位于lower_dir中的文件in_lower.txt,完成后发现在lower_dir中的文件没发生变化,而在upper_dir中新建了一个同名文件,在这个文件中保存了我们修改后的文件内容。

从以上内容,我们就对OverlayFS的工作方式有了一个基本的了解,那么对于Docker容器的镜像挂载方式也就大致明了了。容器镜像分成多个layer,每层对应OverlayFS里lowerdir的一个目录,lowerdir支持多个目录,也就是可以支持多层的镜像文件。容器启动后,对镜像文件的修改保存在upperdir中。

参考:

李程远《容器实战高手课》

容器如何工作:OverlayFS

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值