此文能夠說(shuō)明一些問(wèn)題,但并不是很權(quán)威。
要明確的一點(diǎn)是,容器不是虛擬機(jī)。
使用虛擬機(jī)運(yùn)行多個(gè)相互隔離的平臺(tái):
從下到上理解:
基礎(chǔ)設(shè)施(Infrastructure)。它可以是你的個(gè)人電腦,數(shù)據(jù)中心的服務(wù)器,或者是云主機(jī)。
虛擬機(jī)管理系統(tǒng)(Hypervisor)。利用Hypervisor,可以在主操作系統(tǒng)之上運(yùn)行多個(gè)不同的從操作系統(tǒng)。類型1的裸金屬架構(gòu)有支持MacOS的HyperKit,支持Windows的Hyper-V、Xen、KVM以及vsphere。類型2的寄居架構(gòu)有Citrix VirtualBox和VMWare workstation。
客戶機(jī)操作系統(tǒng)(Guest Operating System)。假設(shè)你需要運(yùn)行3個(gè)相互隔離的應(yīng)用,則需要使用Hypervisor啟動(dòng)3個(gè)客戶機(jī)操作系統(tǒng),也就是3個(gè)虛擬機(jī)。這些虛擬機(jī)都非常大,也許有700MB,這就意味著它們將占用2.1GB的磁盤(pán)空間。更糟糕的是,它們還會(huì)消耗很多CPU和內(nèi)存。
各種依賴。每一個(gè)客戶機(jī)操作系統(tǒng)都需要安裝許多依賴。如果你的應(yīng)用需要連接PostgreSQL的話,則需要安裝libpq-dev;如果你使用Ruby的話,應(yīng)該需要安裝gems;如果使用其他編程語(yǔ)言,比如Python或者Node.js,都會(huì)需要安裝對(duì)應(yīng)的依賴庫(kù)。
應(yīng)用。安裝依賴之后,就可以在各個(gè)客戶機(jī)操作系統(tǒng)分別運(yùn)行應(yīng)用了,這樣各個(gè)應(yīng)用就是相互隔離的。
使用docker容器運(yùn)行多個(gè)相互隔離的應(yīng)用:
不難發(fā)現(xiàn),相比于虛擬機(jī),Docker要簡(jiǎn)潔很多。因?yàn)槲覀儾恍枰\(yùn)行一個(gè)臃腫的客戶機(jī)操作系統(tǒng)了。
從下到上理解:
基礎(chǔ)設(shè)施(Infrastructure)。
主操作系統(tǒng)(Host Operating System)。所有主流的Linux發(fā)行版都可以運(yùn)行Docker。對(duì)于MacOS和Windows,也有一些辦法”運(yùn)行”Docker。
Docker守護(hù)進(jìn)程(Docker Daemon)。Docker守護(hù)進(jìn)程取代了Hypervisor,它是運(yùn)行在操作系統(tǒng)之上的后臺(tái)進(jìn)程,負(fù)責(zé)管理Docker容器。
各種依賴。對(duì)于Docker,應(yīng)用的所有依賴都打包在Docker鏡像中,Docker容器是基于Docker鏡像創(chuàng)建的。
應(yīng)用。應(yīng)用的源代碼與它的依賴都打包在Docker鏡像中,不同的應(yīng)用需要不同的Docker鏡像。不同的應(yīng)用運(yùn)行在不同的Docker容器中,它們是相互隔離的。
對(duì)比虛擬機(jī)和Docker容器:
Docker守護(hù)進(jìn)程可以直接與主操作系統(tǒng)進(jìn)行通信,為各個(gè)docker容器分配資源。虛擬機(jī)啟動(dòng)需要數(shù)分鐘,而docker容器只需數(shù)毫秒即可完成創(chuàng)建和啟動(dòng),由于沒(méi)有臃腫的操作系統(tǒng),容器可以節(jié)省大量的磁盤(pán)空間以及其他系統(tǒng)資源。
相比于虛擬機(jī),容器擁有更高的資源使用效率,因?yàn)樗⒉恍枰獮槊總€(gè)應(yīng)用分配單獨(dú)的操作系統(tǒng)——實(shí)例規(guī)模更小、創(chuàng)建和遷移速度也更快。這意味相比于虛擬機(jī),單個(gè)操作系統(tǒng)能夠承載更多的容器。
云提供商十分熱衷于容器技術(shù),因?yàn)樵谙嗤挠布O(shè)備當(dāng)中,可以部署數(shù)量更多的容器實(shí)例。此外,容器易于遷移,但是只能被遷移到具有兼容操作系統(tǒng)內(nèi)核的其他服務(wù)器當(dāng)中,這樣就會(huì)給遷移選擇帶來(lái)限制。
虛擬機(jī)與容器有各自不同的應(yīng)用場(chǎng)景:
虛擬機(jī)更擅長(zhǎng)徹底隔離整個(gè)運(yùn)行環(huán)境,而容器的實(shí)現(xiàn)是共享內(nèi)核,通常用于隔離不同的應(yīng)用。
服務(wù)器好比運(yùn)輸碼頭:擁有場(chǎng)地和各種設(shè)備(服務(wù)器硬件資源)
服務(wù)器虛擬化好比作碼頭上的倉(cāng)庫(kù):擁有獨(dú)立的空間堆放各種貨物或集裝箱
(倉(cāng)庫(kù)之間完全獨(dú)立,獨(dú)立的應(yīng)用系統(tǒng)和操作系統(tǒng))
Docker比作集裝箱:各種貨物的打包
(將各種應(yīng)用程序和他們所依賴的運(yùn)行環(huán)境打包成標(biāo)準(zhǔn)的容器,容器之間隔離)
Docker有著小巧、遷移部署快速、運(yùn)行高效等特點(diǎn),但隔離性比服務(wù)器虛擬化差:不同的集裝箱屬于不同的運(yùn)單(Docker上運(yùn)行不同的應(yīng)用實(shí)例),相互獨(dú)立(隔離)。但由同一個(gè)庫(kù)管人員管理(主機(jī)操作系統(tǒng)內(nèi)核),因此通過(guò)庫(kù)管人員可以看到所有集裝箱的相關(guān)信息(因?yàn)楣蚕聿僮飨到y(tǒng)內(nèi)核,因此相關(guān)信息會(huì)共享)。
服務(wù)器虛擬化就好比在碼頭上(物理主機(jī)及虛擬化層),建立了多個(gè)獨(dú)立的“小碼頭”—倉(cāng)庫(kù)(虛擬機(jī))。其擁有完全獨(dú)立(隔離)的空間,屬于不同的客戶(虛擬機(jī)所有者)。每個(gè)倉(cāng)庫(kù)有各自的庫(kù)管人員(當(dāng)前虛擬機(jī)的操作系統(tǒng)內(nèi)核),無(wú)法管理其它倉(cāng)庫(kù)。不存在信息共享的情況。
因此,需要根據(jù)不同的應(yīng)用場(chǎng)景和需求采用不同的方式使用Docker技術(shù)或使用服務(wù)器虛擬化技術(shù)。例如一個(gè)典型的Docker應(yīng)用場(chǎng)景是當(dāng)主機(jī)上的Docker實(shí)例屬于單一用戶的情況下,在保證安全的同時(shí)可以充分發(fā)揮Docker的技術(shù)優(yōu)勢(shì)。對(duì)于隔離要求較高的環(huán)境如混合用戶環(huán)境,就可以使用服務(wù)器虛擬化技術(shù)。
聯(lián)系客服