Skip to main content

rootfs 篇

在了解了Docker容器的2个基础技术 Linux namespaceLinux cgroup 以后。我们来聊聊Docker镜像,也就是挂载在容器根分区/下面的文件系统,也叫做rootfs.

Linux rootfs

Linux rootfsLinux Root File System, Linux 根文件系统,是包含在和根目录相同的分区上的文件系统,是内核启动时挂载的第一个文件系统。系统的引导启动进程,会在根文件系统挂载以后,把初始化脚本和服务等加载到内存中运行。而在Docker容器进程中,也有一个rootfs, 这个文件系统的主要功能是用来给容器进程提供隔离后的执行环境。它也有另外一个名字,叫做 Docker容器镜像
有一个比较重要的点是,rootfs 只是一个操作系统所包含的文件、配置以及目录,并不包括操作系统内核。在Linux 操作系统中,文件系统和系统内核是分开存放的,操作系统只有在开机启动时,才会加载指定版本的内核。这就意味着,同一个宿主机上面的所有容器,都共享宿主机操作系统的内核。当容器进程需要配置内核参数、加载额外的内核模块和内核进行直接的交互时,实际上都是直接调用宿主机操作系统的内核。

容器的 rootfs

容器的 rootfs 自下而上分为三个部分,分别是,只读层(ro+wh),init层(ro+wh),读写层(rw)

名称描述
只读层对应 Docker 容器的镜像层,这部分不可被修改
init 层夹在只读层和读写层之间,Docker 容器单独生成的一个内部层,专门用来存放 /etc/hosts/etc/resolv.conf等信息
读写层这一层的挂载方式是 rw,一旦在容器里做了写操作,你修改后的内容就会增量地出现在这个层中

观察一个Docker容器

在之前 《离线环境部署docker环境》 我们启动了一个registry容器,接下来我们来看看它的文件系统

我们可以利用 docker inspect 指令来获取容器的详细信息

$ docker inspect private-registry
......
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/7d83a80fb09250a1ef49b37d20a0492b37b93db65e9a4b954f3c820a0f2ed106-init/diff:/var/lib/docker/overlay2/242007cc0f388dbb760a60b5e8b635a981b62b9dc170fd2c8aa02dc762426a10/diff:/var/lib/docker/overlay2/7d4c76a7d4f3cb5d5c3ebae69a45aac157060178cb29f113e1cfda1142ba9e88/diff:/var/lib/docker/overlay2/bf51aac76ea5da6532f53b5d4d833f69f479ffdc4033695ba6c9a400c3333649/diff:/var/lib/docker/overlay2/826cee954a8e9db6b13ffff58c333bc3071de9a569a0e6afd888b347c968f6db/diff:/var/lib/docker/overlay2/d4f5a3d3ae5157eb33cad7d3b24808f0420f55b61910f36c8026bfb18bd6b99b/diff",
"MergedDir": "/var/lib/docker/overlay2/7d83a80fb09250a1ef49b37d20a0492b37b93db65e9a4b954f3c820a0f2ed106/merged",
"UpperDir": "/var/lib/docker/overlay2/7d83a80fb09250a1ef49b37d20a0492b37b93db65e9a4b954f3c820a0f2ed106/diff",
"WorkDir": "/var/lib/docker/overlay2/7d83a80fb09250a1ef49b37d20a0492b37b93db65e9a4b954f3c820a0f2ed106/work"
},
"Name": "overlay2"
},
......

我们可以看到,这个容器的用到的文件系统类型是 overlayfs, 这个是目前 Docker的默认类型。另外我们可以看到 docker inspect 的输出有4个类型的目录,镜像所挂载的目录层为 Lower 层,然后通过 Merged 展示所有的文件目录与文件。用户写入的所有文件都是在 UpperDir 目录,并且会在 UpperDir 建立于 Merged层展示的文件 目录结构, 所以用户就可以看到写入的文件。并且底层的镜像是不能被修改(如果挂载目 录为 UpperDir,则可以修改源镜像)。