在過去一年,行業(yè)和用戶對Docker(既是一項技術又是一家公司)的認識大有提升。可以這么說,它是我在職業(yè)生涯中見過的發(fā)展最迅猛的技術,采用速度之快前所未有。
這項技術在一些重要企業(yè)已得到了采用,并得到了包括微軟和谷歌在內(nèi)的各大軟件廠商的認可。這家公司獲得了大筆資金,不惜投入巨額,通過研發(fā)來提高該技術的易用性,包括改進網(wǎng)絡功能。2014年,Docker甚至投入了相當大的精力,打造正規(guī)的合作伙伴體系。
我所在公司Flux7是Docker的創(chuàng)始合作伙伴之一。之所以選擇我們公司作為合作伙伴,是因為我們在將Docker實施到幾個關鍵使用場合方面有著早期經(jīng)驗。
本文著重介紹了我認為的最佳使用場合,它們都基于第一手經(jīng)驗和反復試驗。
Docker的主要好處
Docker提供了輕量級虛擬化技術,而開銷幾乎為零。這因此帶來了一些頗有影響力的優(yōu)點。
首先,你可以得益于Docker提供的額外一層抽象機制,沒必要為開銷而操心。下一大優(yōu)點在于,你在單單一個機器上運行的容器數(shù)量比光借助虛擬化技術要多得多。
另一大影響就是,容器的構建和拆卸可以在短短幾秒內(nèi)完成。Docker常見問題解答(FAQ)全面介紹了Docker為傳統(tǒng)容器增添的特性。
總之,Docker功能分為這幾大類:
將應用程序便攜式部署成單一對象,而不是進程沙箱;
以應用程序為中心,而不是以機器/服務器為中心;
支持容器自動化構建;
內(nèi)置版本控制功能;
可重復使用的組件;
共享容器的公共注冊中心;以及
借助已發(fā)布的API,建立日益龐大的工具生態(tài)系統(tǒng)。
在我看來,真正讓Docker與眾不同的特點在于分層文件系統(tǒng)以及將版本控制應用到整批容器的功能。能夠跟蹤、恢復和查看變更的好處眾所周知;總的來說,這也是軟件開發(fā)方面一項備受歡迎、廣泛使用的特性。Docker將同樣這個概念擴展到了更高層面;整個應用程序及其所有依賴項都在單單一個環(huán)境中,這是前所未有的。
Docker的主要使用場合
下面僅僅是幾個使用場合,它們借助Docker這項支持性技術提供了一致的環(huán)境,而開銷很小。
1. 簡化配置
Docker倡導的主要使用場合是簡化配置。虛擬機的一大優(yōu)點在于,能夠在你的基礎設施上運行任何平臺,虛擬機有自己的配置。
Docker提供了同樣這項功能,卻沒有虛擬機的開銷。它讓你可以將環(huán)境和配置放入到代碼中加以部署。同樣的Docker配置還可以用在各種環(huán)境中。這將基礎設施需求與應用程序環(huán)境分離開來。
可以自由地在多個IaaS/PaaS上運行應用程序,又不需要任何的額外改動,這是Docker可以幫助你實現(xiàn)的終極目標。
如今,從亞馬遜到谷歌,每家IaaS/PaaS提供商都支持Docker。知名廠商紛紛看好Docker?,F(xiàn)在,輪到你得益于同樣這些選擇了。
2. 代碼流水線管理
前一種使用場合給代碼流水線管理帶來了重大影響。隨著代碼從開發(fā)人員的機器進入到生產(chǎn)環(huán)境,它在一路中要經(jīng)歷許多不同的環(huán)境。這每一個環(huán)境會略有差異。
從開發(fā)環(huán)境直到生產(chǎn)環(huán)境,Docker為應用程序提供了始終一致的環(huán)境,因而簡化了代碼開發(fā)和部署流水線。
Docker映像不可改變的特性以及易于構建,可以幫助你實現(xiàn)從開發(fā)環(huán)境直到生產(chǎn)環(huán)境,應用程序的運行環(huán)境都不發(fā)生變化。
3. 提高開發(fā)人員的生產(chǎn)力
這進而讓Docker為提高開發(fā)人員的生產(chǎn)力這個使用場合帶來了一些額外優(yōu)勢。想了解詳細的例子,你可以參閱我在DockerCon 2014大會上的演講。
在開發(fā)環(huán)境中,我們有兩個彼此沖突的目標:
我們希望盡可能接近生產(chǎn)環(huán)境;以及
我們希望開發(fā)環(huán)境盡可能快速,以便交互式使用。
理想情況下,想實現(xiàn)第一個目標,我們就需要每個服務都在自己的虛擬機上運行,體現(xiàn)生產(chǎn)環(huán)境的應用程序是如何運行的。然而,我們又不想每當需要編譯時總是需要互聯(lián)網(wǎng)連接,總是添加遠程工作帶來的開銷。
這時候,開銷很低的Docker派得上用場。開發(fā)環(huán)境的內(nèi)存容量通常很低;由于并不增加內(nèi)存占用空間(使用虛擬機通常會增加內(nèi)存占用空間),Docker可以輕松讓幾十個服務運行。
想實現(xiàn)第二個目標,為了提供快速反饋回路,我們使用Docker的共享卷,從容器的主機操作系統(tǒng)――這是虛擬設備虛擬機(通常是Vagrant設備),將應用程序代碼提供給一個或多個容器。應用程序源代碼則使用Vagrant的與主機操作系統(tǒng)(Windows、Mac或Linux)同步的文件夾,提供給容器主機操作系統(tǒng)(Vagrant設備)。
這種方法有諸多好處。開發(fā)人員可以從他所選擇的平臺(Windows、Mac或Linux)編輯源代碼,還能夠立即查看變化,因為運行的應用程序使用同樣的源代碼,運行環(huán)境則在使用一個或多個Docker容器的Vagrant設備里面設置。
此外,這種方法可以幫助不是非常了解后端細節(jié)的前端工程師輕松使用全面的應用程序架構,致力于他感興趣的方面,不需要操心設置或安裝方面的煩心事。另外,它提供了一種機會,可以進一步探究后端系統(tǒng)在底層是如何工作的,以便更深入地了解整個架構。
不妨更深入地細述這種方法。我們談論的Vagrant設備可能是普通的操作系統(tǒng)發(fā)行版,它通過Vagrant文件(Vagrantfile)加以全面配置。或者,它也可能是一個定制設備,在某種程度上進行了預先配置,然后我們在需要Vagrant時,可以使用Vagrant文件加以進一步配置。
如果你希望不依賴網(wǎng)絡,構建一切都已預先配置好的定制設備是條出路。這種方法的唯一缺點是,虛擬機設備很龐大,而且環(huán)境未更新過。
你想實現(xiàn)第一個目標(盡量縮小開發(fā)和生產(chǎn)的不一致)時需要考慮的另外一點是,制定一項策略來進行數(shù)據(jù)庫轉儲,那樣應用程序的各個部分都面面俱到。這就好比我們在測試覆蓋方面力爭實現(xiàn)的。僅僅獲得隨機性子集并不是最佳解決辦法。你需要一項策略,與你應用程序的所有相關特性相一致。
如果你可以獲得完整的數(shù)據(jù)庫轉儲,那也是一條出路。但在大數(shù)據(jù)盛行的當下,你幾乎做不到這一點。你需要一個子集來處理或測試。
4. 應用程序隔離
可能有諸多原因讓你到頭來在同一個機器上運行多個應用程序。前面提到的提高開發(fā)人員的生產(chǎn)力就是這樣一個例子。不過也有其他的使用場合。
值得考慮的幾個此類使用場合包括:合并服務器以降低成本,或者逐步計劃將整塊式應用程序劃分成幾個分離的部分。
比如說,假設你需要運行兩臺REST API服務器,它們都使用flask框架。但每一臺服務器使用版本略有不同的flash及其他此類依賴項。在不同的容器下運行這些API服務器提供了一種簡單的出路,可以克服所謂的“依賴性地獄”(dependency hell)。
5. 服務器合并
就像使用虛擬機來合并多個應用程序一樣,Docker的應用程序隔離功能可以合并多臺服務器,以節(jié)省成本。然而,由于沒有多個操作系統(tǒng)的內(nèi)存占用空間,又能夠在諸實例之間共享閑置未用的內(nèi)存,Docker提供的服務器合并效果比借助虛擬機所能實現(xiàn)的好得多。
新一代靈活定制的平臺即服務(PaaS,比如Heroku、Elastic Beanstalk和App Engine)都使用容器的這些強大功能,現(xiàn)在有了Docker,這些功能觸手可及。
此外,Deis、Kubernetes、Cadvisor、Panamax及其他開源項目使得部署和監(jiān)控代表多層應用程序架構的大量容器易于管理。
6. 調(diào)試功能
Docker提供了未必是容器所特有的許多工具,但是它們與容器概念很搭。它們還提供了極其有用的功能。這包括:能夠檢查容器和容器版本,另外還能讓兩個容器有所不同。這在修復應用程序時大有用處。
Flux7.com就在Docker容器里面運行。我們的Web開發(fā)人員告訴我們,一次崩潰的根源是他從用戶界面推送到functions.php文件的代碼變更。我在短短一分鐘內(nèi)建立起了開發(fā)環(huán)境,讓這位Web開發(fā)人員能夠在沙箱里面進行調(diào)試。他稍后對我們表示一切OK后,我們就能切換回到網(wǎng)站的最新版本,這要歸功于Docker和Linux容器。
雖然這個過程可以使用另一種策略來解決,但是使用Docker卻是解決這個問題的一種高效方法。另外,它也是我們實施在前端功能至關重要的許多客戶部署環(huán)境的一種方法。
7. 多租戶模式
不過Docker另一種值得關注的使用場合是,它可以用在多租戶應用程序中,因而避免了對應用程序進行重大改寫。
我們自身的例子就是,為一款物聯(lián)網(wǎng)應用程序開發(fā)便捷的多租戶架構。這種多租戶應用程序的代碼庫要復雜得多,缺乏靈活性,難以處理。重新設計應用程序的架構不僅耗費時間,還耗費大量錢財。
使用Docker,就很容易為每個用戶建立用來運行應用程序層多個實例的隔離環(huán)境,而且成本低廉。這之所以有可能,是由于Docker環(huán)境可以迅速構建,另外由于易于使用的API,我們可以使用這些API,通過編程來啟動容器。我們使用了docker-py,這個Python庫有助于通過Web應用程序界面,與Docker守護程序進行交互。
8. 快速部署
在虛擬機出現(xiàn)之前,配置新的硬件資源需要數(shù)天。虛擬化將這個時間縮短到了幾分鐘。Docker更是縮短到了短短幾秒鐘,因為它只需要為這個過程創(chuàng)建容器,并不啟動操作系統(tǒng)。正是這項支持性技術,促使谷歌和Facebook使用容器。
實際上,你可以在數(shù)據(jù)中心里面創(chuàng)建和銷毀資源,不用操心再次構建所需的成本。由于數(shù)據(jù)中心的利用率通常只在30%左右,很容易使用更積極地分配資源的方法,提高這個數(shù)字。另外,配置新實例的成本很低,允許更積極大膽地分配資源。
此外,Docker映像不可改變的特性讓你吃下了定心丸:一切都將完全以之前的方式正常運行。
結束語
還有更多的使用場合表明Docker是一種合適的解決方案,包括從確保安全到助力開發(fā)人員,不一而足。本文著重介紹了我們認為給實際項目增添重大價值的使用場合。
從運行API服務器和Web應用程序,到運行采用計算統(tǒng)一設備架構(CUDA)的應用程序和功能完備的高清桌面云可視化(High Definition Desktop Cloud Visualization)――你可以從運行中的容器里面使用GPU,Docker提供了一系列廣泛的使用場合。Docker讓Linux容器化技術易于訪問和易于使用,而且更重要的是,讓這項技術易于管理。
對我們來說,使用Docker的動機總是在于使用適合某個項目的工具。最值得關注的方面在于業(yè)務理由,然后我們根據(jù)業(yè)務理由來構建系統(tǒng)。
歡迎留言交流。