容器技術(shù)和虛擬機(jī)將會(huì)處于一個(gè)長(zhǎng)期共存的狀態(tài)。容器技術(shù)的出發(fā)點(diǎn)雖然更加輕量級(jí)价匠,部署運(yùn)行快速当纱,但共用了底層的kernel,因此與虛擬機(jī)模式在資源隔離性方面有先天的劣勢(shì)踩窖,暫時(shí)無法取代虛擬機(jī)模式坡氯。
虛擬化技術(shù)會(huì)在本地操作系統(tǒng)之上加多一層 Hypervisor層。Hypervisor是一種運(yùn)行在物理服務(wù)器和操作系統(tǒng)之間的中間軟件層洋腮,可以虛擬化硬件資源箫柳,例如cpu、硬盤啥供、內(nèi)存資源等悯恍。然后我們可以基于虛擬化硬件資源之上安裝操作系統(tǒng),也就是虛擬機(jī)伙狐。
通過Hypervisor層涮毫,我們可以創(chuàng)建不同的虛擬機(jī),并且可以限定每個(gè)虛擬機(jī)的物理資源贷屎,并且每個(gè)虛擬機(jī)都是分離罢防、獨(dú)立的。例如A虛擬機(jī)給它使用2個(gè)cpu唉侄、8g內(nèi)存咒吐、100g磁盤,B虛擬機(jī)給它使用4個(gè)cpu、16g內(nèi)存渤滞、300g磁盤贬墩,等等,這樣就可以實(shí)現(xiàn)物理資源利用率的最大化妄呕。如此一來陶舞,一臺(tái)物理機(jī)就可以部署多個(gè)應(yīng)用,每個(gè)應(yīng)用都可以獨(dú)立運(yùn)行在一個(gè)虛擬機(jī)里绪励。
有了上面的理念肿孵,就可以重新認(rèn)識(shí)我們熟知的虛擬化技術(shù):
虛擬機(jī):存在于硬件層和操作系統(tǒng)層間的虛擬化技術(shù)。
虛擬機(jī)通過“偽造”一個(gè)硬件抽象接口疏魏,將一個(gè)操作系統(tǒng)以及操作系統(tǒng)層以上的層嫁接到硬件上停做,實(shí)現(xiàn)和真實(shí)物理機(jī)幾乎一樣的功能。
虛擬化技術(shù)擁有諸多優(yōu)點(diǎn):
資源池——一個(gè)物理機(jī)的資源分配到了不同的虛擬機(jī)里大莫;
很容易擴(kuò)展——增加物理機(jī)或者虛擬機(jī)即可蛉腌,因?yàn)樘摂M機(jī)是可以復(fù)制的;
很容易云化——如亞馬孫AWS只厘,阿里云烙丛,谷歌云等。
即然虛擬化技術(shù)已經(jīng)很強(qiáng)大了羔味,為什么還需要容器技術(shù)呢河咽?這就涉及到虛擬化技術(shù)所帶來的局限性了:每一個(gè)虛擬機(jī)都是一個(gè)完整的操作系統(tǒng),所以需要給其分配物理資源赋元,當(dāng)虛擬機(jī)數(shù)量增多時(shí)忘蟹,操作系統(tǒng)本身消耗的資源勢(shì)必增多。所以容器可以和虛擬機(jī)結(jié)合在一起使用搁凸,而這也是目前主流的做法媚值。
容器是存在于操作系統(tǒng)層和函數(shù)庫層之間的虛擬化技術(shù)。
容器通過“偽造”操作系統(tǒng)的接口坪仇,將API抽象層杂腰,函數(shù)庫層以上的功能置于操作系統(tǒng)上,以Docker為例椅文,就是基于Linux操作系統(tǒng)的Namespace和CGroup功能實(shí)現(xiàn)的隔離容器喂很,模擬操作系統(tǒng)的功能,因?yàn)樗忍摂M機(jī)高了一層皆刺,也就需要少一層?xùn)|西少辣,所以容器占用資源少。
容器可以對(duì)軟件及其依賴環(huán)境標(biāo)準(zhǔn)化打包羡蛾,實(shí)現(xiàn)應(yīng)用之間相互隔離但共享一個(gè)OS Kernel漓帅。打包好的容器可以在任何環(huán)境下運(yùn)行,這樣就可以解決開發(fā)與運(yùn)維環(huán)境不一致的問題了。容器解決了開發(fā)和運(yùn)維之間的矛盾忙干,在開發(fā)和運(yùn)維之間搭建了一個(gè)橋梁器予,是實(shí)現(xiàn)devops的最佳解決方案。
說到虛擬化技術(shù)和容器技術(shù)捐迫,再聊一下JVM——存在于函數(shù)庫層和應(yīng)用程序之間的虛擬化技術(shù)乾翔。
Java虛擬機(jī)具有跨平臺(tái)特性,所謂跨平臺(tái)特性實(shí)際上就是虛擬化的功勞施戴。Java語言是調(diào)用操作系統(tǒng)函數(shù)庫的反浓,然而不同操作系統(tǒng)的函數(shù)庫互不相同,JVM就是建立一個(gè)虛擬化層赞哗,對(duì)下通過不同的版本適應(yīng)不同的操作系統(tǒng)雷则,對(duì)上提供統(tǒng)一的運(yùn)行環(huán)境交給程序和開發(fā)者。JVM實(shí)現(xiàn)了如今蔚為壯觀的Java生態(tài)圈以及建立在JVM基礎(chǔ)上的其他語言肪笋,如Scala月劈,Clojure,Kotlin等藤乙。
幾乎所有的計(jì)算機(jī)遵守著相同的層級(jí)結(jié)構(gòu):硬件層>>硬件抽象層>>操作系統(tǒng)層>>API抽象層>>函數(shù)庫層>>應(yīng)用程序?qū)右照弧S纱耍覀兛芍摂M化技術(shù)中湾盒,不管虛擬機(jī),還是容器诅妹,還是JVM的跨平臺(tái)罚勾,只是計(jì)算機(jī)不同層級(jí)結(jié)構(gòu)間的虛擬化運(yùn)用。在未來很長(zhǎng)的一段時(shí)間里吭狡,它們會(huì)根據(jù)實(shí)際的應(yīng)用場(chǎng)景尖殃,互相滲透,互相支持划煮。