【編者的話】
Docker已經為開發(fā)者和管理員提供一個簡單的平臺來創(chuàng)建和部署可擴展的應用。本篇文章是介紹Docker生態(tài)系統(tǒng)的系列文章的第一篇在這個系列中,作者將探索Docker如何與其他組件整合在一起,并用它們提供的工具集來便捷地提供高可用性的分布式系統(tǒng)。本篇文章不僅從概念上介紹了容器化、服務發(fā)現(xiàn)和全局配置存儲、網絡工具、調度、集群管理和編制這幾部分內容,而且配以清晰易懂的例子進行講解說明,非常贊。
簡介
容器化是一個以可移植和可預測的方式來部署分布式應用的過程,它會將應用組件以及依賴打包為一個標準、獨立、輕量的環(huán)境中,這個環(huán)境其實就是容器。現(xiàn)在許多公司都樂衷于設計易于部署的分布式應用和服務,這樣的應用容易擴展,并且容錯性好。Docker是一個可以簡化和標準化不同環(huán)境中應用部署的容器平臺,目前已經有很多的分布式容器管理相關的生態(tài)圈軟件。
Docker和容器化
Docker是現(xiàn)在使用最多的容器化軟件。與其它已經存在的容器化系統(tǒng)相比,Docker可以更加簡單的創(chuàng)建和管理容器,并與其它開源軟件集成。
在上圖中,你可以看到容器和宿主機的關系,容器隔離獨立的應用并使用已經被Docker抽象化的操作系統(tǒng)資源。在右側的視圖中,我們可以看到容器是用‘layer’來建立的,多個容器共享基礎層以減少資源的使用。
Docker的主要優(yōu)點:
輕量級資源使用:容器在進程級別隔離并使用宿主機的內核,而不需要虛擬化整個操作系統(tǒng)??梢浦残裕阂粋€容器應用所需要的依賴都在容器中,這就讓它可以在任意一臺Docker主機上運行。可預測性:宿主機不需要關心容器內運行的是什么,同樣,容器也不需要關心是在哪個宿主機上運行。所需要的接口都是標準化的,并且交互也都是可預測的。通常在用Docker來設計應用或者服務時,最好的方法是打破面向服務架構的設計,而采用獨立容器的設計。這可以讓以后容易的擴展或者升級獨立組件。擁有如此的靈活性是人們對用Docker開發(fā)和部署感興趣的原因之一。
[page]服務發(fā)現(xiàn)和全局配置存儲
服務發(fā)現(xiàn)是整個策略中的一個組成部分,它旨在使容器部署更具有伸縮性和靈活性。使用了服務發(fā)現(xiàn)后,可以讓容器在沒有管理員干預的情況下了解運行環(huán)境。它們可以自行發(fā)現(xiàn)必須要交互的組件的連接信息,可以自行注冊自身以便其它工具知道該組件已準備就緒。這些工具同樣經常作為全局分布式配置存儲服務,可以存儲你的基礎設施中任意的服務配置信息。
從上圖中,你可以看到一個流程,圖中應用A注冊自身的連接信息給發(fā)現(xiàn)服務系統(tǒng)。一旦注冊成功,其它應用可以通過查詢發(fā)現(xiàn)服務系統(tǒng)來找到如何連接到這個應用。
這類工具通常這么實現(xiàn):在分布式環(huán)境中用基本的鍵值對來分布存儲。通常來說,鍵值對存儲提供一個HTTP API接口用來存儲和獲取值。有一些還提供了更加安全的機制,如加密條目或者訪問控制機制。除了它們的提供新容器自配置的主要功能外,這些分布式存儲對管理Docker宿主機也是非常重要的。
服務發(fā)現(xiàn)存儲的一些職責:
允許應用連接它們所依賴的服務以獲取所需數據允許服務為了上述的需求去注冊它們的連接信息提供一個全局可訪問的位置,用于存儲任意的配置數據存儲任何一個集群管理軟件所需要的集群節(jié)點信息一些流行的服務發(fā)現(xiàn)工具和相關項目:
etcd:服務發(fā)現(xiàn)/全局分布式鍵值對存儲consul:服務發(fā)現(xiàn)/全局分布式鍵值對存儲zookeeper:服務發(fā)現(xiàn)/全局分布式鍵值對存儲crypt:加密etcd條目的項目confd:觀測鍵值對存儲變更和新值的觸發(fā)器重新配置服務網絡工具
應用的容器化倡導面向服務的設計,并提倡將功能點設計為離散的組件,以簡化應用的擴展和管理。但是,這也對組件間的網絡功能和可靠提出了更高要求。Docker自身提供基本的網絡結構,包括容器間和容器與宿主直接的通信結構。
Docker本地的網絡能力為容器間的連接提供兩種方案。第一種是暴露一個容器的端口,并可選擇性的映射到宿主機上并為外部路由服務。可以自己決定使用宿主機的端口來映射,也可以讓Docker隨機的選擇一個未使用的高位端口號。這是一種對大多數場景友好的方式來提供對容器的訪問。
另外一種方法是采用Docker的'links'來允許容器間通信。一個關聯(lián)的容器將會獲得它的對應連接信息,在它處理了那些變量后允許它自動連接。這樣就使得同一個宿主機上的容器不需要知道對應服務的端口和地址,就可以直接進行通信。
這個基本的網絡環(huán)境適用于單宿主機或者嚴格受限的環(huán)境。但是,Docker生態(tài)環(huán)境已經產生了大量軟件,它們關注在為運營人員和開發(fā)者擴展網絡功能。一些額外的網絡功能已經可通過額外工具實現(xiàn):
覆蓋網絡來簡化和統(tǒng)一多宿主機間的地址空間虛擬私有網絡適配來提供多個組件間的安全通信分配子網給每個宿主機或者每個應用簡歷macvlan接口進行通信為容器配置自己指定的mac地址、網關等。參與改進Docker網絡功能的項目有:
flannel:覆蓋網絡提供給每個宿主機一個獨立子網weave:覆蓋網絡描述一個網絡上的所有容器pipework:一個高級網絡工具,它用于任意高級網絡配置[page]調度、集群管理和編制
建立一個集群容器環(huán)境時另外一個必備組件是調度器。調度器負責在可用的宿主機上啟動容器。
上圖描述了一個簡單的調度決策。請求來自API或者管理工具。然后,調度器衡量請求的條件和可用的宿主機的狀態(tài)。在這個例子中,它從一個分布式數據存儲/發(fā)現(xiàn)服務中獲取容器密度的信息,以便它可以在一個不是很忙的宿主機上運行新應用。
這個宿主機選擇的過程是調度器的一個核心任務。通常來說,它能夠按照管理員預設定的特殊條件限制來自動化完成這個過程??赡艿南拗茥l件是:
當給定另一個容器時,安排新容器在同一個宿主機確認這個容器不放在同一臺宿主機上作為另一個容器在宿主機上安置容器時記得帶相匹配的標簽或者元信息在繁忙度最低的宿主機上安置容器在集群的每一個宿主機上運行這個容器調度器責任是在相關的宿主機上加載容器,啟動容器、停止容器和管理這個進程的生命周期。
由于調度器必須要跟組內的每一個宿主機交互,集群管理功能通常也是包括在內的。這就要求調度器獲取它們的信息并執(zhí)行管理任務。編制在這里通常指的是容器的組合調度和宿主機管理。
一些流行的負責調度和集群管理的工具:
fleet: 調度器和集群管理工具marathon:調度器和集群管理工具Swarm:調度器和集群管理工具mesos:宿主機抽象服務,用于為調度器聯(lián)合宿主機資源kubernetes:一個管理容器組的工具,具有先進的調度能力compose:一個用于創(chuàng)建容器組的容器編制工具想找更多關于Docker的基本調度管理、容器組、集群管理軟件,請點擊這里。
結束語
現(xiàn)在,你應該已經熟悉與Docker生態(tài)環(huán)境相關的軟件的基本功能。在支持項目的幫助下,Docker提供一個能夠大規(guī)模擴展的軟件管理、設計、部署策略。通過理解和使用這些項目的功能,你能解決一個要求能夠足夠靈活的解釋變量操作的復雜應用部署需求。
原文鏈接:http://dockerone.com/article/205