典型的linux文件系统组成:
- bootfs(boot file system)
-
- bootloader - 引导加载kernel
- kernel-当kernjel被加载到内存中后umount bootfs
- rootfs(root file system)
-
- /dev,/proc,/bin,/etc/等标准目录和文件
- 对于不同的linux发行版,bootfs基本是一致的,但rootfs会有差别
docker的启动
linux
- 在启动后,首先将rootfs设置为readonly,进行一系列检查,然后将其切换为readwrite供用户使用。
docker启动
- 初始化时也是将rootfs以readonly方式加载并检查,然后接下来利用union mount的方式将一个readwrite文件系统挂载在readonly的rootfs之上
- 并且允许再次将下层的fs(file system)设定为readonly并且向上叠加
- 这样一组readonly和一个writeable的结构构成了一个container的运行时态,每一个fs被称为一个fs层
写操作
由于镜像具有共享特性,所以对容器可写层的操作需要依赖存储驱动提供的写时复制和用时分配机制,一次来支持对容器可写层的修改,进而提高对存储和内存资源的利用率
- 写时复制
- 写时复制,即copy-on-write。一个镜像可以被多个容器使用,但是不需要在内存和磁盘上做多个拷贝。在需要对镜像提供的文件进行修改时,该文件会从镜像的文件系统被复制到容器的可写层的问价系统进行修改,而镜像里面的文件不会改变。不同容器对文件的修改都互相独立,互不影响。
- 用时分配
- 按需分配空间,而非提前分配,即当一个文件被创建出来,才会被分配空间