白话容器namespace
脚本后续更新及迭代将由kkitDeploy项目代替 https://github.com/luckman666/kkitdeploy_server 请大家持续关注kkitDeploy
进入正题之前是例行装X环节:
过年7天吃的,花了45天又回来了。
近年来容器大火,也正是因为容器,生生灭掉了一个IT岗位!哥也是被生生的逼上了邪路。
那究竟什么是容器呢?
就三个字:它就是个进程!(多了算赠送的)
所以以后再有人问你用docker会不会损耗性能什么的,你就跟他说几乎没有或者就是没有!他要问为什么?你咋那么确定?你就告诉他是波哥说的。但是挨打了啥的别怨我就行,反正到时候我不承认。
正常情况下docker极限情况下是5%左右的损耗,虚拟机极限情况大概15%至30%的损耗,咱们是相对于纯物理机来讲的。当然这个不是绝对值,也要取决于我们创建docker的网络和存储方式,别犟奥!再犟打你。相关性能分析以后我会专门做个试验来阐述。
其实为什么敢这么说呢?因为我们只要剖析一下他的底层实现原理就明白了。这个就是我们今天要聊得话题。
容器的如何被封装的隔离的呢?1分钟就能说明白!
尽量不学术奥,要不太XX枯燥,看着都烦!
这句划重点:linux咋创建的进程,就咋创建的docker。
作为系统它不管你是啥,他都用统一的方式进行管理。
举个栗子:
你就是个单身狗:你去婚介找对象,人家就说了为了方便统计信息,我们都是按规定写上六个条件:身份证号,用户名,现住址,存款,电话,家庭成员。
你要想找对象,那么就得按这个格式写上你的信息。婚介有了这个信息后就可以帮你找你合适的人选啦。
这里操作系统就是个婚介所,身份证对应每个进程的PID(进程编号)号(他的孩子叫PPID),用户名对应UTS(主机名和域名),存款对应IPC(信号量,内存等),现住址对应mount(文件系统挂载点),电话对应network(网络设备),家庭成员对应user(用户和用户组)。
具体名词是这样审的:
一个人就是一个进程,每个人有六项信息,同样每个进程会有六项固定信息。
这每一项信息呢,就是咱们所谓的namespace啦。中介如何判断你俩是否有戏呢?也就是说在系统中如何判断两个进程的某项namespace是否相同呢?
看他们的namespace号,就是这样婶的:
PID为1的namespace:
PID为2的namespace:
看到没,他俩后边那个号有个一样的。那么他俩那个选项就是在同一个namespace中。(我不知道奥,瞎说的,实在没时间细细的截图,反正就类似吧)
所以他们既可以namespace都一样,也可以某项在一起,也可以完全不一样。
如果他们的六个空间号都相同呢?那一定是两口子,要是为了家庭和睦呢就不能起争执,所以他们的特点最好就是不一样,也就是不同的应用,比如一个tomcat,一个mysql。这样样他俩不打架!而且沟通还无障碍!
那么如果都不一样呢?
都不一样就互相看不见对方。老死不相往来的那种,谁也不能影响谁。(一个容器跑一个独立应用,这就是一个宿主机跑100个独立容器,但是他们互不干扰的原理,而且他们在自己的容器中都认为自己是老大哦,所以他们的PID都是1)
我们通常会怎么用namespace呢?
通常我们会遇到两个docker需要相互通信,非常简单,那就让他们管网络namespace相同就好了。他们就能互相看见对方啦。具体操作可以看docker-compose里面的相应参数。
总结来说docker就是一个进程,它们的相关信息被切成了6块,分别存放。如果不想让他们认识,那么就用独立的六个盒子装,反向亦可!
超级简单对不对?就酱~
容器确实被切成6块封印起来了。它肯定是不会乱跑了。但是他会乖乖的接受我们的控制嘛?他要是忽然把一个盒子撑爆可咋办?
那么下次我们再聊聊如果限制这些已经被封印的容器!
神奇的cgroup!~
PS:大家可以关注我的公众号获取更多的项目代码和讲解!
波神与你同行哦,加油!!!