Union FS

  • 将不同目录挂载到同一个虚拟文件系统下的文件系统
  • 支持为每个成员目录设置readonly,readwrite和writeoutable权限
  • 两种用途
    • 将多个disk挂载到同一个目录下
    • 将readonly层和writable层联合在一起

容器镜像

分层的好处是通用层只用存储一份,节省空间和传输
image.png

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,一个镜像可以被多个容器使用,但不需要拷贝多份。在需要对镜像提供的文件进行操作时,该文件会被从镜像层复制到可写层进行修改,镜像里面的文件不会改变。

用时分配

按需分配磁盘空间,不会提前分配,当一个为文件系统被创建后,才会分配空间

容器存储驱动器

image.png
image.png

OverlayFS

overlay只有两层,upper层代表镜像,lower层代表容器可写层
image.png

挂载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。

测试

  1. root@aliyun:~/tmp# echo "in lower" > lower/lower.txt
  2. root@aliyun:~/tmp# echo "in upper" > upper/upper.txt
  3. root@aliyun:~/tmp# echo "in upper" > upper/both.txt
  4. root@aliyun:~/tmp# echo "in lower" > lower/both.txt
  5. root@aliyun:~/tmp# tree
  6. .
  7. ├── lower
  8. ├── both.txt
  9. └── lower.txt
  10. ├── merged
  11. ├── upper
  12. ├── both.txt
  13. └── upper.txt
  14. └── work

挂载为只读方式

  1. root@aliyun:~/tmp# mount -t overlay -o lowerdir=upper:lower overlay merged
  2. root@aliyun:~/tmp# tree
  3. .
  4. ├── lower
  5. ├── both.txt
  6. └── lower.txt
  7. ├── merged
  8. ├── both.txt
  9. ├── lower.txt
  10. └── upper.txt
  11. ├── upper
  12. ├── both.txt
  13. └── upper.txt
  14. └── work
  15. 4 directories, 7 files
  16. root@aliyun:~/tmp# cat merged/both.txt
  17. in upper
  18. root@aliyun:~/tmp# echo a > merged/both.txt
  19. -bash: merged/both.txt: Read-only file system

挂载为可写

  1. root@aliyun:~/tmp# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay merged
  2. root@aliyun:~/tmp# tree
  3. .
  4. ├── lower
  5. ├── both.txt
  6. └── lower.txt
  7. ├── merged
  8. ├── both.txt
  9. ├── lower.txt
  10. └── upper.txt
  11. ├── upper
  12. ├── both.txt
  13. └── upper.txt
  14. └── work
  15. └── work
  16. 5 directories, 7 files
  17. root@aliyun:~/tmp# echo new > merged/both.txt
  18. root@aliyun:~/tmp# cat merged/both.txt
  19. new

OCI容器标准

Open Container Initiative

  • OCI组织创建于2015年,致力于定义容器镜像标准运行时标准的开放组织
  • 镜像标准 Image Speciafication,定义镜像该如何打包
  • 运行时标准 Runtime Specification,定义镜像如何解压并运行
  • 分发标准 Distribution Specification,定义镜像如何分发

docker引擎架构

  • k8s 可以直接对接containerd
  • 引入shim,容器运行后shim将其交由systemd管理,这样,containerd就可以重启或者升级

image.png