Docker系列開篇之Virtual Machine VS Container(一)

Jeffcky發表於2019-08-07

前言

本節開始我們正式進入Docker系列,網上關於Docker相關文章如數家珍,寫部落格至今,我也一直在朝著如何寫出通俗易懂且不枯燥的文章這個目標前進,喃喃自語的同時也希望看到文章的童鞋能明白我在講什麼,將知識點敘述清楚沒有,講解的效果如何,是否有啟發或收穫,能夠得到及時的反饋當然也能讓我理解的更透徹,好了,我們開始吧。

 

Virtual Machine VS Container

開篇我不打算直接講解各個概念,將虛擬機器和容器作比較至關重要,這都是基本概念。既然是系列文章也要適合如我一樣作為初學者的入門指南,希望本系列文章能幫助到大家。容器和虛擬機器的問世是解決什麼問題呢?換句話說它兩的作用是什麼呢?

容器和虛擬機器的作用相似:都是將應用程式及其依賴隔離到可以在任何地方執行的獨立單元,同時二者都消除了對物理硬體的需求,能更有效的使用計算機資源

討論完相似,當然我也得說說二者的不同之處在哪裡?區別在於二者的架構處理。下面我們來分別講講虛擬機器和容器。

Virtual Machine

虛擬機器的本質上對真實計算機的模擬,就好比玩具槍對真實槍支的模擬或模擬一樣,功能類似,虛擬機器借用Hypervisor(管理程式)在物理機器上執行,既然虛擬機器可以在Hypervisor上執行,反之,Hypervisor可以在主機上執行,也可以直接在裸機上執行。說到這裡,我們又得講講Hypervisor是啥玩意,剛才我們講了Hypervisor(下面我們用管理程式代替)是虛擬機器執行的軟體,管理程式本身是執行在物理計算機上,這裡的物理計算機我們稱為【主機】,主機可以為虛擬機器提供RAM和CPU,通俗一點講則是為虛擬機器提供記憶體儲存和計算資源,主機為虛擬機器提供了RAM和CPU,那麼在一臺主機上若有多臺虛擬機器,我們根據需要為多臺虛擬機器來劃分或分發這些資源,因此,如果一臺虛擬機器執行著更多的應用程式,那麼我們可能需要為其分配更多的資源,而不是為在一臺主機上執行其他的虛擬機器分配更多的資源。

 

在主機上使用管理程式執行的虛擬機器,我們稱為【客戶機】,該客戶機包含執行的應用程式以及應用程式所需要的任何內容,比如依賴的庫等等,同時客戶機還擁有自己的整個虛擬化硬體堆疊,比如包括虛擬化網路介面卡、儲存、CPU等等,通過這樣描述,我們知道客戶機擁有屬於自己的一套完整的客戶機作業系統,從內部來看,客戶機有自己的專屬資源,從外部來看,客戶機共享主機資源。

 

綜上所述,客戶機可以託管虛擬機器管理程式或裸機虛擬機器管理程式而執行,那麼這二者又有什麼差異呢?

 

託管虛擬機器管理程式執行在主機的作業系統上,比如執行OSX(蘋果作業系統)的計算機可以在該OS(作業系統)之上執行Virual Box或Virtual Machine,同時最重要的一點是,因為虛擬機器共享主機資源,所以虛擬機器無法直接訪問硬體,必須藉助主機作業系統來進行訪問。想必到了這裡我們知道了託管虛擬機器管理程式的好處是它並不需要關心底層硬體,也就是說底層硬體對虛擬機器管理程式來說並不重要,就好比我們直奔菜市場,我們的任務或者重心放在買當天所需要的菜,而並不是關心菜是怎麼種出來的一樣,這個例子也恰巧說明了物件導向和麵向過程的概念。而主機的作業系統負責硬體驅動程式而不是虛擬機器管理程式本身,因為虛擬機器管理程式和硬體之間多了夾帶了附加層,所以帶來了更多了資源開銷,從而降低了虛擬機器的效能。

 

裸機虛擬機器管理程式通過在主機的硬體上安裝和執行,因為它直接與底層硬體連線或打交道,所以解決了效能問題,它完全不需要執行主機作業系統,作為安裝在主機上的作業系統當然主要就是為了管理程式,裸機虛擬機器管理程式與託管虛擬機器管理程式不同的是,裸機虛擬機器管理程式擁有屬於自己的裝置驅動程式,可以直接與底層每個元件進行互動,以執行任何I/O或處理作業系統上特定的任務,如此可以在可伸縮性或穩定上而獲得更好的效能。好了,到了這裡我們討論完了虛擬機器管理程式和裸機虛擬機器管理程式的區別,可能有一個大大的疑問,為何在虛擬機器和主機之間要附帶額外的這一層呢?因為虛擬機器有屬於自己一套虛擬化作業系統,而主機也有一套真實的作業系統,所以虛擬機器管理程式為虛擬機器提供管理和在執行虛擬機器作業系統的平臺上發揮著重要的作用,它允許主機在作為客戶端執行的虛擬機器共享其資源。

 

如下圖(圖片來源於園友:純潔的微笑),虛擬機器包含虛擬硬體、核心(即作業系統)、使用者空間。

 

Container

我們來揭開容器的面紗,與虛擬化硬體的虛擬機器不同的是,容器通過抽象使用者空間來提供作業系統級虛擬化,如下圖(圖片來源於網路):

如上圖僅僅只打包使用者空間而不包含核心和虛擬硬體,每個容器都有屬於自己的獨立使用者空間,以此來允許多個容器執行在單個主機上,也就是網上很多資料所提及的容器進一步封裝了linux,佔用資源少。同時我們也可以看到所有作業系統級的體系結構都在容器之間共享,這也就是網上很多資料所提及的容器輕巧的原因。

 

總結

本節內容我們就到這裡,內容太多也容易引起視覺疲勞,不出意外的話,關於Docker系列,應該會堅持每日一更,感謝閱讀,下節再會。

相關文章