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