1. 程式人生 > >Docker最大化實際專案價值的八個應用場景

Docker最大化實際專案價值的八個應用場景

在過去一年,行業和使用者對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的動機總是在於使用適合某個專案的工具。最值得關注的方面在於業務理由,然後我們根據業務理由來構建系統。

編譯者:布加迪