原来这就是Docker的文件系统?

2,403

别让别人告诉你,你成不了才,即便是我也不行。——《当幸福来敲门》

在这里插入图片描述

插画来自网络


前言

这一篇文章我来给大家介绍下docker的文件系统,经过查阅了很多的官方文档以及其他网络上的文章总结出来的,希望大家通过这篇文章能够知道 到底容器是什么?以及 容器跟虚拟机到底有什么本质的区别?


容器是什么

在前面的文章中我们为什么选择Docker 一文中我已经给大家介绍过docker与虚拟机的原理和区别了,但是,即便我不懂容器也并不会影响我使用它,这就和我们开车一样,我虽然不懂发动机的原理,但是我仍然可以轻松的使用打火,离合,刹车,转向这些功能,来达到驾驶的目的。

虽然说不懂修车,不懂发动机原理不影响我们开车,但是如果我们想要改造一个汽车,就必须要对汽车的整体结构和发动机十分的熟悉才行了。

当我们通过命令docker run 将镜像构建成容器的时候,我们就要康康容器的内部有什么了。 我们可以通过docker exec -it 容器名称/容器id bash命令来进入容器。 在这里插入图片描述 可以通过ll命令来查看容器内部,然后就会惊奇的发现容器内部居然是一个完整的操作系统,它不仅有root目录,有bin目录,还有bin,proc,var等等,而且我们可以在容器内部运行我们经常使用的Linux命令,好像我们就是在一个虚拟机中一样,和宿主机(Ubuntu)咩有任何的关系。 在这里插入图片描述 但是我们在之前的文章中就说过,docker是直接使用宿主机的内核,而不是像虚拟机那样虚拟出一整个操作系统,所以,这里我们操作的每个命令就是在宿主机上运行的,但是虚拟机不是,虚拟机上运行的任何程序,任何东西都不会影响宿主机,是完全隔离开的。

所以我们经常会看到别人说:容器比较节约资源,但是Docke到底是如何欺骗我们的,就需要先了解他的文件系统


联合文件系统:aUFS

AUFS:全称 Union File System,又叫做 Another UnionFS,所谓的UnionFS,就是把不同物理位置的目录合并mount到同一个目录。而docker就是通过这个特性实现了镜像层的重叠,容器层的存储和显示层的展示

aUFS的工作原理

在这里插入图片描述 可以看到,假设我们存在2个目录X,Y,分别有A,B文件,那么aUFS的作用就是将这两个目录合并,并且重新挂载的Z上,这样在Z目录上就可以同时看到A和B文件。这就是联合文件系统,目的就是将多个文件联合在一起成为一个统一的视图

在这里插入图片描述 如上图,我们在Z目录中删除B文件,同时,在A文件中增加一些内容,如Hello。此时可以发现,X内的A文件新增了Hello,并且新增了一条B被删除的记录,但是Y中的B并没有任何变化。这是aUFS的一个重要特性。在所有的联合起来的目录中,只有第一个目录是有写的权限,即我们不管如何的去对Z进行修改操作,都只能对第一个联合进来的X修改,对Y是没有权限修改的。

但是如果我们在Z中对Y中的文件进行了修改,它虽然没有权限去修改Y目录中的文件,但是它会在第一层目录添加一个记录来记录更改内容

aUFS用来做了什么

在这里插入图片描述 我们再来看一下这张图,我们通过docker history + 镜像ID来查看镜像的历史。 当镜像启动的时候,一个新的可写层会加载到镜像的顶部,这一层我们一般称为容器层,之下是镜像层。 容器层可以读写,容器所有发生文件变更都发生在这一层,而镜像层是read-only只读

根据aUFS的定义,容器的文件系统就是由下面的15个只读镜像层和1个可写的容器层通过aUFS mount出来的。

到这里,就能和前面的aUFS联系起来了,X就是容器层,可修改,可记录,Y就是镜像层,不可更改,只读,而Z就是我们进入联合起来的视图层在这里插入图片描述


Docker的分层镜像

了解了aUFS之后,再来看一下docker的分层镜像。

在这里插入图片描述 我们通过对容器层A的修改重新构建了一层镜像,此时的镜像由原来的Y和X共同构成。 当我们运行这个新的镜像的时候,就创建出了一个新的容器P,而这个新创建的容器层P会继续接受视图层的更改请求。

可以看到X只是针对Y作出更改,而P只是针对重叠后的X做出更改,这种上层镜像只记录对下层镜像更改的方式,就是docker的分层镜像系统。 在这里插入图片描述 如上图,我们通过pull或者push一个镜像的时候,会发现由很多的layer,是一个十几层的镜像。


总结

容器的本质并非完整的操作系统,而是通过联合文件系统展示出来的视图隔离文件之间的文件系统,如同我们看到的docker Logo一样。 在这里插入图片描述 鲸鱼就是我们的宿主机,集装箱就是各种各样的容器,那么容器与容器之间是如何隔离的呢?Namespace(名称空间),联合文件系统,cgroups(控制组,进行资源隔离)慢慢来。


结束

如果本篇博客有任何错误,请批评指教,不胜感激 !