告訴你們一個秘密:所有的DevOps 云工具是如何進入我的應用程序又與世界聯系起來的對我來說至今仍然是一個迷。但是,隨著時間的推移,我已經逐漸意識到,了解如何去配置大規模機器和應用程序的來龍去脈是開發員必須具備的重要能力,就像成為一名專業的音樂家的過程一樣。如果你想成為專業的音樂家,你當然需要知道如何演奏樂器,但是,如果你不了解錄音棚的作品或者不知道如何融入一個交響樂團,你也將很難在這樣的環境中工作。
在軟件開發的世界里,將你的代碼融入大世界中和編寫代碼同樣重要。DevOps能夠很好的做到這一點。
所以,為了架起開發和技術運營之間的橋梁,我將介紹一種新技術——容器技術。為什么是容器?強有力的證據表明容器就是機器虛擬化的下一個階段:自此電腦不再是一個物品而是一個地點。快來和我一起走近容器吧。
在本文中我將介紹容器化背后的概念、容器技術與虛擬機的不同之處、它背后的邏輯構造又如何適應應用程序架構、簡化版本的Linux操作系統如何適應容器系統以及怎樣使用圖像來創建可復用容器。在文章的最后,我將介紹如何使用容器群讓你的應用程序在短時間內壯大。
后文中我將展示分步容器化一個應用程序實例的過程,以及為應用程序容器創建一個主機集群的方法。我也會展示利用Dies在本地系統的虛擬機上或者云服務商上配置一個示例應用程序。
現在,讓我們開始吧!
虛擬機的優點
你想了解容器如何適應整個體系架構的,首先需要先了解容器的前身:虛擬機。
虛擬機(VM)是一個運行在實體計算機上的虛擬計算機軟件,在計算機上安裝一個虛擬機就像是購買一臺特制的計算機:你可以自定義CPU的數量以及其內存和磁盤存儲容量。配置完成后,你可以將操作系統以及任何你需要虛擬機支持的服務器和應用程序載入其中。
虛擬機允許在一臺硬件主機上運行多個虛擬計算機。簡易示意圖如下:
虛擬機提高了硬件的投資效益,你可以買一臺又大又響的機器設備,然后在上面運行大量的虛擬機。你也可以將數據庫虛擬機與包含大量自定義應用程序的虛擬機(同版本)作為集群同時運行。這使得有限的硬件資源獲得了延展,只要你的主機硬件允許情況下,如果你發現需要更多的虛擬機,你可以任意添加。如果你不再需要虛擬機,只需將虛擬機關閉并刪除虛擬機鏡像即可。
虛擬機的局限性
但是虛擬機存在自身的局限性。
當你按以上步驟在一臺主機上創建了三個虛擬機。主機共有12個CPU,48GB的內存,3TB的存儲空間。每個虛擬機分配4個CPU,16GB的內存和1TB的存儲空間。到目前為止一切正常,配置都在主機的能力范圍內。
但是,應該注意到一個缺點。主機分配給每個虛擬機的所有資源都是專用的。無論這臺虛擬機是什么,都會被分配到16GB內存。但是,如果第一臺虛擬機從未使用超過1 GB的內存分配,其余15GB就會閑置在那里。如果第三臺虛擬機只使用它分配到的1TB存儲空間中的100GB,那么剩余的900GB都是浪費掉的的存儲空間。
由于資源并沒有分級,每一臺虛擬機都固定使用分配到的資源。因此,一定程度上又回到了虛擬機出現前--在沒用的資源上浪費大量資金的年代。虛擬機的另一個缺點是運轉速度慢,所以即使是自動化虛擬機配置,當需要迅速擴大基礎架構時,仍然得搬著拇指玩來等它上線工作。
容器登場
容器就是一個認為只有其本身在運行狀態的linux程序,只服從用戶指定的命令。同時,在容器化方面,容器程序擁有自己的IP地址。重要的事情再說一遍:在容器化方面,容器程序是分配有IP地址的。一旦有了IP地址,主機內的應用程序就成了一個可識別的網絡資源。然后可以發送命令至容器管理器,將容器的IP地址映射到一個開放的主機IP地址。無論出于什么目的,一旦這種映射發生,一個容器就是一個可訪問網絡的獨立設備,在概念上類似于虛擬機。
再次說明,容器是一個獨立的Linux程序,擁有自己的IP地址,因此可以在網絡中識別。如下圖所示:
一個容器和其他應用程序以動態、合作的方式共享主機資源。如果容器只需要1GB內存,它就只使用1GB的內存。如果它需要4GB內存,它就只使4GB。 在CPU和存儲空間的利用上同樣如此。CPU、內存、存儲空間的分配都是動態的,而不是像典型的虛擬機一般靜態分配。所有的這些資源共享都由容器管理完成的。
此外,容器還有運行速度快的優點。
總體上容器的優點可以歸結為:擁有虛擬機獨立和封裝的特點,并彌補了它資源分配靜態專用的缺點。并且,快速載入內存的能力讓它具有更好的擴展更多容器的性能。
容器的托管、配置和管理
現在,可運行linux版本容器的主機已經成為必需品。最近,主機上的一種底層操作系統越來越來越受歡迎,就是上文提到的CoreOS。當然還有許多其他的底層操作系統,如Red Hat Atomic Host和Ubuntu Snappy。
Linux操作系統下所有容器共享,以此來減少容器重復和部署。每個容器只包含特定的容器應有的功能。下面以圖表的方式展現:
你可以使用所需的組件來配置自己的容器。有一個叫作層的容器組件。一層就是一個容器鏡像(在下面的章節,你將會了解到更多關于容器鏡像的知識)。一般從基礎層開始,基礎層通常就是你想在容器中使用的操作系統的類型(容器管理器只提供您所需的操作系統的部分,并非主機操作系統)。如果想在容器中運行其他腳本文件,需要構建容器的配置和增加層。例如想要運行Web服務器、PHP和Python時,需要配置Apache。
此外,分層是十分靈活的。如果你的應用程序或服務容器需要PHP 5.2框架,就需要配置相應的容器。如果你有另一個應用程序或者服務需要PHP5.6框架,同樣僅需利用PHP 5.6配置對應的容器即可。它不像虛擬機那樣,改變當前運行的版本時需要進行大量的配置和安裝步驟。利用容器,你僅需在容器配置文件過程中重新定義下該層即可。
在此之前,所有容器的多功能性是由一款叫做容器管理器的軟件控制的。目前,最流行的容器管理軟件是Docker和Rocket。上圖描述的就是這樣一個主機,該主機利用Docker來管理容器并且使用CoreOS操作系統。
容器與鏡像同時建立
當你將一個應用程序封裝為容器時,同時也建立了相對應的鏡像。一個鏡像代表著一個容器模板,這個模板就是你工作所需的容器的模板(我知道,容器中包含著容器,想想看)。鏡像存儲在注冊表中,注冊表緩存在網絡上。
從概念上來說,對于那些熟悉Java的人來說,注冊表類似于Maven庫,或者類似于你.NET平臺下的一個NuGet服務器。創建一個容器配置文件,以便于列出應用程序所需的全部鏡像。利用容器管理器來生成一個容器,這個容器可以包括應用程序源碼以及從容器注冊表下載的組成資源。例如,如果你的應用程序是由PHP文件組成的,容器配置文件將允許你從注冊表獲取PHP運行環境。同樣,也可以使用容器配置文件來申明復制到容器文件系統所需的.php文件。容器管理器可以將應用程序里的組件封裝成一個不同的容器,在有容器管理器的情況下,你可以在主機上運行此容器。
下圖表明了容器創建背后的過程:
讓我們仔細分析下該圖。
此處(1)表明存在一個容器配置文件,該文件定義了你容器所需要的東西,以及容器如何構建。當在主機上運行容器時,容器管理器將會從云端的注冊表內讀取配置文件容器的鏡像。(2)將鏡像添加到容器的圖層中。此外,如果該鏡像的構成需要其他鏡像參與,容器管理器將檢索到這些鏡像并將它們添加到圖層中去。(3)處,容器管理器會將文件復制到你所需的容器中去。
如果你使用一個配置服務,例如Deis,你剛剛建立的應用程序容器會以鏡像的方式存在。(4)該配置服務可以部署到你所選的云供應商中。常見的云供應商是AWS 和Rackspace。
容器集群
因此,我們可以說,在比較好的情況下,容器比虛擬機提供更大程度配置靈活性和更高的資源利用率。然而,這并不是全部優點。
當容器聚集起來將會變得更加靈活。請記住,不同的容器對應不同的IP地址。因此,容器可以放在負載均衡器后面使用,一旦這樣做,“游戲”將會上升到新的水平。
你可以通過在負載均衡器下運行容器集群來實現高性能的容器和可用度高的計算。這里有個例子:
讓我們來談一下關于你所做的資源密集型的應用程序。例如圖像處理程序。利用如Deis等容器配置技術,你可以新建一個容器鏡像,該容器鏡像將包含圖像處理應用程序和該程序所需的全部配置資源。然后,你可以在主機的負載均衡器下部署一個或者多個此類容器鏡像。一旦容器鏡像建立完成,你可以將其作為主機系統崩潰之后的備份,并且在容器集群中需要更多的鏡像來完成目前所有的工作量。
更好消息來了。在添加多個鏡像實例到工作環境中時,你無需每次手動配置負載均衡器。你可以使用服務發現技術來讓容器自動配置負載均衡器從而使得容器保持可用性的平衡。然后,一旦如此,平衡器將開始進行到新的節點的流量路由。
歸納總結
容器技術已經填補了虛擬機離開領域。諸如CoreOS、RHEL Atomic,以及Ubuntu’s Snappy等主機操作系統,綜合Doker和Rocket容器管理技術,進而使得容器日漸收到歡迎。盡管容器技術越發變得普遍,它們還是需要花費一些時間來掌握。然而,一旦你弄懂了,你可以使用如Deis等容器配置技術更容易地創建和部署容器。
在概念上理解容器和實際地開展容器相關項目同樣重要。但是,我認為如果沒有實際操作經驗是很難掌握其概念的。所以,我們在這系列的下一步工作就是:實際建立一些容器。