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