1、容器文件系统
每个容器都有对应的一个镜像,镜像是容器的静态形式,镜像包含容器运行所需要的各种二进制文件,库文件,配置文件等等,由这些文件打包共同组成容器的镜像。
在容器里面执行 df / 命令:
可以看到容器根目录的文件系统时overlay,而不是传统的ext4或者NFS之类的。那么这个overlay文件系统是什么呢?
容器为什么要使用这么个文件系统呢?
首先假设容器使用ext4文件系统会有什么问题呢?
每个容器都需要一个镜像,但是每个容器所依赖的操作系统库文件什么都是差不多的,如果每个容器都单独下载维护这些文件,磁盘资源和网络资源都会造成一定的浪费。
比如说,假设一个镜像文件的大小是500MB,那么100个容器的话,就需要下载500MB*100= 50GB的文件,并且占用50GB的磁盘空间。
特别是这样的情况:假如这100个容器镜像都是基于”ubuntu:18.04”的,每个容器镜像只是额外复制了50MB左右自己的应用程序到”ubuntu: 18.04”里,那么就是说在总共50GB的数据里,有90%的数据是冗余的。
因此为了解决这个问题,容器使用OverlayFS文件系统。
2、OverlayFS
OverlayFS是联合文件系统的一种实现,什么是联合文件系统呢?就是指可以将多个目录里的文件挂载在同一个目录上,这个特性正好可以解决容器镜像的问题。
这个OverlayFS有两层,分别是lowerdir和upperdir。lowerdir里是容器镜像中的文件,对于容器来说是只读的;upperdir存放的是容器对文件系统里的所有改动,它是可读写的。
比如,我们可以把ubuntu18.04这个基础镜像的文件放在一个目录ubuntu18.04/下,容器自己额外的程序文件app_1_bin放在app_1/目录下。
然后,我们把这两个目录挂载到container_1/这个目录下,作为容器1看到的文件系统;对于容器2,就可以把ubuntu18.04/和app_2/两个目录一起挂载到container_2的目录下。
但是假设某个镜像需要对库文件进行定制化配置呢?此时就会引入写复制技术,专门复制一份要修改的文件,然后任由对其进行更改,并不会影响原来的文件。