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