[梁山好汉说IT] 用实例来深入理解容器概念
0x00 摘要
如何对没有软件开发经验的人解释容器?
集装箱真的能够完美解释容器嘛?
除了集装箱还有其他常见实体能够解释容器嘛?
我找到了一个能够 和集装箱搭配起来 解释容器的例子:军队,或者更准确的是说北宋军队制度。
摘要对比如下:
项目 | 容器 | 宋军 |
---|---|---|
总体需求 | 应用的扩展问题/迁移性问题/批量快速部署 | 召之即来/来之能战/战之能胜/胜了就老实点别造反 |
基本功能 | 完成进程基本业务功能 | 统兵权 |
封装 | 编程/打包成容器镜像 | 握兵权+装备 |
资源控制 | C groups | 调兵权 |
环境隔离 | Name space | 军队番号 |
扩展迁移 | 无状态/容易迁移 | 更换法(将不识兵 兵不认将) |
标准化 | 各种容器标准 | 基础建制/武经总要 |
0x00 背景
前几天,运营的兄弟问我:什么是容器。我用集装箱例子讲了下结果他似懂非懂。于是这给我带来了几个新问题:
-
如何对没有软件开发经验的人解释容器?
-
集装箱真的能够完美解释容器嘛?
-
除了集装箱还有其他常见实体能够解释容器嘛?
经过一番思考,我找到了一个能够 和集装箱搭配起来解释容器 的例子:军队,或者更准确的是说北宋军队制度。下面就让我试着阐述下。
0x01 IT相关概念
1. 容器的本质
1.1 从广泛的角度看
容器(或者类似概念)的本质:是用来对某些实体(物理或者虚拟实体,比如进程)进行有效控制的一系列手段/思路/标准/方法论。控制范围包括但是不限于容易扩展/容易迁移/资源限制/信息限制/风险把控等。
1.2 从IT从业者角度来看
容器本质:容器是一个进程,进程与进程之间互相隔离造就了容器与容器互不影响得特性。在启动一个容器(即创建一个进程时),
-
通过Namespace技术实现容器的环境隔离。
-
通过Cgroups来实现容器的资源控制。
-
通过rootfs来完成文件系统隔离,通过只打包必要信息实现了轻量级。
2. 容器特点/技术(IT行业)
2.1 需求
云计算解决了基础设施计算,网络,存储这几个方面的弹性问题,但是遗留了几个问题:
-
应用的扩展问题
-
迁移性问题
-
批量快速部署问题
2.2 借鉴
容器借鉴了运输业的集装箱概念。集装箱的特点:
-
封装
-
标准
容器的思想就是要变成软件交付的集装箱。
-
更好的迁移,省去了中间来回搬货卸货,
-
进行隔离,不同物品之间分隔开互相不影响。
即容器就是封装应用和应用的运行环境(应用运行所需要的依赖关系),也就是将任何应用以及其依赖打包成一个轻量级可移植自包含的容器。
2.3 特点/技术
因为封装,所以采用了两大技术,
-
Namespace,在不同Namespace中的应用可以有独立的网络资源、用户空间、进程号等;
-
Cgroups,可以把cpu、内存等资源进行隔离让容器使用,可以实现对容器资源的限制,限制容器能够使用的cpu和内存资源,避免单个容器出错,耗尽所有系统资源。
因为轻量级,所以打包时候,弃用了一些冗余信息。比如弃用OS/应用运行产生的本地数据。这样也顺便产生了容器另外一个特点:无状态。
0x02 容器思想在北宋社会的应用---北宋的军队制度。
因为赵匡胤作为编剧/配角/男主等亲身参与了两次军队夺权(郭威夺后汉,陈桥兵变),他深深知道"兴亡以兵",所以北宋皇帝对于军队的需求就是 "召之即来/来之能战/战之能胜/胜了就老实点别捣乱造反"。从而赵官家们对于军队进行了最大化的控制。实现了"环境隔离/资源控制/无状态/标准化"等等和容器对应的特性。
下面让我们对比印证看看。
1. 需求
-
容器:应用的扩展问题/迁移性问题/批量快速部署问题。
-
宋军:召之即来/来之能战/战之能胜/胜了就老实点别捣乱造反。
"召之即来/来之能战"就是"扩展/迁移性",即遇到战斗先上一个建制(1千人),不行再上几个建制..... 这就做到了水平扩展。 "战之能胜"是一个正常的业务需求,对应的就是"进程的业务功能"。 "胜了就老实呆着别捣乱造反" 这个算是系统需求,对应的就是"进程完成工作之后继续安静等待下一次业务请求"。
2. 被控制的实体
-
容器控制的实体是进程。
-
北宋军队制度控制的实体是宋军。
进程能够完成被期望的业务,但如果控制不好容易对系统造成伤害,比如把系统搞挂了。 军队的工作是战斗,但如果控制不好就会 "武而优则仕","兵强马壮得天下",也会给系统(北宋朝廷)造成伤害。
3. 容器完成控制所采取的手段/思路/标准/方法论
容器:为了实现封装采用了环境隔离/资源控制。比如
-
通过Namespace技术实现容器的环境隔离
-
通过Cgroups来实现容器的资源控制
-
通过rootfs来完成文件系统隔离,通过只包必要信息实现了轻量级。
4. 北宋完成控制所采取的手段/思路/标准/方法论
4.1 分兵权为握兵权、调兵权和统兵权 ----> "环境隔离/资源控制"
握兵权属于军队的长官,即三衙平时负责军队的训练; 枢密院掌调兵权,国家要用兵时,能够调动部队是枢密院,如果没有枢密院的虎符,军队的长官是调不动一兵一卒的。 领兵出征的将帅是临时委派的,即统兵权非长任。
-
握兵权可以理解为 "编程/打包成容器镜像",也完成了部分"环境隔离"。
-
调兵权可以理解为 "通过Cgroups来实现容器的资源控制"。
-
统兵权可以理解为 "运行进程完成业务功能"。
给将帅多少兵就是给你多少资源,由枢密院严格控制。这些从水浒传就能看出。
对于关胜,就是枢密院调拨其他地区兵源.
"太师见说大喜,与宣赞道:“此乃围魏救赵之计,正合吾心。”随即唤枢密院官,调拨山东、河北精锐军兵一万五千,教郝思文为先锋,宣赞为合后,关胜为领兵指挥使,步军太尉段常接应粮草。
对于呼延灼,国防部长高太尉倒是允许调用本部军马,但是人家通过物资一样可以控制你。所以呼延灼只能再提出物资需求.
"呼延灼禀道:“此三路马步军兵,都是训练精熟之士,人强马壮,不必殿帅忧虑。但恐衣甲未全,只怕误了日期,取罪不便,乞恩相宽限。”高太尉道:“既是如此说时,你三人可就京师甲仗库内,不拘数目,任意选拣衣甲盔刀,关领前去。务要军马整齐,好与对敌。出师之日,我自差官来点视。”呼延灼领了钧旨,带人往甲仗库关支。呼延灼选讫铁甲三千副,熟皮马甲五千副,铜铁头盔三千顶,长枪二千根,滚刀一千把,弓箭不计其数,火炮铁炮五百余架,都装载上车。临辞之日,高太尉又拨与战马三千匹"。
4.2 Namespace
这个在北宋没有找到严格对应的概念。但是历朝历代中军队中都是有番号的,比如"太平军/天平军/控鹤军/银枪效节都/厅子都",这个番号大致可以算成是Namespace。
Namespace在现代IT是用来保证安全的概念,但是在宋朝这个番号也是有风险的,即"太平军"可以有,"岳家军"就不能有......
4.3 实行"更换法",经常调换军队长官 ----> "无状态/容易迁移"
用"更换法"完成了军队"无状态/容易迁移" 这个特点。话说"无状态"就是"将不识兵 兵不认将"。
为了防止军队形成”亲党胶固“,赵匡胤还来了两招更狠的。
-
首先,经常更换军队的主官,每几年一换这样这些将军们就不可能在军队中有太多的亲信,"兵无常帅,帅无常师"。
-
其次,则是经常性的更换军队的驻地,这样做有两个好处,士兵们经常换地方,就会形成习惯,不会恋家。第二个好处则是可以一定程度上训练士兵,特别是没有战事的时候,换一次驻地就相当于一次战争模拟,可以让士兵均劳逸、知艰难、认战斗、习山川。
4.4 标准化 ----> 易于管理
为了更好控制,也为了统兵将帅方便进行战斗部署,宋军也进行了标准化。包括基础建制上的和业务素质上的。
-
基础建制上:"马步军,诸指挥各有指挥使、副指挥使,每都有军使(500骑)、副兵马使(250骑)、都头(200兵500人)、副都头、厢军头(100骑)、十将、将虞候(步)、承局(骑)、押官(充军者),置都监监押以领之,岁时简练焉"。
-
业务素质上: 织编纂出中国第一部新型兵书《武经总要》。该书包括军事理论与军事技术两大部分。
0x03 结论
北宋赵官家们面对军队的处境和我们当前面对大批量计算/应用的处境很类似。他们用各种套路和手段完成了对军队的控制。
具体北宋军制的效果如何?
-
"容易扩展/容易迁移性/容易批量快速部署/无状态/标准化..." 这些特点在现代工业体系/计算机理论下是可以做到的,因为数值化/机械化的东西是可以精细控制。
-
"召之即来/来之能战/战之能胜/胜了就老实点别捣乱造反/风险控制..." 这些特点对于北宋是高难度挑战,因为军队是由一个个人构成的,除非能够思想控制能够下到最基层建制,否则无法做到。赵官家们对军队的控制做到了外在的"形",但是没有内在的"神"。
看来赵官家们有艺术家才能,也有现代工程师的素质,可惜早生了许多年。
0x04 参考
https://www.zhihu.com/question/24725639
http://www.sohu.com/a/235829001_100008688
http://www.sohu.com/a/226022265_100057812