容器時(shí)代,這確實(shí)是我們想要的未來(lái)!
由于上一篇《容器時(shí)代,難道這就是我們想要的未來(lái)》反響強(qiáng)烈,CircleCI的創(chuàng)始人Paul Biggar再次出山寫了此文章。此文同樣知識(shí)點(diǎn)非常很多,文字犀利,可以看出Paul Biggar是對(duì)于軟件行業(yè)有深刻理解的人物。每個(gè)人對(duì)于容器生態(tài)圈或者Docker的看法有不同,希望從文章中讀者能與Paul有些共鳴。
上周我寫It’s The Future,諷刺了容器生態(tài)系統(tǒng),順帶輕嘲諷下 Docker、Google、CoreOS和一堆其他技術(shù)。很多 Docker愛(ài)好者享受容器生態(tài)系統(tǒng)成為笑柄,但這篇文章也被很多人所喜愛(ài)而同樣分享這篇文章的很多人叫囂著“我告訴你,這一切都是胡說(shuō)八道”。
正是我的這種諷刺方式很輕易的使人們可能認(rèn)為容器生態(tài)系統(tǒng)是胡說(shuō)八道。畢竟,輕輕一瞥很難理解Docker是什么 。這是集裝箱,也就是像虛擬化,但并不完全是虛擬化。它有一個(gè)有點(diǎn)像Chef的Dockerfile,但它與一個(gè)涉及到無(wú)法理解的文件系統(tǒng)或其他一些所謂層的東西相結(jié)合。它和AWS、Heroku、VMware和Vagrant的目的一樣解決了類似的問(wèn)題,但在每種情況下,它的方式會(huì)和起初認(rèn)知的總會(huì)略有不通,也存在真的永遠(yuǎn)搞不清楚它是什么。它有27種競(jìng)品工具,這些工具你不可能說(shuō)出它們是哪些,它們有滑稽的名字如:machine、swarm、flannel、weave、etcd、rkt、kubernetes、compose、flocker。它不知何故和炫酷的微服務(wù)聯(lián)系到了一起,但這是極其愚蠢的想法,當(dāng)考慮到首先保持運(yùn)行一個(gè)單一的服務(wù)它是多么困難。而在這一切之后,它有這種看不懂的態(tài)勢(shì)被盛傳,數(shù)十家創(chuàng)業(yè)公司和大公司都在競(jìng)相擁戴它。
這真的不需要再看看整個(gè) Docker和container相關(guān)的技術(shù),并得出結(jié)論:它就是廢物?
但事實(shí)并非如此。
它實(shí)際上是我們?nèi)绾螛?gòu)建應(yīng)用的未來(lái)。
為什么會(huì)是新動(dòng)力?
為什么會(huì)存在許多兄弟們認(rèn)為It’s The Future是100%準(zhǔn)確,這壓根不是諷刺,他們質(zhì)疑整個(gè)容器的技術(shù)炒作。
Docker和容器生態(tài)系統(tǒng)(以下簡(jiǎn)稱“ Docker”)應(yīng)用程序開發(fā)世界的集大成之作,如虛擬化,面向服務(wù)架構(gòu)和操作系統(tǒng),并與不同的目標(biāo)和利益重新傳遞它們。至于它這樣做,它引起大量的開發(fā)者社區(qū)的洗牌:守財(cái)奴怕一切的新東西。
軟件產(chǎn)業(yè),正如你所期望的,絕對(duì)是擠滿了憎惡進(jìn)步的人。有這么一群人,他們會(huì)走進(jìn)米開朗基羅建成的西斯廷教堂宣布他們已經(jīng)有了神的***圖片,他們更喜歡自己的天花板是白色的,而且壁畫不是很酷的呢。
與此同時(shí),大部分的軟件產(chǎn)業(yè)做出決策,像一個(gè)高中少年:他們癡迷處處觀察在他們的朋黨哪些是酷的,他們也許看看Instagram的和Facebook的內(nèi)容,然后盲從他們所***的技術(shù)。圍繞這些技術(shù),它們構(gòu)成幫派,甚至圍繞技術(shù)生態(tài)雕刻自己的身份,他們不斷適應(yīng),他們甚至在自己的筆記本電腦上蓋上他們的幫派色彩,并且討厭和抱怨那些陌生或者另類的技術(shù)。
正如世界之水Docker:做著幾乎一切事情的新途徑。它扔掉有關(guān)操作系統(tǒng)、部署、OPS、打包、防火墻、PaaSes和一切舊的規(guī)則。一些開發(fā)人員立刻愛(ài)上它,有時(shí)正當(dāng)?shù)睦碛桑缒芙鉀Q的問(wèn)題,有時(shí)是因?yàn)樗且粋€(gè)閃亮的玩具,在其他孩子得到之前,它使他們變得炫酷。其他開發(fā)者恨它,它純粹的炒作,他們說(shuō):它只是像以前來(lái)了新技術(shù)一樣,我不明白為什么每個(gè)人都在談?wù)撨@件技術(shù),他們說(shuō),通常的原因是,比理性更感性的。
鑒于Docker基于該技術(shù)本身不是必須的。大多的討厭者是不是真的反應(yīng)基于Docker解決方案的重要和復(fù)雜問(wèn)題。大多數(shù)情況下,如果你沒(méi)有花時(shí)間擴(kuò)展系統(tǒng),你可能沒(méi)有注意到那些問(wèn)題。如果不直觀和深刻領(lǐng)會(huì)什么叫“黃牛不是寵物”,這確實(shí)很重要,那么你在選擇很多由Docker和其相關(guān)工具會(huì)顯得怪異和可怕。
合并世界
Docker正出于兩個(gè)學(xué)科合并點(diǎn):Web應(yīng)用和分布式系統(tǒng)。在過(guò)去的十年中,我們所處的網(wǎng)絡(luò)社區(qū)被大大假裝成基本上都被我們可以通過(guò)了解如何編寫代碼構(gòu)建Web應(yīng)用程序。我們寫一些HTML、JavaScript、Rails并且我們有一個(gè)網(wǎng)站。我們?cè)黾恿艘恍ゝorms、handlers,也許再加一個(gè)API,我們就大功告成了:這足夠推出的一款產(chǎn)品,能夠獲得投資、客戶和收入,可以改變世界!
同時(shí),在過(guò)去的二十年中,分布式系統(tǒng)的那些人脈一直在做一些很無(wú)聊的破事。他們已經(jīng)實(shí)驗(yàn)過(guò)像CORBA和SOAP復(fù)雜的協(xié)議,并學(xué)會(huì)如何解決問(wèn)題,如CAP定理,以及證明為何時(shí)鐘同步是不可能的,而這兩大問(wèn)題,以主要理論為居多。而這些問(wèn)題及其解決方案對(duì)于只是試圖拿用它來(lái)運(yùn)送web應(yīng)用程序的知識(shí)后續(xù)自己可以如何編寫的那些人是無(wú)趣的。
但隨后有趣的事情發(fā)生了。Web應(yīng)用程序變得足夠大,他們開始需要擴(kuò)展。供多人訪問(wèn)該Web應(yīng)用程序在一個(gè)VPS上再也呆不住,或者只是進(jìn)行垂直擴(kuò)展。當(dāng)我們開始擴(kuò)展,我們開始看到所有這些BUG在我們的應(yīng)用中,存在有趣名字的漏洞,如“race conditions”、“network partitions”、“deadlock“和“Byzantine failures”。這些都是分布式系統(tǒng)兄弟們一直在努力一段時(shí)間去解決的問(wèn)題,這些問(wèn)題的解決方案不僅是困難,但在許多情況下,從理論上來(lái)說(shuō)是不可能被解決的。
早年這種可擴(kuò)展性的危機(jī),隨著Heroku的出現(xiàn)。況且Heroku讓橫向擴(kuò)展基礎(chǔ)設(shè)施變得容易了,使我們能夠再次假裝我們真的只是進(jìn)行簡(jiǎn)單的Web應(yīng)用程序。我們收買了自己內(nèi)心,作為一個(gè)行業(yè),也許是5年假裝和自欺欺人。
我們現(xiàn)在打破自欺欺人的限制,就如我們從這個(gè)困局出來(lái)吧,我們發(fā)現(xiàn)自己試圖在早期建立可擴(kuò)展性,并重新這些破事做設(shè)計(jì),使他們能夠擴(kuò)展,并了解整體架構(gòu)的缺點(diǎn)正如為什么用一個(gè)單一的數(shù)據(jù)庫(kù)是沒(méi)有辦法不停為我們工作。我們拿出像永恒建筑的短語(yǔ),“寵物VS牛”,微服務(wù),以及一整套的***和最差的實(shí)踐方案使得這些事顯得更容易。
在這一點(diǎn)上,這個(gè)轉(zhuǎn)變過(guò)程中,Docker的到來(lái),試圖解決很多問(wèn)題。但是,而不是告訴我們,我們可以假裝擴(kuò)展的問(wèn)題不存在,我們可以以基本同樣的方式繼續(xù)做事情,像Heroku的那樣,Docker告訴我們,分布式系統(tǒng)基本上是我們一直在做,一直以來(lái),我們需要接受它,并一開始就在這個(gè)模型內(nèi)進(jìn)行編碼。代替處理像web框架,數(shù)據(jù)庫(kù)和操作系統(tǒng)簡(jiǎn)單的事情,我們現(xiàn)在看到類似Swarm、Weave、 Kubernetes 、etcd這類工具,這些工具不會(huì)假裝一切都會(huì)變得簡(jiǎn)單,而實(shí)際上要求我們加緊我們研究,不單單是解決問(wèn)題,而是要深刻理解,那些我們正在解決的問(wèn)題。
有利的一面是,我們獲得了建立可擴(kuò)展架構(gòu)的能力使得我們不會(huì)假裝我們可以想象它并不存在?,F(xiàn)在,我們需要知道什么是network partition,如何處理它,如何在一個(gè)AP和一個(gè)CP系統(tǒng)作出選擇,以及如何構(gòu)建架構(gòu):在實(shí)際惡劣的網(wǎng)絡(luò)和機(jī)器下進(jìn)行擴(kuò)展。有時(shí)有雷電天氣在弗吉尼亞州,有時(shí)候遇到了著火,有時(shí)鯊魚咬傷海底電纜,有時(shí)還有延遲,遞送失敗的情況,機(jī)器掛了和內(nèi)存泄漏。
一切都需要更加有彈性,更加可靠,而且我們需要承認(rèn),這些都是我們需要考慮的是開發(fā)應(yīng)用程序的一部分。而我們需要做的,不是因?yàn)樗慕k麗,或者因?yàn)樗囊恍┥裨挵愕?**實(shí)踐,而是因?yàn)橄馎mazon、Netflix、Google 已經(jīng)把15年的汗水和鮮血和行業(yè)經(jīng)驗(yàn)融入工作的人們把這些問(wèn)題克服了,告訴我們?nèi)绾卧谡嬲卮笠?guī)模構(gòu)建系統(tǒng)。
#p#
解決了實(shí)際問(wèn)題
那么究竟是Docker為我們解決什么呢?我們正在做構(gòu)建Web應(yīng)用程序的一切是非常脆弱的,Docker是迫使這些變得合理化:
- 迄今為止,我們單獨(dú)地部署應(yīng)用程序(dev的一部分)在服務(wù)器(DevOps中ops那部分)上。而且,我們甚至有兩個(gè)不同的團(tuán)隊(duì)管理這些應(yīng)用程序棧。這樣做是可笑的,因?yàn)閼?yīng)用程序依賴于機(jī)器和操作系統(tǒng)就如代碼一樣,并把它們分開考慮是沒(méi)有意義的。集裝箱會(huì)統(tǒng)一操作系統(tǒng)和應(yīng)用程序在開發(fā)工具包中。
- 迄今為止,我們已經(jīng)運(yùn)行我們的面向服務(wù)架構(gòu)在AWS 、Heroku、其他IaaSes和PaaSes ,它們?nèi)狈θ魏魏侠淼墓ぞ呷ミw移和管理面向服務(wù)架構(gòu)。 Kubernetes和Swarm可以管理和協(xié)調(diào)這些服務(wù)。
- 迄今為止,我們已經(jīng)使用了整個(gè)操作系統(tǒng)部署我們的應(yīng)用程序,它們帶來(lái)所有保障,而不是我們可以部署在最小化上。容器允許你暴露一個(gè)很小的僅需要端口的應(yīng)用,甚至可以小到一個(gè)簡(jiǎn)單的靜態(tài)二進(jìn)制。
- 迄今為止,我們一直在擺弄機(jī)器,已確保它們是否是活著的,使用“配置管理”工具或者重新部署多次應(yīng)用程序在同一臺(tái)機(jī)器。由于容器可伸縮了業(yè)務(wù)流程框架,只有不變的鏡像被啟動(dòng)且運(yùn)行的機(jī)器都不會(huì)被重用,這樣消除潛在的故障點(diǎn)。
- 迄今為止,隨著像Rails的面向服務(wù)架構(gòu)的路由規(guī)則的出現(xiàn),我們使用的語(yǔ)言和框架,它們很大程度上被設(shè)計(jì)成單機(jī)單應(yīng)用運(yùn)行了。現(xiàn)在Kubernetes和Compose允許你指定跨服務(wù)的拓?fù)浣Y(jié)構(gòu)。
- 迄今為止,我們已經(jīng)AWS給定的服務(wù)器配置搭配中部署重度依賴虛擬化服務(wù)。“我想要的是0.1個(gè)CPU和200MB的RAM服務(wù)器”,這個(gè)是不可能的。我們已經(jīng)浪費(fèi)了遠(yuǎn)比使用我們應(yīng)用實(shí)際需要的虛擬化開銷。容器可以按更小的配置進(jìn)行部署,并做到更好的共享。
- 迄今為止,我們已經(jīng)部署使用多用戶操作系統(tǒng)的應(yīng)用程序和服務(wù)。UNIX建有幾十個(gè)同時(shí)在其上運(yùn)行的用戶,共享的二進(jìn)制文件、數(shù)據(jù)庫(kù)、文件系統(tǒng)和服務(wù)。這是一個(gè)完全不匹配當(dāng)我們構(gòu)建Web服務(wù)我們所做的。此外,容器可以容納只是簡(jiǎn)單的二進(jìn)制文件,而不是整個(gè)操作系統(tǒng),這將導(dǎo)致除了關(guān)于你的應(yīng)用程序或服務(wù)你可以少考慮。
唯一不變的就是變化
我們的行業(yè)不會(huì)等待這些技術(shù)的成熟,才如此迅速去神化令人振奮的新技術(shù)。Docker正在以驚人的速度發(fā)展,同樣這意味著它沒(méi)有接近穩(wěn)定或成熟。我們?cè)谌萜鬟\(yùn)行時(shí)間、鏡像格式、流程控制工具、主機(jī)操作系統(tǒng)有很多種選擇,每個(gè)都有不同程度的用途,范圍,同樣需要扶持和社區(qū)的支持。
環(huán)顧我們行業(yè)發(fā)展,存在很多直到技術(shù)成為老而乏味還沒(méi)有得到穩(wěn)定。舉一個(gè)例子,有多少協(xié)議在我們得到了REST之前死去?我們用之前學(xué)到的教訓(xùn)建立了REST、AJAX、JSON協(xié)議是踩在了SOAP和CORBA的尸體上。這兩個(gè)主要技術(shù)過(guò)渡過(guò)了大約10年的歷程。然而,我們?nèi)匀粵](méi)有得到在十年前有對(duì)SOAP等同的基于REST的API工具,并且尤其是還SOAP沒(méi)有完全死亡。
同樣的故事發(fā)生在前端,而且確實(shí)很多兄弟會(huì)拿前端開發(fā)正在做的蠢事與我的 Docker生態(tài)系統(tǒng)作對(duì)比。自從我們十年前逃離Java,同樣的故事已經(jīng)發(fā)生在各種編程語(yǔ)言中。自始自終,直到問(wèn)題都***解決,開發(fā)者會(huì)不斷拿出新的解決方案。更何況Docker生態(tài)系統(tǒng)有成噸的問(wèn)題需要解決。
因此我們可以預(yù)期 Docker目前是不會(huì)達(dá)到成熟的狀態(tài)。當(dāng)你嘗試的時(shí)候,仍然有許多衍生和奇怪的問(wèn)題需要你去打破,當(dāng)從幾年后我們回首它們,然而一些決定不止是無(wú)法讓人理解,實(shí)際上可能是完全錯(cuò)誤的。***的做法還是要嘗試、失敗,重試、再失敗,直到我們可以靈活運(yùn)用它們。
這將花費(fèi)數(shù)年,我們才能領(lǐng)悟這一切,并讓它平息下來(lái)。但是,這并不意味著容器是廢物,或者說(shuō)我們可以忽略它們。我們總是在過(guò)往我們熟知的技術(shù)與進(jìn)行飛躍,并嘗試新的東西,從教訓(xùn)中學(xué)習(xí)、調(diào)整、迭代,并提高行業(yè)實(shí)力面臨抉擇。
如果你正在找我,我會(huì)在未來(lái)等著你。