Union FS
- 将不同目录挂载到同一个虚拟文件系统下的文件系统
- 支持为每个成员目录设置readonly,readwrite和writeoutable权限
- 两种用途
- 将多个disk挂载到同一个目录下
- 将readonly层和writable层联合在一起
容器镜像
分层的好处是通用层只用存储一份,节省空间和传输
docker文件系统组成
bootfs(boot file system) 包含两部分
- bootloader—引导加载内核
- kernel—当kernel被加载到内存后,卸载tbootfs
rootfs
- /proc/,/sys, /bin, /etc等标准目录和文件
- 不同的操作系统bootfs基本一致,rootfs会有差异
linux启动
启动后,会先将rootfs设置为readonly,进行一系列检查,然后设置为readwrite权限,供用户使用
docker启动
- 以readonly方式加载rootfs,进行一系列检查,然后利用
union mount
,将readwrite文件系统挂载到rootfs之上 - 允许再次将下层FS的设置为readonly,并向上再次叠加
- readonly和writable组成了容器的运行时态,每一层被称作FS层
写操作
容器可写层依赖存储驱动器提供的写时复制和用时分配,以此来支持对容器可写层的修改。
写时复制
即 Copy-On-Write,一个镜像可以被多个容器使用,但不需要拷贝多份。在需要对镜像提供的文件进行操作时,该文件会被从镜像层复制到可写层进行修改,镜像里面的文件不会改变。
用时分配
按需分配磁盘空间,不会提前分配,当一个为文件系统被创建后,才会分配空间
容器存储驱动器
OverlayFS
overlay只有两层,upper层代表镜像,lower层代表容器可写层
挂载overlayfs方法
挂载一个overlay文件系统,可以通过mount -t overlay -o <options> overlay <mount point>
来实现。
options有如下:
- lowerdir=
:指定用户需要挂载的lower层目录,lower层支持多个目录,用“:”间隔,优先级依次降低。最多支持500层。 - upperdir=
:指定用户需要挂载的upper层目录,upper层优先级高于所有的lower层目录。 - workdir=
:指定文件系统挂载后用于存放临时和间接文件的工作基础目录。 - default_permissions:
- redirect_dir=on/off:开启或关闭redirect directory特性,开启后可支持merged目录和纯lower层目录的rename/renameat系统调用。
- index=on/off:开启或关闭index特性,开启后可避免hardlink copyup broken问题。
在使用如上mount进行OverlayFS合并之后,遵循如下规则:
- lowerdir和upperdir两个目录存在同名文件时,lowerdir的文件将会被隐藏,用户只能看到upperdir的文件。
- lowerdir低优先级的同目录同名文件将会被隐藏。
- 如果存在同名目录,那么lowerdir和upperdir目录中的内容将会合并。
- 当用户修改mergedir中来自upperdir的数据时,数据将直接写入upperdir中原来目录中,删除文件也同理。
- 当用户修改mergedir中来自lowerdir的数据时,lowerdir中内容均不会发生任何改变。因为lowerdir是只读的,用户想修改来自lowerdir数据时,overlayfs会首先拷贝一份lowerdir中文件副本到upperdir中。后续修改或删除将会在upperdir下的副本中进行,lowerdir中原文件将会被隐藏。
- 如果某一个目录单纯来自lowerdir或者lowerdir和upperdir合并,默认无法进行rename系统调用。但是可以通过mv重命名。如果要支持rename,需要CONFIG_OVERLAY_FS_REDIRECT_DIR。
测试
root@aliyun:~/tmp# echo "in lower" > lower/lower.txt
root@aliyun:~/tmp# echo "in upper" > upper/upper.txt
root@aliyun:~/tmp# echo "in upper" > upper/both.txt
root@aliyun:~/tmp# echo "in lower" > lower/both.txt
root@aliyun:~/tmp# tree
.
├── lower
│ ├── both.txt
│ └── lower.txt
├── merged
├── upper
│ ├── both.txt
│ └── upper.txt
└── work
挂载为只读方式
root@aliyun:~/tmp# mount -t overlay -o lowerdir=upper:lower overlay merged
root@aliyun:~/tmp# tree
.
├── lower
│ ├── both.txt
│ └── lower.txt
├── merged
│ ├── both.txt
│ ├── lower.txt
│ └── upper.txt
├── upper
│ ├── both.txt
│ └── upper.txt
└── work
4 directories, 7 files
root@aliyun:~/tmp# cat merged/both.txt
in upper
root@aliyun:~/tmp# echo a > merged/both.txt
-bash: merged/both.txt: Read-only file system
挂载为可写
root@aliyun:~/tmp# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay merged
root@aliyun:~/tmp# tree
.
├── lower
│ ├── both.txt
│ └── lower.txt
├── merged
│ ├── both.txt
│ ├── lower.txt
│ └── upper.txt
├── upper
│ ├── both.txt
│ └── upper.txt
└── work
└── work
5 directories, 7 files
root@aliyun:~/tmp# echo new > merged/both.txt
root@aliyun:~/tmp# cat merged/both.txt
new
OCI容器标准
Open Container Initiative
- OCI组织创建于2015年,致力于定义容器镜像标准运行时标准的开放组织
- 镜像标准 Image Speciafication,定义镜像该如何打包
- 运行时标准 Runtime Specification,定义镜像如何解压并运行
- 分发标准 Distribution Specification,定义镜像如何分发
docker引擎架构
- k8s 可以直接对接containerd
- 引入shim,容器运行后shim将其交由systemd管理,这样,containerd就可以重启或者升级