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