Docker文件系统对于我来说一直是个黑箱,我只知道通过docker exec进入container之后,可以看到container视角的文件系统,但这个文件系统怎么来的,由什么构成,什么是image,什么是container,docker常用的overlayFS到底是什么?这些都一无所知。刷知乎时,偶然看到相关docker rootfs的相关文章,遂开始学习。学习的途中又陆陆续续挖掘出来更多的细节,于是有了这篇文章来总结这段关于docker文件系统的学习。

我们知道container其实就是一个进程,与普通进程不同的时,container进程通过一些隔离技术做到了container之间的互相隔离。docker container主要有三个核心隔离技术:namespacecgroupsrootfs 。

一、概念回顾

1.1 Namespace

Namespace(命名空间)是Linux内核的一项功能,该功能对内核资源进行分区,使一组进程看到一组资源,而另一组进程看到另一组资源。Namespace有很多种,包括下表中列出的7种。

https://pic1.zhimg.com/v2-5c1f3f22a222391dafe762300e34361c_b.jpg

其中比较重要的有network,mount和PID namespace。

关于namespace可以参考:

Docker基础技术:Linux Namespace(上) | 酷 壳 - CoolShellcoolshell.cn/articles/17010.html

Docker基础技术:Linux Namespace(下) | 酷 壳 - CoolShellcoolshell.cn/articles/17029.html

此外,关于network的namespace可以参照我之前的两篇文章,有详细的阐述:

中本大头蒜:手撕Docker网络(1) —— 从0搭建Linux虚拟网络82 赞同 · 13 评论文章

中本大头蒜:手撕Docker网络(2) —— bridge模式拆解实例分析31 赞同 · 7 评论文章

1.2 Cgroups

Cgroups 是 control groups 的缩写,是Linux内核提供的一种可以限制,记录,隔离进程组(process groups)所使用物理资源的机制。主要功能有:资源限制(Resource limiting),优先级分配(Prioritization),资源统计(Accounting),进程控制(Control)等。关于cgroups的详细介绍可以参考我的上一篇文章:

中本大头蒜:手撕Linux Cgroups —— Cgroups实战分析以及在Docker中的应用26 赞同 · 2 评论文章

1.3 Rootfs

rootfs 是 docker 容器在启动时内部进程可见的文件系统,即 docker 容器的根目录。当我们运行docker exec命令进入container的时候看到的文件系统就是rootfs。rootfs 通常包含一个操作系统运行所需的文件系统,例如可能包含典型的类 Unix 操作系统中的目录系统,如 /dev、/proc、/bin、/etc、/lib、/usr、/tmp 及运行 docker 容器所需的配置文件、工具等。