一個(gè)開(kāi)發(fā)者的Linux Containers之旅

責(zé)任編輯:editor006

作者:Bob Reselman

2015-10-10 16:23:16

摘自:Deis

告訴你們一個(gè)秘密:所有的DevOps 云工具是如何進(jìn)入我的應(yīng)用程序又與世界聯(lián)系起來(lái)的對(duì)我來(lái)說(shuō)至今仍然是一個(gè)迷。你可以通過(guò)在負(fù)載均衡器下運(yùn)行容器集群來(lái)實(shí)現(xiàn)高性能的容器和可用度高的計(jì)算。

告訴你們一個(gè)秘密:所有的DevOps 云工具是如何進(jìn)入我的應(yīng)用程序又與世界聯(lián)系起來(lái)的對(duì)我來(lái)說(shuō)至今仍然是一個(gè)迷。但是,隨著時(shí)間的推移,我已經(jīng)逐漸意識(shí)到,了解如何去配置大規(guī)模機(jī)器和應(yīng)用程序的來(lái)龍去脈是開(kāi)發(fā)員必須具備的重要能力,就像成為一名專業(yè)的音樂(lè)家的過(guò)程一樣。如果你想成為專業(yè)的音樂(lè)家,你當(dāng)然需要知道如何演奏樂(lè)器,但是,如果你不了解錄音棚的作品或者不知道如何融入一個(gè)交響樂(lè)團(tuán),你也將很難在這樣的環(huán)境中工作。

在軟件開(kāi)發(fā)的世界里,將你的代碼融入大世界中和編寫(xiě)代碼同樣重要。DevOps能夠很好的做到這一點(diǎn)。

所以,為了架起開(kāi)發(fā)和技術(shù)運(yùn)營(yíng)之間的橋梁,我將介紹一種新技術(shù)——容器技術(shù)。為什么是容器?強(qiáng)有力的證據(jù)表明容器就是機(jī)器虛擬化的下一個(gè)階段:自此電腦不再是一個(gè)物品而是一個(gè)地點(diǎn)??靵?lái)和我一起走近容器吧。

在本文中我將介紹容器化背后的概念、容器技術(shù)與虛擬機(jī)的不同之處、它背后的邏輯構(gòu)造又如何適應(yīng)應(yīng)用程序架構(gòu)、簡(jiǎn)化版本的Linux操作系統(tǒng)如何適應(yīng)容器系統(tǒng)以及怎樣使用圖像來(lái)創(chuàng)建可復(fù)用容器。在文章的最后,我將介紹如何使用容器群讓你的應(yīng)用程序在短時(shí)間內(nèi)壯大。

后文中我將展示分步容器化一個(gè)應(yīng)用程序?qū)嵗倪^(guò)程,以及為應(yīng)用程序容器創(chuàng)建一個(gè)主機(jī)集群的方法。我也會(huì)展示利用Dies在本地系統(tǒng)的虛擬機(jī)上或者云服務(wù)商上配置一個(gè)示例應(yīng)用程序。

現(xiàn)在,讓我們開(kāi)始吧!

虛擬機(jī)的優(yōu)點(diǎn)

你想了解容器如何適應(yīng)整個(gè)體系架構(gòu)的,首先需要先了解容器的前身:虛擬機(jī)。

虛擬機(jī)(VM)是一個(gè)運(yùn)行在實(shí)體計(jì)算機(jī)上的虛擬計(jì)算機(jī)軟件,在計(jì)算機(jī)上安裝一個(gè)虛擬機(jī)就像是購(gòu)買一臺(tái)特制的計(jì)算機(jī):你可以自定義CPU的數(shù)量以及其內(nèi)存和磁盤存儲(chǔ)容量。配置完成后,你可以將操作系統(tǒng)以及任何你需要虛擬機(jī)支持的服務(wù)器和應(yīng)用程序載入其中。

虛擬機(jī)允許在一臺(tái)硬件主機(jī)上運(yùn)行多個(gè)虛擬計(jì)算機(jī)。簡(jiǎn)易示意圖如下:

虛擬機(jī)提高了硬件的投資效益,你可以買一臺(tái)又大又響的機(jī)器設(shè)備,然后在上面運(yùn)行大量的虛擬機(jī)。你也可以將數(shù)據(jù)庫(kù)虛擬機(jī)與包含大量自定義應(yīng)用程序的虛擬機(jī)(同版本)作為集群同時(shí)運(yùn)行。這使得有限的硬件資源獲得了延展,只要你的主機(jī)硬件允許情況下,如果你發(fā)現(xiàn)需要更多的虛擬機(jī),你可以任意添加。如果你不再需要虛擬機(jī),只需將虛擬機(jī)關(guān)閉并刪除虛擬機(jī)鏡像即可。

虛擬機(jī)的局限性

但是虛擬機(jī)存在自身的局限性。

當(dāng)你按以上步驟在一臺(tái)主機(jī)上創(chuàng)建了三個(gè)虛擬機(jī)。主機(jī)共有12個(gè)CPU,48GB的內(nèi)存,3TB的存儲(chǔ)空間。每個(gè)虛擬機(jī)分配4個(gè)CPU,16GB的內(nèi)存和1TB的存儲(chǔ)空間。到目前為止一切正常,配置都在主機(jī)的能力范圍內(nèi)。

但是,應(yīng)該注意到一個(gè)缺點(diǎn)。主機(jī)分配給每個(gè)虛擬機(jī)的所有資源都是專用的。無(wú)論這臺(tái)虛擬機(jī)是什么,都會(huì)被分配到16GB內(nèi)存。但是,如果第一臺(tái)虛擬機(jī)從未使用超過(guò)1 GB的內(nèi)存分配,其余15GB就會(huì)閑置在那里。如果第三臺(tái)虛擬機(jī)只使用它分配到的1TB存儲(chǔ)空間中的100GB,那么剩余的900GB都是浪費(fèi)掉的的存儲(chǔ)空間。

由于資源并沒(méi)有分級(jí),每一臺(tái)虛擬機(jī)都固定使用分配到的資源。因此,一定程度上又回到了虛擬機(jī)出現(xiàn)前--在沒(méi)用的資源上浪費(fèi)大量資金的年代。虛擬機(jī)的另一個(gè)缺點(diǎn)是運(yùn)轉(zhuǎn)速度慢,所以即使是自動(dòng)化虛擬機(jī)配置,當(dāng)需要迅速擴(kuò)大基礎(chǔ)架構(gòu)時(shí),仍然得搬著拇指玩來(lái)等它上線工作。

容器登場(chǎng)

容器就是一個(gè)認(rèn)為只有其本身在運(yùn)行狀態(tài)的linux程序,只服從用戶指定的命令。同時(shí),在容器化方面,容器程序擁有自己的IP地址。重要的事情再說(shuō)一遍:在容器化方面,容器程序是分配有IP地址的。一旦有了IP地址,主機(jī)內(nèi)的應(yīng)用程序就成了一個(gè)可識(shí)別的網(wǎng)絡(luò)資源。然后可以發(fā)送命令至容器管理器,將容器的IP地址映射到一個(gè)開(kāi)放的主機(jī)IP地址。無(wú)論出于什么目的,一旦這種映射發(fā)生,一個(gè)容器就是一個(gè)可訪問(wèn)網(wǎng)絡(luò)的獨(dú)立設(shè)備,在概念上類似于虛擬機(jī)。

再次說(shuō)明,容器是一個(gè)獨(dú)立的Linux程序,擁有自己的IP地址,因此可以在網(wǎng)絡(luò)中識(shí)別。如下圖所示:

一個(gè)容器和其他應(yīng)用程序以動(dòng)態(tài)、合作的方式共享主機(jī)資源。如果容器只需要1GB內(nèi)存,它就只使用1GB的內(nèi)存。如果它需要4GB內(nèi)存,它就只使4GB。 在CPU和存儲(chǔ)空間的利用上同樣如此。CPU、內(nèi)存、存儲(chǔ)空間的分配都是動(dòng)態(tài)的,而不是像典型的虛擬機(jī)一般靜態(tài)分配。所有的這些資源共享都由容器管理完成的。

此外,容器還有運(yùn)行速度快的優(yōu)點(diǎn)。

總體上容器的優(yōu)點(diǎn)可以歸結(jié)為:擁有虛擬機(jī)獨(dú)立和封裝的特點(diǎn),并彌補(bǔ)了它資源分配靜態(tài)專用的缺點(diǎn)。并且,快速載入內(nèi)存的能力讓它具有更好的擴(kuò)展更多容器的性能。

容器的托管、配置和管理

現(xiàn)在,可運(yùn)行l(wèi)inux版本容器的主機(jī)已經(jīng)成為必需品。最近,主機(jī)上的一種底層操作系統(tǒng)越來(lái)越來(lái)越受歡迎,就是上文提到的CoreOS。當(dāng)然還有許多其他的底層操作系統(tǒng),如Red Hat Atomic Host和Ubuntu Snappy。

Linux操作系統(tǒng)下所有容器共享,以此來(lái)減少容器重復(fù)和部署。每個(gè)容器只包含特定的容器應(yīng)有的功能。下面以圖表的方式展現(xiàn):

你可以使用所需的組件來(lái)配置自己的容器。有一個(gè)叫作層的容器組件。一層就是一個(gè)容器鏡像(在下面的章節(jié),你將會(huì)了解到更多關(guān)于容器鏡像的知識(shí))。一般從基礎(chǔ)層開(kāi)始,基礎(chǔ)層通常就是你想在容器中使用的操作系統(tǒng)的類型(容器管理器只提供您所需的操作系統(tǒng)的部分,并非主機(jī)操作系統(tǒng))。如果想在容器中運(yùn)行其他腳本文件,需要構(gòu)建容器的配置和增加層。例如想要運(yùn)行Web服務(wù)器、PHP和Python時(shí),需要配置Apache。

此外,分層是十分靈活的。如果你的應(yīng)用程序或服務(wù)容器需要PHP 5.2框架,就需要配置相應(yīng)的容器。如果你有另一個(gè)應(yīng)用程序或者服務(wù)需要PHP5.6框架,同樣僅需利用PHP 5.6配置對(duì)應(yīng)的容器即可。它不像虛擬機(jī)那樣,改變當(dāng)前運(yùn)行的版本時(shí)需要進(jìn)行大量的配置和安裝步驟。利用容器,你僅需在容器配置文件過(guò)程中重新定義下該層即可。

在此之前,所有容器的多功能性是由一款叫做容器管理器的軟件控制的。目前,最流行的容器管理軟件是Docker和Rocket。上圖描述的就是這樣一個(gè)主機(jī),該主機(jī)利用Docker來(lái)管理容器并且使用CoreOS操作系統(tǒng)。

容器與鏡像同時(shí)建立

當(dāng)你將一個(gè)應(yīng)用程序封裝為容器時(shí),同時(shí)也建立了相對(duì)應(yīng)的鏡像。一個(gè)鏡像代表著一個(gè)容器模板,這個(gè)模板就是你工作所需的容器的模板(我知道,容器中包含著容器,想想看)。鏡像存儲(chǔ)在注冊(cè)表中,注冊(cè)表緩存在網(wǎng)絡(luò)上。

從概念上來(lái)說(shuō),對(duì)于那些熟悉Java的人來(lái)說(shuō),注冊(cè)表類似于Maven庫(kù),或者類似于你.NET平臺(tái)下的一個(gè)NuGet服務(wù)器。創(chuàng)建一個(gè)容器配置文件,以便于列出應(yīng)用程序所需的全部鏡像。利用容器管理器來(lái)生成一個(gè)容器,這個(gè)容器可以包括應(yīng)用程序源碼以及從容器注冊(cè)表下載的組成資源。例如,如果你的應(yīng)用程序是由PHP文件組成的,容器配置文件將允許你從注冊(cè)表獲取PHP運(yùn)行環(huán)境。同樣,也可以使用容器配置文件來(lái)申明復(fù)制到容器文件系統(tǒng)所需的.php文件。容器管理器可以將應(yīng)用程序里的組件封裝成一個(gè)不同的容器,在有容器管理器的情況下,你可以在主機(jī)上運(yùn)行此容器。

下圖表明了容器創(chuàng)建背后的過(guò)程:

  讓我們仔細(xì)分析下該圖。

此處(1)表明存在一個(gè)容器配置文件,該文件定義了你容器所需要的東西,以及容器如何構(gòu)建。當(dāng)在主機(jī)上運(yùn)行容器時(shí),容器管理器將會(huì)從云端的注冊(cè)表內(nèi)讀取配置文件容器的鏡像。(2)將鏡像添加到容器的圖層中。此外,如果該鏡像的構(gòu)成需要其他鏡像參與,容器管理器將檢索到這些鏡像并將它們添加到圖層中去。(3)處,容器管理器會(huì)將文件復(fù)制到你所需的容器中去。

如果你使用一個(gè)配置服務(wù),例如Deis,你剛剛建立的應(yīng)用程序容器會(huì)以鏡像的方式存在。(4)該配置服務(wù)可以部署到你所選的云供應(yīng)商中。常見(jiàn)的云供應(yīng)商是AWS 和Rackspace。

容器集群

因此,我們可以說(shuō),在比較好的情況下,容器比虛擬機(jī)提供更大程度配置靈活性和更高的資源利用率。然而,這并不是全部?jī)?yōu)點(diǎn)。

當(dāng)容器聚集起來(lái)將會(huì)變得更加靈活。請(qǐng)記住,不同的容器對(duì)應(yīng)不同的IP地址。因此,容器可以放在負(fù)載均衡器后面使用,一旦這樣做,“游戲”將會(huì)上升到新的水平。

你可以通過(guò)在負(fù)載均衡器下運(yùn)行容器集群來(lái)實(shí)現(xiàn)高性能的容器和可用度高的計(jì)算。這里有個(gè)例子:

讓我們來(lái)談一下關(guān)于你所做的資源密集型的應(yīng)用程序。例如圖像處理程序。利用如Deis等容器配置技術(shù),你可以新建一個(gè)容器鏡像,該容器鏡像將包含圖像處理應(yīng)用程序和該程序所需的全部配置資源。然后,你可以在主機(jī)的負(fù)載均衡器下部署一個(gè)或者多個(gè)此類容器鏡像。一旦容器鏡像建立完成,你可以將其作為主機(jī)系統(tǒng)崩潰之后的備份,并且在容器集群中需要更多的鏡像來(lái)完成目前所有的工作量。

更好消息來(lái)了。在添加多個(gè)鏡像實(shí)例到工作環(huán)境中時(shí),你無(wú)需每次手動(dòng)配置負(fù)載均衡器。你可以使用服務(wù)發(fā)現(xiàn)技術(shù)來(lái)讓容器自動(dòng)配置負(fù)載均衡器從而使得容器保持可用性的平衡。然后,一旦如此,平衡器將開(kāi)始進(jìn)行到新的節(jié)點(diǎn)的流量路由。

歸納總結(jié)

容器技術(shù)已經(jīng)填補(bǔ)了虛擬機(jī)離開(kāi)領(lǐng)域。諸如CoreOS、RHEL Atomic,以及Ubuntu’s Snappy等主機(jī)操作系統(tǒng),綜合Doker和Rocket容器管理技術(shù),進(jìn)而使得容器日漸收到歡迎。盡管容器技術(shù)越發(fā)變得普遍,它們還是需要花費(fèi)一些時(shí)間來(lái)掌握。然而,一旦你弄懂了,你可以使用如Deis等容器配置技術(shù)更容易地創(chuàng)建和部署容器。

在概念上理解容器和實(shí)際地開(kāi)展容器相關(guān)項(xiàng)目同樣重要。但是,我認(rèn)為如果沒(méi)有實(shí)際操作經(jīng)驗(yàn)是很難掌握其概念的。所以,我們?cè)谶@系列的下一步工作就是:實(shí)際建立一些容器。

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號(hào)-6京公網(wǎng)安備 11010502049343號(hào)