别让别人告诉你,你成不了才,即便是我也不行。——《当幸福来敲门》
插画来自网络
这一篇文章我来给大家介绍下docker的文件系统,经过查阅了很多的官方文档以及其他网络上的文章总结出来的,希望大家通过这篇文章能够知道 到底容器是什么?以及 容器跟虚拟机到底有什么本质的区别?
在前面的文章中我们为什么选择Docker 一文中我已经给大家介绍过docker与虚拟机的原理和区别了,但是,即便我不懂容器也并不会影响我使用它,这就和我们开车一样,我虽然不懂发动机的原理,但是我仍然可以轻松的使用打火,离合,刹车,转向这些功能,来达到驾驶的目的。
虽然说不懂修车,不懂发动机原理不影响我们开车,但是如果我们想要改造一个汽车,就必须要对汽车的整体结构和发动机十分的熟悉才行了。
当我们通过命令docker run
将镜像构建成容器的时候,我们就要康康容器的内部有什么了。
我们可以通过docker exec -it 容器名称/容器id bash
命令来进入容器。
ll
命令来查看容器内部,然后就会惊奇的发现容器内部居然是一个完整的操作系统,它不仅有root目录,有bin目录,还有bin,proc,var等等,而且我们可以在容器内部运行我们经常使用的Linux命令,好像我们就是在一个虚拟机中一样,和宿主机(Ubuntu)咩有任何的关系。
但是我们在之前的文章中就说过,docker是直接使用宿主机的内核,而不是像虚拟机那样虚拟出一整个操作系统,所以,这里我们操作的每个命令就是在宿主机上运行的,但是虚拟机不是,虚拟机上运行的任何程序,任何东西都不会影响宿主机,是完全隔离开的。
所以我们经常会看到别人说:容器比较节约资源,但是Docke到底是如何欺骗我们的,就需要先了解他的文件系统。
AUFS:全称 Union File System,又叫做 Another UnionFS,所谓的UnionFS,就是把不同物理位置的目录合并mount到同一个目录。而docker就是通过这个特性实现了镜像层的重叠,容器层的存储和显示层的展示。
但是如果我们在Z中对Y中的文件进行了修改,它虽然没有权限去修改Y目录中的文件,但是它会在第一层目录添加一个记录来记录更改内容。
docker history + 镜像ID
来查看镜像的历史。
当镜像启动的时候,一个新的可写层会加载到镜像的顶部,这一层我们一般称为容器层,之下是镜像层。
容器层可以读写,容器所有发生文件变更都发生在这一层,而镜像层是read-only只读。
根据aUFS的定义,容器的文件系统就是由下面的15个只读镜像层和1个可写的容器层通过aUFS mount出来的。
到这里,就能和前面的aUFS联系起来了,X就是容器层,可修改,可记录,Y就是镜像层,不可更改,只读,而Z就是我们进入联合起来的视图层。
了解了aUFS之后,再来看一下docker的分层镜像。
我们通过对容器层A的修改重新构建了一层镜像,此时的镜像由原来的Y和X共同构成。 当我们运行这个新的镜像的时候,就创建出了一个新的容器P,而这个新创建的容器层P会继续接受视图层的更改请求。可以看到X只是针对Y作出更改,而P只是针对重叠后的X做出更改,这种上层镜像只记录对下层镜像更改的方式,就是docker的分层镜像系统。
如上图,我们通过pull或者push一个镜像的时候,会发现由很多的layer,是一个十几层的镜像。离文件之间的文件系统,如同我们看到的docker Logo一样。
鲸鱼就是我们的宿主机,集装箱就是各种各样的容器,那么容器与容器之间是如何隔离的呢?Namespace(名称空间),联合文件系统,cgroups(控制组,进行资源隔离)慢慢来。如果本篇博客有任何错误,请批评指教,不胜感激 !