什么是 Docker?
關(guān)于 docker 是什么,有個著名的隱喻: 集裝箱 。但是它卻起了個“ 碼頭工人”(docker 的英文翻譯)的名字。這無疑給使用者很多暗示:“快來用吧!用了 docker,就像世界出現(xiàn)了集裝箱,這樣你的業(yè)務(wù)就可以隨意的、無拘無束的運行在任何地方(Docker 公司的口號: Build,Ship,and Run Any App,Anywhere ),于是碼頭工人就基本都可以下崗了。”但是人們往往忽略了一個問題,隱喻的好處是方便人理解一個不容易理解的概念,但并不能解釋其概念本身。
互聯(lián)網(wǎng)技術(shù)行業(yè)的一大特點是,這里的絕大多數(shù)事物并不像現(xiàn)實生活那么具體,在這個行業(yè)中我們所接觸的絕大多數(shù)概念都是抽象的、不具體的。所以現(xiàn)實生活中很多可笑的事情在互聯(lián)網(wǎng)技術(shù)行業(yè)就不僅變的不可笑,反而可能很嚴(yán)肅。就比如,現(xiàn)實生活中你是幾乎不可能看見兩個神經(jīng)正常的成年人爭論到底是錘子更好還是螺絲刀更好這個問題的。而在我們這個行業(yè),你可以很容易的被卷入到底是 java 好?還是 php 好?還是 js 好?或者類似的 語言之爭 中。當(dāng)然除了語言,其它的軟件工具之爭也比比皆是,比如經(jīng)典的還有 vim vs emacs。
由于不具體和抽象,就需要隱喻來給投資人解釋其價值,畢竟投資人大多數(shù)是外行嘛。至于 docker 到底是“集裝箱”還是“碼頭工人”并不重要,即使這兩個概念本質(zhì)上沖突了都不重要,很少有人會去真的思考 集裝箱的出現(xiàn)導(dǎo)致碼頭工人幾乎絕跡 。只要能讓大家明白 docker 是個重要的、有價值的、劃時代的工具,騙到投資人的錢就足夠了。也很少有投資人去考究集裝箱的發(fā)明人到底有沒有因此賺到錢?以及為什么沒賺到錢?只要概念能忽悠人就行了。當(dāng)然這個概念順便也忽悠了所有懶得思考的技術(shù)工程師。
吐了一大段槽之后,回到我們的正題,docker 到底是什么?既然大家喜歡集裝箱這個隱喻,那么我們也不妨先來看看集裝箱的本質(zhì)。大家應(yīng)該基本都理解集裝箱是怎么改變世界的吧?在集裝箱之前,貨物運輸沒有統(tǒng)一的標(biāo)準(zhǔn)方式進行搬運,于是鐵路、公路、海洋等各種運輸之間,需要大量的人力作為貨物中轉(zhuǎn),效率極低,而且成本很高。集裝箱出現(xiàn)之后,世界上絕大多數(shù)的貨物運輸都可以放到這個神奇的箱子里,然后在公路、鐵路、海洋等所有運輸場景下,這個箱子都可以不用變化形態(tài)直接可以承運,而且中間的中轉(zhuǎn)工作,都可以通過大型機械搞定,效率大大提升。從此全球化開始,商業(yè)的潛力被進一步挖掘……牛逼之處我就不多說了,可是這個箱子為什么這么神奇呢?答案其實也就在上面的描述中,無非就是兩個字: 標(biāo)準(zhǔn) 。
是的! 標(biāo)準(zhǔn)!標(biāo)準(zhǔn)!標(biāo)準(zhǔn)! 重要的事情說三遍。
因為規(guī)范了集裝箱的大小和尺寸的規(guī)格標(biāo)準(zhǔn),于是相應(yīng)的船舶、卡車、列車才能按照規(guī)格制造出來使聯(lián)運成為可能,所有的運輸中轉(zhuǎn)的自動化工具才能被設(shè)計建造出來并且高效的使用,才可以極大的提高效率,提升自動化水平,以至于碼頭工人才會失業(yè)。集裝箱本身是一個產(chǎn)品,而這個產(chǎn)品無非就是“標(biāo)準(zhǔn)化”的這個概念穿上了馬甲,馬甲可以有紅的、綠的、藍的、花的,但是大小規(guī)格必須都一樣?,F(xiàn)實世界中的事實顯而易見,就是這么簡單。那么 docker 呢?
按照這個思路,docker 其實跟集裝箱一樣,或者說它想跟集裝箱一樣,成為穿著馬甲的“標(biāo)準(zhǔn)化”。這樣開發(fā)工程師就可以把它們開發(fā)出來的 bug 們放到“集裝箱”里,然后運維人員就可以使用標(biāo)準(zhǔn)化的操作工具去運維這些可愛的 bug 們。于是實現(xiàn)了“海陸聯(lián)運”,就好像運維工程師根本不需要了解其運維的軟件架構(gòu),而開發(fā)工程師也并不需要了解其軟件運行的操作系統(tǒng)一樣……
這就是 docker 的實質(zhì): 穿著馬甲的標(biāo)準(zhǔn)化 。docker 的發(fā)明人根據(jù)自己運維 PaaS 平臺的經(jīng)驗,重新思考了自己的工作, 將PaaS 平臺的 devops 工作從各個角度標(biāo)準(zhǔn)化了一下,將系統(tǒng)底層實現(xiàn)的 cgroup、namespace、aufs|device mapper 等技術(shù)集成在一個使用鏡像方式發(fā)布的工具中,于是形成了 docker 。觀察 docker 形成的思考過程,其實就是作者針對他所運維的場景如何做自動化運維的思考,大家可以參見其演講的 PPT 。這個演講的名字就跟自動化運維相關(guān): Docker: automation for the rest of us 。那么 docker 的實質(zhì)是什么?在我看來就是個針對 PaaS 平臺的自動化運維工具而已。眾所周知(當(dāng)然如果你不知道,那么我來告訴你): 自動化運維的大前提就是標(biāo)準(zhǔn)化 。
如果你正好是一個運維工程師,而且你正感覺你的運維環(huán)境一團糟,麻煩請你思考一下這是為什么?你是不是正在運維著一個使用 php、java、C# 甚至 C/C++ 等用各種語言編寫的應(yīng)用都在運行的環(huán)境里?這個環(huán)境是不是因為某種歷史原因,使你的操作系統(tǒng)運行著各個版本的內(nèi)核,甚至還有 windows?即使是同樣語言編寫的業(yè)務(wù)也運行著不同版本的庫?你的整個系統(tǒng)環(huán)境是不是甚至找不出來兩臺硬件、操作系統(tǒng)、庫版本以及語言版本完全一樣的環(huán)境?于是你每次遇到問題都要去排查到底那個坑到底在那里?從網(wǎng)絡(luò)、內(nèi)核到應(yīng)用邏輯。你每次遇到產(chǎn)品升級都要在各種環(huán)境上做穩(wěn)定性測試,發(fā)現(xiàn)不同的環(huán)境代碼 crash 的原因都不盡相同。你就像一個老中醫(yī)一樣去經(jīng)歷各種疑難雜癥,如果遇到問題能找到原因甚至都是幸運的,絕大多數(shù)情況是解決了但不知道原因,和沒解決自動好了也不知道原因。于是你們在一個特定的公司的環(huán)境中積累著“經(jīng)驗”,成為你們組新手眼中的大神,憑借歷經(jīng)故障養(yǎng)成的條件反射在快速解決不斷發(fā)生的重復(fù)問題,并故弄玄虛的說:這就是工作經(jīng)驗。 因為經(jīng)驗經(jīng)常是搞不清楚原因時的***一個遮羞布 。當(dāng)別人抱怨你們部門效率低的時候,你一般的反應(yīng)是:”you can you up,no can no BB!“
我花了這么多口舌吐槽運維,無非就是想提醒大家” 運維標(biāo)準(zhǔn)化的重要性 “這一顯而不易見的事實。標(biāo)準(zhǔn)化了,才能提高效率。標(biāo)準(zhǔn)化了,才能基于標(biāo)準(zhǔn)建設(shè)屬于你們系統(tǒng)的自動化運維。那么我們再來看看 docker 是怎么做的?
首先, 標(biāo)準(zhǔn)化就要有標(biāo)準(zhǔn)化的文檔規(guī)范 ,要定義系統(tǒng)軟件版本等一系列內(nèi)容。規(guī)范好了之后,大家開始實施。但是在長期運維的過程中,很可能出現(xiàn)隨著系統(tǒng)的發(fā)展,文檔內(nèi)容已經(jīng)過時了,工程師又來不及更新文檔的問題。怎么解決?docker 給出的答案是: 用 dockerfile 。dockerfile 就是你的文檔,并且用來產(chǎn)生鏡像。要改變 docker 鏡像中的環(huán)境,先改 dockerfile,用它產(chǎn)生鏡像就行了,保證文檔和環(huán)境一致。那么現(xiàn)實是,有多少在使用 docker 的人是這樣用的?你們是不是嫌這樣麻煩,于是干脆直接在線 docker commit 產(chǎn)生鏡像,讓文檔跟現(xiàn)場環(huán)境又不符了?或者我還是太理想,因為你們壓根連文檔都沒有?
其次, 標(biāo)準(zhǔn)化要有對應(yīng)用統(tǒng)一操作的方法 。在現(xiàn)實中,即使你用的是 php 開發(fā)的應(yīng)用,啟動的方式都可能不盡相同。有用apache 的,有用 nginx 的,還有用某種不知名 web 容器的,甚至是自己開發(fā) web 容器的。如果操作范圍擴大到包含 java 等其它語言,或數(shù)據(jù)庫等其它服務(wù),那么操作方式更是千奇百怪。雖然 UNIX 操作系統(tǒng)早就對此作了統(tǒng)一的規(guī)范,就是大家常見的把啟動腳本放到 /etc/rc.d 中,SYSV 標(biāo)準(zhǔn)中甚至規(guī)定了啟動腳本該怎么寫,應(yīng)該有哪些方法。但是絕大多數(shù)人不知道,或者知道了也不這么做,他們習(xí)慣用 ./start 作為自己業(yè)務(wù)啟動的唯一標(biāo)準(zhǔn)。甚至 ./ 是哪個目錄可能都記不住。于是 docker 又給出了解決方案:我壓根不管你怎么啟動,你自己愛咋來咋來,我們用 docker start 或 run 作為統(tǒng)一標(biāo)準(zhǔn)。于是 docker start 可以啟動一個 apache、nginx、jvm、mysql 等等。有人病垢 docker 的設(shè)計,質(zhì)疑它為什么設(shè)計上一個容器內(nèi)只給啟動一個進程?這就是原因:人家壓根不是為了給你當(dāng)虛擬機用的,人家是為了給啟動生產(chǎn)環(huán)境的進程做標(biāo)準(zhǔn)化的!
第三, 為了維護生產(chǎn)環(huán)境的一致性和配置變更的冪等,docker 創(chuàng)造性的使用了類似 git 管理代碼的方式對環(huán)境鏡像進行管理 。于是:
你想做庫版本升級嗎?更新個鏡像吧!
你想做 php、java 的版本升級嗎?更新個鏡像吧。
好方便!太爽了!
等等……神馬?你想改變 apache 配置文件中的一個字段?做個新鏡像升級吧!你的 php 代碼寫錯了一行要改個 bug?做個新鏡像升級吧……
在一群人吐血三升之后,于是有人出了個主意。唉,其實后兩種需求沒必要這么麻煩,有一種軟件叫做 puppet、chef、salt、ansible、rsync ……
于是我們要在 docker 中啟動一個 puppet。什么?你要用 ansible?好吧,我們來看看怎么在 docker 中啟動一個 sshd?我有個計劃任務(wù)要跑,起個 crontab 可以么?
你的 docker 是不是就這么變成了“虛擬機”的?
不過請注意:我并不是說 docker 不好,只是你是否真的評估了它標(biāo)準(zhǔn)化的方式是不是適合你的業(yè)務(wù)場景?錘子是用來砸釘子的,但是你非要用它來砸手指,我也沒什么辦法。
作為一個工程師,而且是受過專業(yè)訓(xùn)練的工程師,總是想設(shè)計出一套工具滿足所有場景需求。因為工程師所受的思維訓(xùn)練是:你越是解決了更普遍的問題,你所創(chuàng)造的價值就越大。但是請搞清楚,這個任務(wù)一般是由標(biāo)準(zhǔn)委員會來完成的,每個工程行業(yè)都會有這么個組織來做這件事情。當(dāng)然,不排除商業(yè)公司的產(chǎn)品可以深刻影響標(biāo)準(zhǔn)制定的情況。那么我們這些工程師***的價值是什么?擺正自己的位置,看清自己的問題,幫小組所在的企業(yè)進一步提高效率,提高競爭力。每個企業(yè)都有其歷史和當(dāng)前特點,就運維工作來講,根據(jù)企業(yè)的實際情況找到其標(biāo)準(zhǔn)化的最經(jīng)濟有利方式才是我們這些受聘用的職業(yè)工程師的核心價值。軟件選型要要因地制宜,而不是跟風(fēng)炒作。當(dāng)然,如果你的核心價值是想要站在“技術(shù)前沿”,打算一直***技術(shù)潮流,做一個出沒于各大技術(shù)交流會的新技術(shù)吹牛逼者,并以此抬高自己身價的話,那我的話自然是對你不適用的。(說這話可能會得罪很多人,我要解釋一下:對于那些真誠的想要分享自己技術(shù),希望為社區(qū)發(fā)展做貢獻的人,我是懷著深深的敬意的!謝謝你們!)對待新技術(shù),大多數(shù)工程師的狀態(tài)是:測試是為了上線的,測試出的問題都是要解決的而不是用來評估的,不上線就沒有工作成果。我認(rèn)為工程師對待新技術(shù)應(yīng)有得態(tài)度是:激進的用新技術(shù)新方法來做線下測試,認(rèn)真的總結(jié)評估測試流程和結(jié)果和現(xiàn)有環(huán)境的異同,保守謹(jǐn)慎的評估決策新技術(shù)是否在業(yè)務(wù)上大規(guī)模使用。
docker 是銀彈么?真的能像集裝箱那樣改變世界么?我的看法當(dāng)然不是。即使集裝箱,也不能解決一些特殊的運輸問題,比如大型飛機零部件的運輸,或者小件零散商品的運輸。如果說云計算行業(yè)真的要出現(xiàn)集裝箱的話,那么首先這個行業(yè)要被幾大云計算廠商瓜分完畢,市場成熟之后才有可能。為什么?因為讓一個應(yīng)用可以在任何地方跑的需求,主要應(yīng)該來自云的用戶,他們可能為了穩(wěn)定性考慮既租用了阿某云,又租用了騰訊云(純廣告,自己所在的公司,所以請勿吐槽),還可能為了海外市場還用了某馬遜云。這時用戶會有需求說,我想要這些云的環(huán)境標(biāo)準(zhǔn)一致,以便我的應(yīng)用可以在哪朵云上都能跑(Build,Ship,and Run Any App)。而現(xiàn)在,云計算市場剛剛起步,群雄逐鹿,正是差異化發(fā)展?fàn)帄Z用戶的時候。出了云計算廠商外,其它公司的 IT 環(huán)境都不一樣,標(biāo)準(zhǔn)化要求也就不可能一樣。那么你覺得 docker 這個標(biāo)準(zhǔn)可能適合所有人么?
如果你用過了 docker,并且還覺得它非常合適你的環(huán)境,那么我希望你能回答這幾個問題:
你的 docker 是用 dockerfile 產(chǎn)生的鏡像還是直接 docker commit?
你的 docker 里面跑了多少個進程?
你的 docker 是當(dāng)虛擬機用的么?
那么你用的是 docker 么?
***,送大家一個段子,希望能博你一笑。
工程師:“嘿!有人發(fā)明了一個叫做集裝箱的東西,這東西一定可以使運輸成本大大下降!甚至改變世界!”
用戶:“好興奮!這東西可以運輸我的波音787客機么?“
工程師:“額。。不能整個運,需要拆開再運,因為我們要符合集裝箱的標(biāo)準(zhǔn)……”
用戶:“那這東西可以運輸我的空客380嘛?”
工程師:“額。。我們討論的是同一件事情。”
用戶:“不行是嘛?那不能改造一下集裝箱讓它可以運嘛?”
工程師:“額。。。這不僅僅是我們的問題,要到達運輸目的地還要經(jīng)過鐵路,公路,他們可能也無法……”
用戶:“真的不能改造集裝箱么?可這東西是以后的發(fā)展方向啊!未來的世界都是應(yīng)該是集裝箱運輸?shù)?”
工程師:“額……”
老板:“嗯!這東西說不定真的是未來的發(fā)展方向!我們一定要實現(xiàn)用集裝箱運輸這些飛機!工程師們,你們趕緊去攻克這些技術(shù)難題,早日可以實現(xiàn)我們用戶的特殊需求!讓集裝箱可以達到我們的業(yè)務(wù)要求!快去吧!加油啊!”
工程師:“額……”