虛擬化技術中,不同層級結構間的虛擬化運用
所以容器可以和虛擬機結合在一起使用,而且這也是目前主流的做法:
虛擬化技術出現以後,虛擬化技術會在本地操作系統之上加多一層 Hypervisor層,Hypervisor是一種運行在物理服務器和操作系統之間的中間軟件層,可以虛擬化硬件資源,例如cpu、硬盤、內存資源等。然後我們可以基於通過虛擬化出來的資源之上安裝操作系統,這也就是所謂的虛擬機。
通過Hypervisor層,我們可以創建不同的虛擬機,並且可以限定每個虛擬機的物理資源,並且每個虛擬機都是分離、獨立的。例如A虛擬機給它使用2個cpu、8g內存、100g磁盤,B虛擬機給它使用4個cpu、16g內存、300g磁盤。。。等等,這樣就可以實現物理資源利用率的最大化。
如此一來:
一臺物理機就可以部署多個應用,每個應用都可以獨立運行在一個虛擬機裏。
虛擬化技術
有了上面的理念,就可以重新認識我們熟知的虛擬化技術:
虛擬機:存在於硬件層和操作系統層間的虛擬化技術。
虛擬機通過“偽造”一個硬件抽象接口,將一個操作系統以及操作系統層以上的層嫁接到硬件上,實現和真實物理機幾乎一樣的功能。
虛擬化技術的優點:
資源池——一個物理機的資源分配到了不同的虛擬機裏
很容易擴展——增加物理機或者虛擬機即可,因為虛擬機是可以復制的
很容易雲化——亞馬孫AWS,阿裏雲,谷歌雲等
即然虛擬化技術已經很強大了,為什麽還需要容器技術呢?這就涉及到虛擬化技術所帶來的局限性了:
每一個虛擬機都是一個完整的操作系統,所以需要給其分配物理資源,當虛擬機數量增多時,操作系統本身消耗的資源勢必增多
容器:存在於操作系統層和函數庫層之間的虛擬化技術。
容器通過“偽造”操作系統的接口,將API抽象層,函數庫層以上的功能置於操作系統上,以Docker為例,就是基於Linux操作系統的Namespace和CGroup功能實現的隔離容器,模擬操作系統的功能,因為它比虛擬機高了一層,也就需要少一層東西,所以容器占用資源少。
容器可以幫我們把開發環境及應用整個打包帶走,打包好的容器可以在任何的環境下運行,這樣就可以解決開發與運維環境不一致的問題了,所以:
容器解決了開發和運維之間的矛盾
在開發和運維之間搭建了一個橋梁,是實現devops的最佳解決方案
以上只是描述是容器解決了什麽問題,但是還沒有說明什麽是容器,不過其實簡單幾句話就可以說明容器了:
對軟件和其依賴環境的標準化打包
應用之間相互隔離
共享一個OS Kernel
可以運行在很多主流操作系統上
JVM:存在於函數庫層和應用程序之間的虛擬化技術。
Java虛擬機具有跨平臺特性,所謂跨平臺特性實際上就是虛擬化的功勞,我們Java語言是調用操作系統函數庫的,然而不同操作系統的函數庫互不相同,JVM就是建立一個虛擬化層,對下通過不同的版本適應不同的操作系統,對上提供統一的運行環境交給程序和開發者。通過虛擬化實現了如今蔚為壯觀的Java生態圈以及建立在JVM基礎上的其他語言,如Scala,Clojure,Kotlin等。
幾乎所有的計算機遵守著相同的層級結構:硬件層>>硬件抽象層>>操作系統層>>API抽象層>>函數庫層>>應用程序層
由此,我們可知虛擬化技術中,不管虛擬機,還是容器,還是JVM的跨平臺,只是計算機不同層級結構間的虛擬化運用。在未來很長的一段時間裏,它們會根據實際的應用場景,互相***,互相支持。
虛擬化技術中,不同層級結構間的虛擬化運用