從“集裝箱”思考Docker風潮 - 推酷 http://www.tuicool.com/articles/A7Rz6rF
從****「****集裝箱****」****思考Docker風潮
-- Docker潮流下的贏家策略
**By ****高煥堂 **
2015/02/20 (2015/8/16更新)
前言
在許多革命性轉(zhuǎn)折里号阿,經(jīng)常出現(xiàn)集裝箱的身影;它就像幸運草一般蓄喇,總是帶來許多幸福和財運♀剩現(xiàn)在Docker風起云涌碉碉,再現(xiàn)集裝箱身影发绢,如果開放視野好港、大力支持它媒怯,持續(xù)發(fā)揮它的潛能和力量鸽嫂,則幸運草就會出現(xiàn)在我們身旁了纵装。
由于Docker集裝箱帶來的商機,其最直接的受益者是軟件管理者(或稱維運者)据某,例如軟件測試工具業(yè)者橡娄、測試人員等。因此在今天癣籽,不論您是開發(fā)者或是維運者挽唉,最好是從維運者的角度、擴大視野來支持它筷狼,便能站在制高點上擬訂最佳策略瓶籽,掌握了需求碎片化的潮流,進而成為新世代的領(lǐng)頭羊埂材。
在這新世代里塑顺,除了拿Docker集裝箱來打包微服務(micro-service)來滿足需求碎片之外。我們還要以廣大的視野、創(chuàng)新的思維严拒,將碎片組合出各式各樣扬绪、氣象萬千的商業(yè)服務。就像飛機設計師一樣裤唠,把一群各自<不會飛>的模塊(如輪胎挤牛、引擎、機翼种蘸、油箱等)墓赴,以創(chuàng)新模式將它們組合起來,竟然整體就<能飛>上天空了劈彪。于是竣蹦,創(chuàng)新組合的接口(interface)的定義權(quán)成為兵家必爭之地,唯有掌握接口才有話語權(quán)沧奴。
1、****緣由
自從2014年以來长窄,Docker 的集裝箱(container)技術(shù)滔吠,可說是紅透半天邊,而且勢如破竹挠日、蔚為風潮疮绷,正在強力改變云(cloud)服務的世界。這跟半世紀前嚣潜,海上船運業(yè)的集裝箱風潮冬骚,對整個產(chǎn)業(yè)的革命性改變,其力道來源和產(chǎn)生經(jīng)濟效益懂算,可說具有異曲同工之妙只冻。
[650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/D4/wKiom1TprDfStFdWAAB98bcr0pM520.jpg" title="dc-pic-001.png" alt="wKiom1TprDfStFdWAAB98bcr0pM520.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">](http://s3.51cto.com/wyfs02/M00/59/D4/wKiom1TprDfStFdWAAB98bcr0pM520.jpg)
圖-1、Docker平臺的標志(Logo)
這項力道和潮流的直接受益者计技,是管理者(operator,又稱維運者)喜德,而不是開發(fā)者(developer)。因此垮媒,在本文里舍悯,我將從管理者的視角來說明Docker集裝箱即將帶來的革命性潮流,讓讀者們皆能興奮地迎接這項已經(jīng)來到身邊的潮流睡雇,并且能從中獲利萌衬。
2、****回顧半世紀前的船運集裝箱風潮
在半世紀之前它抱,集裝箱發(fā)揮了巨大的力量秕豫,改變了整個運輸產(chǎn)業(yè),也改變了人們的生活抗愁。就如Intel公司總裁葛洛夫(Andrew Grove)曾舉集裝箱為例說道:
「短短的十年馁蒂,實際上只是航運史上一個極短促的時間呵晚,造船設計即走向標準化,冷凍運輸船也誕生了沫屡,最重要的是集裝箱化作業(yè)的興起饵隙,這種容許船貨更快速裝卸的技術(shù)在航運的生產(chǎn)力上引進了『十倍速』的改變,逆轉(zhuǎn)了節(jié)節(jié)升高的成本趨勢沮脖,..... 有些港口做了改變金矛,有些雖盡力改革,卻無法做到勺届,許多則堅持抗拒這種潮流驶俊,結(jié)果,這些新技術(shù)引發(fā)了全世界貨運港口的重新洗牌免姿,.... 沒有采行新技術(shù)的港口(如新加坡及西雅圖)可能被重新規(guī)畫饼酿,成為購物中心、休閑場所或河岸公寓大廈胚膊」世」
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/D0/wKioL1TprVuixl0IAAD3cTw8GFs421.jpg" title="dc-pic-002.png" alt="wKioL1TprVuixl0IAAD3cTw8GFs421.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-2、集裝箱讓運輸費用降低一半(以下摘自百度圖片)
長榮海運公司總裁 張榮發(fā) 先生在其回憶錄上寫道:
「為了配合集裝箱化運輸時代的來臨紊婉,海運事業(yè)的整體運作型態(tài)也產(chǎn)生了重大的轉(zhuǎn)變茸炒,無論在海上運送戈稿、碼頭作業(yè)以及陸運轉(zhuǎn)接上砾莱,都有革命性的改變上岗。陸上拖車運輸業(yè)應時而興,扮演極為重要的角色肢础,以集裝箱拖車配合集裝箱船運輸还栓,具有簡化包裝、防止竊盜乔妈、加速貨物搬運及便利關(guān)務檢驗等優(yōu)點蝙云,使集裝箱運輸作業(yè)更加靈活。為了能確實掌握海上及陸上的運送服務質(zhì)量和效率路召,就率先于1973年9月成立了長榮運輸公司勃刨。」
[650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/D4/wKiom1TprI-zxCh6AAC_ZcfTjKw361.jpg" title="dc-pic-003.png" alt="wKiom1TprI-zxCh6AAC_ZcfTjKw361.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">](http://s3.51cto.com/wyfs02/M01/59/D4/wKiom1TprI-zxCh6AAC_ZcfTjKw361.jpg)
圖-3股淡、世界航運巨擘:長榮(Evergreen)
集裝箱的威力是來自于它提供了一致的接口(interface)身隐,簡化了運輸業(yè)的工具。例如以前唯灵,在集裝箱尚未普及之前贾铝,在公路上,必須為汽車業(yè)而設計特殊的拖車;在港口碼頭垢揩,也必須為木材業(yè)而設計特殊的卸貨吊車及倉庫等等玖绿。這些特殊設計對于運輸管理、港口管理叁巨、倉儲管理等都是很麻煩的事斑匪。有了集裝箱之后,就出現(xiàn)了專門運集裝箱的輪船锋勺,也有專門拖集裝箱的拖車蚀瘸,高速公路的彎曲度也因集裝箱拖車的安全而修正,倉庫的管理也變得很單純庶橱。集裝箱不一定帶給汽車業(yè)贮勃、木材業(yè)、玩具業(yè)帶來直接的方便苏章,也許反而帶來不方便(如大汽車必須拆解開來才能裝進集裝箱里)寂嘉。但是運輸業(yè)等獲得好處,所以運輸業(yè)會很樂意把集裝箱拱抬起來枫绅,促成集裝箱的革命性風潮垫释。
將之對應到Docker風潮,可知道Docker集裝箱的效益在于:讓所有云服務都有一致的操作(operation)界面撑瞧,包括部署、管理等方式显蝌。眾多云平臺就像眾多碼頭一樣预伺,都使用一致的方式來操作集裝箱,例如卸貨器具曼尊、拖車等酬诀。Docker公司的Scott Johnston曾說道:
「你將不再需要使用各項單獨的IT管理工具來分別進行App的管理、部署骆撇、監(jiān)控和擴容等功能操作瞒御,在整個企業(yè)內(nèi)這些操作都可得到一致性、統(tǒng)一性神郊‰热梗」
3、****從<國王的皮鞋>領(lǐng)悟Docker集裝箱的經(jīng)濟效益
古代有一位國王在它的國境里視察涌乳,因為路面崎嶇不平蜻懦,還有很多碎石頭,刺得國王的腳又痛又麻夕晓。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/59/D0/wKioL1TprfeAv3kJAAEN_MLzw4U767.jpg" title="dc-pic-004.png" alt="wKioL1TprfeAv3kJAAEN_MLzw4U767.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-4宛乃、赤腳國王的故事(摘自百度圖片)
回到了王宮后,他下了一道命令,要將國內(nèi)所有的道路都鋪上一層牛皮征炼。讓他自己和]全國的人走路不再受刺痛之苦析既。眾大臣聽了國王的話都一籌莫展,知道這很難谆奥。即便殺盡國內(nèi)所有的牛眼坏,也湊不到足夠的牛皮來鋪路,而且花費昂貴雄右。這時空骚,一個聰明的仆人向國王建言:可以試著用牛皮將腳包起來,大王的腳就不會忍受痛苦了擂仍。國王聽道而頓悟了囤屹,便收回命令,采納了建議逢渔,于是肋坚,皮鞋就這樣發(fā)明了出來了。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/D0/wKioL1TprkOQVrDCAACaXBtvdBI793.jpg" title="dc-pic-005.png" alt="wKioL1TprkOQVrDCAACaXBtvdBI793.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-5肃廓、國王的皮鞋
我想智厌,大家一定都聽說過上述的皮鞋故事了。其解決腳痛不方便的方案有二:第1方案是:將所有道路都鋪上一層牛皮(如VMware)盲赊,實在不經(jīng)濟實惠铣鹏。 第2方案是:用兩片牛皮包住腳,這就是皮鞋(Docker集裝箱)哀蘑。那么诚卸,你領(lǐng)悟到什么呢? 至少明顯知道第2方案可帶來可觀的經(jīng)濟效益。
從上述皮鞋故事的比喻绘迁,可知道傳統(tǒng)的虛擬化(virtualization)技術(shù)就相當于在各道路(實體機器)上鋪一層牛皮(VM, 虛擬機)合溺,然后讓國王的腳(App)在牛皮(VM)上走路(執(zhí)行)。傳統(tǒng)上云平臺采取虛擬化手段來滿足用戶個別的資源需求分配缀台,以及確保其可用性和隔離性棠赛。然而無論是KVM還是Xen等Guest OS都很浪費資源又難于管理, 都不如Docker集裝箱(皮鞋)來的更加靈活、快速和節(jié)省資源膛腐。
4睛约、****Docker****如何運輸(ship)集裝箱?
顧名思義依疼,Docker就是“碼頭搬運工人”之意痰腮。而集裝箱的主要用途就是運輸東西。所以律罢,我們把焦點放在Docker集裝箱和如何運輸上膀值,也就是從運輸(shipping)的角度來認識Docker及其集裝箱棍丐。
設想在開發(fā)平臺上,開發(fā)者撰寫一份dockerfile檔沧踏,讓Docker(碼頭搬運工人)在此平臺上建立一個Docker集裝箱歌逢,此集裝箱運行于開發(fā)平臺上的一個用戶進程(process)里,包含了執(zhí)行某一特定App程序的所需要的OS翘狱、軟件庫秘案、配置文件和資料,是一個可移植的運行單位潦匈。那么阱高,如何把這個集裝箱運輸(移植)到云平臺上呢?這時茬缩,Docker(碼頭搬運工人)就從這個集裝箱(或其dockerfile)產(chǎn)生出它的鏡像(image)赤惊,通稱為Docker(集裝箱)鏡像;然后把該(集裝箱的)鏡像傳輸?shù)皆破脚_上凰锡。云平臺上的Docker會依據(jù)這鏡像未舟,修改一下配置模塊,就在云平臺上創(chuàng)建一個新的Docker集裝箱了掂为,讓App在此集裝箱里執(zhí)行裕膀。相對上,一個Docker鏡象是一個模子(template)勇哗,可用來創(chuàng)建多個Docker集裝箱對象或?qū)嵗?instance)昼扛。
由于Docker集裝箱及其鏡像,是由dockerfile文件的腳本所創(chuàng)建的欲诺;所以也可直接將dockerfile文件傳輸?shù)皆破脚_野揪,并依據(jù)其腳本而在云平臺上創(chuàng)建新的Docker集裝箱。集裝箱的dockerfile文件和鏡像兩者都是模子瞧栗,都可用來(在云平臺上)創(chuàng)建集裝箱實例,并讓App順暢執(zhí)行起來海铆。軟件專家波金(Lucas Perkins)在其文章:“ Docker and Shipping Containers: An Imperfect Analogy”里迹恐,就拿一棵樹來比喻一個Docker集裝箱,而不是拿船運集裝箱來比喻卧斟。他說道:
“The shipping container analogy is apt, but for me it completely breaksdown on one crucial point: when shippingcontainers go down, their cargo is lost.”(拿船運集裝箱來比喻是可以的殴边,但有一點會失真:當集裝箱沉入大海,貨物就消失了珍语。)
“Docker containers don't work this way. When they go down, you simplyrebuild the container.”(Docker集裝箱并非如此锤岸,當它損毀了,只要重建一個就行了板乙。)
“In this sense, Docker containers are more like plants than shippingcontainers. If a plant dies, you simply plant a seed and replace it.” (以此觀之是偷,Docker集裝箱更像樹木拳氢。如果一棵樹枯死了,只要播下種子蛋铆,長出一棵新樹就行了馋评。)
“If a Docker container goes down, .... You can simply use the oldcontainer's Dockerfile (think of it as a container seed) to sprout a newcontainer identical to the old one. Even better, Dockerfiles, like seeds, tendto be quite small , but they can grow into mighty oaks.”(如果一個Docker集裝箱損毀了,你只要使用原來的dockerfile(就像種子)來重新長出一棵一樣的樹就行了刺啦。而且一個小小的dockerfile留特,就能長出一棵大樹。)
上述dockerfile是一種腳本文件玛瘸,用來描述如何把二進制(binary)文件裝進一個Docker集裝箱鏡像(Dockerimage)蜕青,并做好配置。當你使用docker build命令的時候糊渊,Docker會讀取這dockerfile文件右核,執(zhí)行其腳本內(nèi)容來構(gòu)建立一個Docker鏡像。所以再来,DockerFile的用途就(像樹的種子)用來構(gòu)建Docker鏡像蒙兰。我想,從上所述芒篷,你應該可以領(lǐng)悟Docker集裝箱運輸?shù)暮饬恕?/p>
5搜变、****從LXC容器到Docker集裝箱
Docker集裝箱是基于LXC容器而發(fā)展出來的。其實针炉,這里的集裝箱和容器都是“Container”術(shù)語的的中文翻譯挠他。那么,為何我稱LXC容器篡帕,而稱Docker集裝箱呢? 其主要原因是:LXC容器是特定平臺的虛擬化殖侵,不能充分獨立于底層機器(平臺)的配置(configuration),例如networking, storage, logging, distro等等镰烧。所以拢军,LXC本身無法充分跨(機器)平臺,導致App也無法跨平臺怔鳖。也就說茉唉,LXC難以通過標準化的模板制作、重建结执、復制和移植度陆,無法如船運集裝箱一般,可以跨越各地港口和碼頭献幔。
后來懂傀,Docker弭補了這項缺點。Docker在LXC與平臺之間定義了標準接口蜡感,提供一種安全蹬蚁、可重復的執(zhí)行環(huán)境恃泪,讓各集裝箱都運行于自己的網(wǎng)絡空間、虛擬界面和IP地址缚忧;并能自動部署和更新軟件版本悟泵。這種跨平臺的新型LXC就成為Docker集裝箱。就像船運集裝箱與各港口的碼頭闪水、各公司貨輪或拖車的型號糕非、配置是無關(guān)的。
簡而言之球榆,雖然LXC容器很成熟了朽肥,只是缺乏跨平臺性,不方便在多平臺(機器)之間移動持钉;也不方便于創(chuàng)建管理衡招,不易于重復操作和共享等∶壳浚基于成熟的LXC容器功能始腾,Docker集裝箱解決了上述問題,成為可移植空执、易于改版與整合的新一代虛擬化技術(shù)浪箭。“集裝箱”一詞強調(diào)了Docker 集裝箱的效益在于:讓所有云服務都有一致的部署辨绊、傳輸奶栖、改版等管理方式。眾多云平臺就像眾多碼頭一樣门坷,都使用一致的方式來操作集裝箱宣鄙,例如卸貨器具、拖車等默蚌。
6冻晤、****認識LXC容器
LXC仰賴namespace來實現(xiàn)隔離性。讓每個容器都有自己的命名空間绸吸,確保不同容器之間不會相互影響明也,讓每個容器成為擁有自己進程和網(wǎng)絡空間的虛擬環(huán)境,都成為一個獨立運行的單位惯裕。此外,LXC藉由內(nèi)核的cgroup來對各個容器(的進程)使用的系統(tǒng)資源做嚴格的限制绣硝。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/D0/wKioL1TpsMngc0eRAABiI1fwTec847.jpg" title="dc-pic-006.png" alt="wKioL1TpsMngc0eRAABiI1fwTec847.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
簡而言之蜻势,LXC基于namespace的隔離機制和cgroup的資源控制功能,來管理容器鹉胖。例如可建立一個cgroup來限制某個(容器)進程對CPU的占用率不能超過50%握玛。而Docker則在LXC基礎上够傍,加上Docker境像管理方式,就成為Docker集裝箱了挠铲。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/59/D0/wKioL1TpsOjgnQ0jAABuZZpc8ek590.jpg" title="dc-pic-007.png" alt="wKioL1TpsOjgnQ0jAABuZZpc8ek590.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
Docker借鑒了虛擬機(VM)的模式冕屯,讓用戶像管理VM一樣的管理他們的集裝箱鏡像。
6.1 ******隔離性
LXC運行于一個用戶空間進程里拂苹,在既有的進程管理架構(gòu)上安聘,增添了資源管理和隔離機制。所以LXC是針對某一App提供資源隔離和控制的輕量型虛擬系統(tǒng)瓢棒。LXC仰賴namespace來實現(xiàn)隔離性浴韭。讓每個容器都有自己的命名空間,比如pid/net/ipc/mnt/uts等命名空間脯宿,以及不同的 user id和group id念颈。有了namespace從進程、網(wǎng)絡连霉、IPC榴芳、檔系統(tǒng)、UTS和用戶角度進行隔離跺撼,我們就能e確保在不同容器之間不會相互影響窟感,每個容器都成為一個獨立運行的單位。從容器里而觀之财边,它是一個完整的Linux的世界肌括。在整個平臺而觀之,容器運行于一個普通的用戶空間進程酣难,namespace創(chuàng)造了這種映射和隔離效果谍夭,云平臺承載著一個個容器,就如同造物者創(chuàng)造了許多世外桃源一般憨募。
6.2 ******資源控制
LXC仰賴cgroup來限制各個進程對系統(tǒng)資源的使用能力紧索。通常會創(chuàng)建多個cgroup,形成一個樹狀結(jié)構(gòu)(hierarchy)菜谣。然后subsystem會關(guān)聯(lián)連接到這個樹狀結(jié)構(gòu)上珠漂。一個subsystem代表著一項資源,例如CPU尾膊、Memory或 I/O等媳危。例如下圖:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/D0/wKioL1TpsWzzjKjjAADG3LP_wH4943.jpg" title="dc-pic-008.png" alt="wKioL1TpsWzzjKjjAADG3LP_wH4943.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-6、cgroup樹狀結(jié)構(gòu)
這圖里的cgroup組織形式是樹狀結(jié)構(gòu)的冈敛,包含一個父cgroup和三個子cgroup待笑,其關(guān)聯(lián)到兩個subsystem (即CPU和memory)。這subsystem是經(jīng)由cgroup來與task(典型的就是進程)連結(jié)抓谴,以便實現(xiàn)對task的資源管理與控制暮蹂。一個task可加入到樹狀結(jié)構(gòu)上的一個cgroup寞缝,由此cgroup來限制該task的資源使用。其中仰泻,cgroup與task是多對多(N:N)的連結(jié)關(guān)系荆陆。亦即,一個cgroup可以連結(jié)到多個task集侯。而一個task也可連結(jié)到多個cgroup被啼,但是在一個樹狀結(jié)構(gòu)里只能加入一個cgroup。例如浅悉,針對一個(容器)進程趟据,先創(chuàng)建名為“cpuset”的cgroup,然后將一個進程(/mytask)的PID寫入/sys/fs/cgroup/cpuset/ tasks 文件里术健,就把這個mytask加入到該cgroup了汹碱。如下圖:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/D4/wKiom1TpsHTBnM0nAAE24SmaStk542.jpg" title="dc-pic-009.png" alt="wKiom1TpsHTBnM0nAAE24SmaStk542.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-7、cgroup與task的N:N連結(jié)關(guān)系
這個mytask連結(jié)到兩個cgroup:即“cpuset”和“ioset”荞估,各連結(jié)到一個subsystem(即CPU和I/O資源)咳促。
7、****認識Docker園丁(Runtime)
剛才說明了勘伺,我們在運輸(ship)或移植一個Docker集裝箱時跪腹,就像移植一棵樹一樣, 但是移植樹的種子(seed)到另一個花園(平臺)里飞醉,重新打造出一樣的(identical)環(huán)境(花盆)并重新長出一樣的樹冲茸。例如,一個dockerfile就是種子缅帘,體積很小轴术,運輸快速。如下圖:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/59/D4/wKiom1Tpsujj_MwQAAESaE06H8Q505.jpg" title="dc-pic-010.png" alt="wKiom1Tpsujj_MwQAAESaE06H8Q505.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-8钦无、以樹來比喻Docker集裝箱的運輸
那么逗栽,我們在電腦上,需要有位園丁來打造花盆失暂、準備資源(如水彼宠、泥土)等工作。這位園丁就是:Docker Runtime弟塞。它是由三個模塊所組成凭峡,包括:Docker Server、Docker Engine和Docker Daemon三部分决记。通常摧冀,人們是透過Docker Client來與Docker Server建立通信(兩者是C/S架構(gòu))。例如,我們可以將docker build命令傳送給Docker Server來依據(jù)指定的dockerfile來創(chuàng)建一個Docker鏡像按价。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/D4/wKiom1TpsjOxFqxRAACsouvXYsI299.jpg" title="dc-pic-011.png" alt="wKiom1TpsjOxFqxRAACsouvXYsI299.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-9、Docker Runtime的結(jié)構(gòu)
Docker Server接受DockerClient所傳送來的請求笙瑟,然后轉(zhuǎn)給Docker Engine去轉(zhuǎn)換出一連串的工作(job)來管理集裝箱楼镐。例如,向Docker Registry獲取鏡像往枷、通過GraphDriver執(zhí)行集裝箱鏡像的建立框产、通過NetworkDriver執(zhí)行容器網(wǎng)絡環(huán)境的配置、通過ExecDriver執(zhí)行集裝箱內(nèi)部的軟件等错洁。
8秉宿、****認識Docker集裝箱集散地(Hub)
Docker公司不僅僅提供上述的Docker園丁來幫你搬運集裝箱,還提供DockerHub來做為集裝箱的共享平臺屯碴。Docker公司提供的開放平臺描睦,主要包括:
** *****Platform = Docker Engine + Docker Hub + APIs + Ecosystem*
如下圖:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/D0/wKioL1TptKKQ8Jx2AAEKzs0aFXE066.jpg" title="dc-pic-012.png" alt="wKioL1TptKKQ8Jx2AAEKzs0aFXE066.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-10、<Docker Engine + Docker Hub>開放性平臺
我們在開發(fā)平臺上导而,使用Docker引擎來將App打包到集裝箱里忱叭,然后透過DockerHub API來將集裝箱(的鏡像)放到DockerHub上。于是今艺,Docker Hub成為一個集裝箱集散地韵丑,也就是一個共享的集裝箱平臺。需要時虚缎,可從這Hub尋找到集裝箱撵彻,并下載到云服務平臺(如阿里云或Google云)上去運行。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/D4/wKiom1Tps7Cz34zAAAD7GUvjJ1o035.jpg" title="dc-pic-013.png" alt="wKiom1Tps7Cz34zAAAD7GUvjJ1o035.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-11实牡、Docker Hub集裝箱共享平臺
所以陌僵,Docker Engine和Docker Hub兩者聯(lián)手,為開發(fā)者和系統(tǒng)管理員設計出一個易于發(fā)布和運行分布式App的開放性平臺铲掐。
9拾弃、****闡述<集裝箱>幕后的架構(gòu)設計思維
9.1 ******序中有亂
前面,介紹過了臺灣長榮海運公司繁榮發(fā)達的歷史經(jīng)驗摆霉,可讓你體會出集裝箱如何帶來巨大經(jīng)濟價值豪椿。集裝箱的外表簡單有序、能疊得很高携栋、而且井然有序搭盾;集裝箱的內(nèi)部是空的,用來容納多樣化而繁雜的物品婉支;這種情形稱為:序中有亂(變化)鸯隅。序中有亂的巨大威力,改變了整個運輸產(chǎn)業(yè),也改變了人們的生活蝌以。
俗語說:科學家從亂中找序炕舵,而設計師(藝術(shù)家)則規(guī)劃序中有亂。無論是「亂中有序」或「序中有亂」跟畅,兩者都要呈現(xiàn)出序(order)咽筋,并包容亂(change),只是手段不同而已徊件。兩種手段都能帶來巨大經(jīng)濟價值奸攻,精通這兩種手藝,是當今需求碎片化時代哩虱痕,將云平臺上的微服務(micro-service)迅速創(chuàng)新組合成為App的不二法門睹耐。序中有亂的<亂>是變化、成長與繁榮之意部翘。
「亂中有序」與「序中有亂」兩者之間硝训,只是人們抽象視角(viewpoint)的不同心智(mental)呈現(xiàn)而已,并外在世界的真實事物(和景像)略就。就像大家孰悉的「橫看成嶺側(cè)成峰捎迫,遠近高低各不同」詩句里,因為視角不同而呈現(xiàn)于內(nèi)心的不同景像表牢。例如窄绒,臺北101大樓的鋼骨結(jié)構(gòu),可從「序中有亂」視角來看它崔兴;也可以從「亂中有序」來看它彰导。再如,一盆看來很漂亮的楓葉敲茄,既可從「序中有亂」視角來看它位谋;也可以從「亂中有序」來看它。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/59/D0/wKioL1TptNHiJc5rAAFxFHj754M560.jpg" title="dc-pic-014.png" alt="wKioL1TptNHiJc5rAAFxFHj754M560.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-12堰燎、「亂中有序」還是「序中有亂」呢?
其實掏父,中文字的<易>,并不代表簡單(easy)秆剪;而是代表變化(change)之意赊淑。當我們找到一種容器(container),來包裝變化仅讽,就得到簡單了陶缺。因此,「容易」兩個字組合在一起洁灵,才代表簡單(easy or simple)之意饱岸。于是,Docker集裝箱以容器來包裝復雜多變,任人們擁有<簡單而容易>的方式來實踐App的維運苫费。它的幕后蘊藏了典型的「序中有亂」架構(gòu)設計思維汤锨。
9.2 ******<******合******>******的設計法則
在我所寫的書籍:《思考軟件、創(chuàng)新設計:A段架構(gòu)師的思考技術(shù)》(北京電子工業(yè)出版社)里百框,我也詳細闡述了集裝箱的設計哲理泥畅,我書中寫道:
「這來自于自然界的造物之道。自然界生物之設計琅翻,其主要限制是:信息的有限性(Information Limitations)。由于這項限制柑贞,一個生物形體的造成方椎,是出自一個概括性的計劃:<單純的造形>。隨著生物的成長钧嘶、與環(huán)境的交互信息越多棠众,逐漸在細節(jié)上修修補補,就發(fā)展出<不同的內(nèi)涵>有决。然后闸拿,基于單純的造形,不斷進行<重復的組合>书幕。例如新荤,漂亮的楓葉林,就是合乎“單純造形台汇、不同內(nèi)涵苛骨、重復組合”三項特性。許多造形相同(且不同細節(jié))的楓葉苟呐,組合出一遍美麗的樹林痒芝。」
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/59/D4/wKiom1Tps9yzy4AMAAC_hKincuU218.jpg" title="dc-pic-015.png" alt="wKiom1Tps9yzy4AMAAC_hKincuU218.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-13牵素、「序中有亂」帶來的美感
「再如人們的手掌的造形也都極為相似严衬,其細節(jié)紋路也各不相同,也滿足上述三項特性笆呆。關(guān)于<信息的有限性>與自然造物法則请琳,在生物學界的探討論文已經(jīng)非常多了,在此就不多敘述了腰奋。在最具爆發(fā)力的工業(yè)設計品中单起,你常常可以發(fā)現(xiàn)其杰作具有其特色:簡單造形劣坊、內(nèi)涵不同嘀倒、無限重復。集裝箱就是典型的單純造形,它兼具了這三項特質(zhì)测蘑。更重要的是灌危,它帶來無比巨大的商業(yè)潛力和商機。舉凡能包容變化之體系碳胳,都有三項共同之特性:
特性1:構(gòu)造簡單——單一元素勇蝙。
特性2:容易組合——簡單的(如線性、樹狀或網(wǎng)狀)組合規(guī)律挨约,呈現(xiàn)出美好的序味混。
特性3:包容變化——集裝箱能裝無限形式之物。
因為單一元素诫惭,簡單組合翁锡,具有極大的包容力和彈性,發(fā)揮<序中有亂>的特質(zhì)夕土,帶來一樣的巨大潛能馆衔,蔚為風潮≡剐澹」
歡迎您有空時角溃,可閱讀我所寫的這本書,并多多賜教篮撑。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/D0/wKioL1TpujTzbuGXAAB_SsWqOQk432.jpg" title="dc-pic-016.png" width="180" height="231" border="0" hspace="0" vspace="0" alt="wKioL1TpujTzbuGXAAB_SsWqOQk432.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none; width: 180px; height: 231px;">
在這本書裡减细,我詳細說明了,如何把變化封裝起來赢笨,凸顯簡單秩序邪财,讓人們因為秩序簡單而令人著迷,因為變化無窮而令人驚嘆它的無限潛能质欲。這就是船運集裝箱树埠、Docker軟件集裝箱等具有革命性威力的來源,就是:和諧而充滿能量嘶伟。
9.******3 ******世界首富:比爾.蓋茲(Bill Gates)也在思考集裝箱
鼎鼎大名的微軟創(chuàng)始人比爾.蓋茲怎憋,在2013年閱讀了上百本書籍,他閱讀之后也做了筆記九昧。頗令人好奇的是绊袋,他第一份閱讀筆記,竟然是有關(guān)于<集裝箱運輸>铸鹰。這本書名是:"The Box******:****How the Shipping Container Made the World Smaller and theWorld Economy Bigger."(By Marc Levinson)
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/59/D4/wKiom1TpuWGQTIJVAAFH89aa89k035.jpg" title="dc-pic-017.png" alt="wKiom1TpuWGQTIJVAAFH89aa89k035.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-14癌别、比爾.蓋茲也在思考集裝箱
如果您有興趣,也可以觀看我的線上視頻課程蹋笼,其中有一個視頻課程(免費)展姐,名稱是:“新一代架構(gòu)師:像Bill Gates一樣_思考集裝箱”躁垛。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/D0/wKioL1TpuoXi6GtWAADUaFf6Tfc794.jpg" title="dc-pic-018.png" width="200" height="163" border="0" hspace="0" vspace="0" alt="wKioL1TpuoXi6GtWAADUaFf6Tfc794.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none; width: 200px; height: 163px;">
在這視頻中,我詳細地闡述了集裝箱的架構(gòu)設計思維。觀看網(wǎng)址:
http://www.cnblogs.com/smartADT。
10贫途、****Docker****潮流下的贏家策略
10.1 ******從Operator視角看Docker集裝箱,掌握商機
集裝箱帶來的商業(yè)利益,其直接受惠是運輸業(yè)者土铺,并不是貨物制造者或應用者。所以集裝箱內(nèi)部的包裝業(yè)板鬓,如紙盒制造業(yè)悲敷、打包工人等;拖車汽車廠俭令、拖車行镀迂、拖車司機;還有造船廠唤蔗、海運公司、碼頭工人等都會迅速蓬勃發(fā)展起來窟赏。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/59/D0/wKioL1TpurLhERMnAAFNc8_6-oc340.jpg" title="dc-pic-019.png" alt="wKioL1TpurLhERMnAAFNc8_6-oc340.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none;">
圖-15妓柜、從Operator視角看集裝箱
同樣地,Docker集裝箱帶來的商業(yè)利益涯穷,直接受惠是軟件管理者或稱維運者(operator)棍掐,例如軟件測試工具業(yè)者、測試人員等拷况。至于大多數(shù)的軟件開發(fā)者(developer)作煌,通常等到Docker集裝箱變得普遍流行起來了,大家才會大大感受到非用它不可了赚瘦。因此粟誓,不論您是身為開發(fā)者,還是維運者起意,都應該站在維運者的視角和立場來感受Docker集裝箱潮流的力量鹰服,以便采取最佳策略,抓住這道力量帶來的巨大商機揽咕。否則您將成為潮流下的后知后覺者悲酷。
10.2 ****采取<組合創(chuàng)新>架構(gòu)設計思維
自從1980年代亲善,面向?qū)ο?object-oriented)軟件技術(shù)流行以來设易,架構(gòu)設計有兩個基本技藝:分類(classification)與組合(composition)。逐漸地衍生了以下兩種不同的架構(gòu)設計思維:
古典抽象思維:偏于「亂中有序」蛹头,從復雜變化中分析出次序顿肺;其追求共通性戏溺。
創(chuàng)新組合思維:偏于「序中有亂」,力求設計出次序來容納復雜變化挟冠;其追求獨特性于购。這種思維,最常見的比喻是“集裝箱”知染,因為從集裝箱的發(fā)展歷史肋僧,很容易讓我們體會出<序中有亂>如何帶來巨大經(jīng)濟價值。
如今控淡,在這需求碎片化時代里嫌吠,Docker集裝箱將成為打包微服務(micro-service)的最佳載體。于是掺炭,我們將需要有創(chuàng)造的架構(gòu)來將云端的微服務辫诅,組合形為具有獨特性的App了。于是涧狮,需要有<組合創(chuàng)新>的架構(gòu)設計思維炕矮。就像飛機設計師一般,其把一群各自<不會飛>的模塊(如輪胎者冤、引擎肤视、機翼、機尾涉枫、油箱等)邢滑,以創(chuàng)新的模式將它們組合起來,竟然整體就<能飛>上天空了愿汰。
10.3 ****掌握接口(interface)困后,擁有話語權(quán)
集裝箱就是基于「序中有亂」思維衬廷,把復雜多變(的內(nèi)容)包裝起來摇予,呈現(xiàn)出簡單易用的序。這個序呈現(xiàn)出來吗跋,就是集裝箱的接口了趾盐。同樣地,Docker集裝箱也定義了一群標準的接口小腊。
然而救鲤,軟件產(chǎn)業(yè)是一個強龍與地頭蛇混雜的叢林世界。大哥(強龍)訂定接口為標準秩冈,小弟(地頭蛇)遵循標準接口本缠。唯有掌握接口制定權(quán)才能成為強龍,獲得話語權(quán)入问,成為最大獲利者丹锹。例如稀颁,Docker就是基于標準的LXC容器(也是集裝箱)而在制定自己的接口,成為產(chǎn)業(yè)新標準接口楣黍,而建立其強龍地位匾灶。
同樣地,在Docker集裝箱的潮流下租漂,將涌現(xiàn)更多的小集裝箱和接口阶女,也將涌現(xiàn)較大的集裝箱和接口。于是強龍?zhí)幪幱辛ㄖ危@利無窮時秃踩。如果您有興趣,也可以觀看我的線上視頻課程业筏,名稱是:<<
<<接口設計方法>>憔杨,請點擊下圖:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/71/6E/wKiom1XPRpjCUy8MAAEXMGLFooo535.jpg" title="Interface-Logo.png" width="300" height="190" border="0" hspace="0" vspace="0" alt="wKiom1XPRpjCUy8MAAEXMGLFooo535.jpg" onabort="" onblur="" onchange="" onclick="" ondblclick="" onerror="" onfocus="" onkeydown="" onkeypress="" onkeyup="" onmousedown="" onmousemove="" onmouseout="" onmouseover="" onmouseup="" onreset="" onresize="" onselect="" onsubmit="" onunload="" style="padding: 0px; margin: 0px; vertical-align: top; border: none; width: 300px; height: 190px;">
ee ee
高煥堂的相關(guān)文章:
A02、Docker:從容<器>到集裝箱設計之<道>
B01蒜胖、Android和Docker的一致架構(gòu)設計(1):追求今天決策的未來性
B02消别、Android和Docker的一致架構(gòu)設計(2):包裝集裝箱的通信協(xié)議
B03、Android和Docker的一致架構(gòu)設計(3):建立企業(yè)主的<核心集裝箱>
B04台谢、Android和Docker的一致架構(gòu)設計(4):<分合自如>的設計模式
~ End ~