前面介紹了。因為虛擬機中Guest OS開銷太大,會造成隔離的虛機越多資源被浪費的就越多的情況出現。所以有人就會想,可不可以不啟動Guest OS,而是直接使用Host OS來模擬一個相對完整的操作系統呢。這樣就不需要再在Host OS上跑Guest OS,按照這個思路,逐漸發展出來了操作系統級的虛擬化技術,就是利用操作系統本身的功能來實現虛擬化,這就是Container技術 。結構如下圖(以Docker為例):

Container結構

Container技術及其歷史

Container技術也可以在完整伺服器上隔離出多個完整的小的資源格子出來,且互相之間資源是隔離的。但它利用的是操作系統本身的功能,所以在每個小格裡面不需要再去運行Guest Os 了,這部分資源的開銷就被省下來了,儘可能把資源提供出來供實際的應用使用 。

雖然Container技術提供了這樣的功能,但是Container技術在被發明的很長時間內都沒有得到廣泛的應用。原因在於:雖然它提供了這樣的功能,但是應用所需環境千差萬別,相對完整的操作系統環境要怎麼定義呢,這個環境要配成什麼樣才能算是完整的環境

如上圖中所示,如果虛擬化出三個小格子,且其中運行不同的應用,前兩個應用使用Python2.7,第三個用的是python3.0,每個Container所需要的環境不一致,那怎麼辦,關鍵是要怎麼管理。一種方式就是,你先登錄Host OS的系統,在上面裝一個python2.7然後虛擬兩個小格出來,在上面運行前兩個應用,這兩個應用可以直接使用HOST OS上的python2.7;之後再虛擬出一個小格出來,然後在這個小格里只用Host OS操作系統的內核,小格子里單獨裝一個Python3.0,這樣是可以達到這個目標的。如果只有三個Container還好,但如果多了呢?以前我們說一台物理伺服器可以虛擬出20個或者30個虛擬機出來,現在,因為不需要啟動Guest OS 了,一個伺服器可以啟幾百上千個Container出來,你一個一個的去配置嗎?就算你一個一個配置好了,你之後怎麼管理呢。所以當初Container技術很難被廣泛使用。

返過頭來,我們可以看下為什麼虛擬機沒有這個問題,因為虛擬機就是一個完整的鏡像文件,本質上就是一個文件,如果是對於雲平台來說它存儲在一個鏡像庫里的文件,即便是沒有雲平台,沒有對應的管理工具,你用U盤拷貝都可以。只要將它拷貝到你宿主機的本地,然後用這個鏡像去啟動一個虛機,那麼只要在生成這個鏡像的時候把環境配好(例如在生產這個鏡像文件的時候就把JDK,Hadoop,Python都預裝好)做成鏡像,之後你在啟動虛擬機的時候,當初你裝了什麼環境,啟動起來就是什麼環境。 因為他是純軟體的,不是物理的硬體,所以我們可以拷貝。

但是對於當初的Container技術來說,沒有這樣的鏡像,所以虛擬出來眾多的Container的配置管理就是一個大問題,所以在之前的很多年裡Container一直沒有得到大規模的應用。只有Google在大量應用,因為Google裡面對Container的環境要求一樣,也就是說2000台伺服器一樣的環境配置,我只需要用傳統的配置管理手段把這2000台伺服器配置好,然後啟動那些Container,因為Container是共用操作系統的,所以啟動的Container裡面的環境就都是一樣的。因此只有在這種場景才能大範圍應用。也就是Container中需要的配置和HOST OS 上運行的配置都是統一的,沒有那麼多差異的配置需要操心,因此可以大量應用。Google當年用的Container技術名字就叫Linux Containers(簡稱LXC)。

Docker的出現

那為什麼這幾年Container一下子火了呢?因為出現了 Docker,現在我們說Docker是一個Container,甚至很多時候提到Container就是指Docker,而不是其他的Container技術。然而Docker剛誕生的時候甚至沒有自己的Container技術,他用的就是LXC,但是它多做了一件事情,它發明了一個叫做Docker File的東西,這就是一個文本文件,裡面描述了這一個Container啟動時如何去配置它的環境,一行一行的寫的很清楚。所以當我們在用Docker的時候,會按照Docker File去啟動一個Container並且按照Docker File的描述把相關的環境給配置好,最後把應用給啟動起來。這個時候我們就發現,Docker File就具有與虛機鏡像類似的作用,實際上Docker還有一個概念叫Docker鏡像。根據Docker File生成一個Container的文件系統,對文件系統中存著的一些東西進行打包,就可以形成Docker鏡像。Docker鏡像的功能就跟虛機鏡像的功能非常的接近了,Docker File和Docker鏡像基本上是等價的,因為你有了Docker File就可以根據Docker File生成一個Docker鏡像。所以大家用的比較多的還是Docker File。也正因為Docker File解決了Container技術最大的問題:實現環境的統一和管理。有了DockerFile以後就可以讓用戶在使用Container技術的時候,方便對環境的管理,且任何應用或者服務的運營環境跟你當初在開發時的環境保持一致。需要提及的一點是,隨著Docker的迅猛發展,之後LXC不夠Docker玩了,所以他自己搞了一套Container技術。

下一節介紹Docker的應用場景、缺點以及與虛機技術的對比。

(謹以此系列文章,祭奠逝去的學生時代.......)
微信公眾號

推薦閱讀:

相关文章