虛擬機(jī)是云計(jì)算的核心技術(shù)之一,也是目前云主機(jī)的主要實(shí)現(xiàn)方式。除了虛擬機(jī),容器也在云計(jì)算中應(yīng)用得越來(lái)越多。那么容器與虛擬機(jī)到底有什么區(qū)別?
目前容器技術(shù)的代表就是Docker,很多人認(rèn)為容器將取代虛擬機(jī),成為云計(jì)算的主流技術(shù)。說(shuō)到Docker,就要從Docker的底層技術(shù)LXC(Linux Container)說(shuō)起。
與VMWare為代表的虛擬機(jī)技術(shù)不同,LXC是在操作系統(tǒng)層面為進(jìn)程提供虛擬的運(yùn)行環(huán)境,而不是通過(guò)硬件抽象層來(lái)對(duì)硬件進(jìn)行虛擬化。VMWare虛擬機(jī)是面向操作系統(tǒng)的,而LXC是面向進(jìn)程的。
LXC提供的虛擬運(yùn)行環(huán)境就是容器,操作系統(tǒng)可以為容器分配資源,包括特定比例的cpu時(shí)間、IO時(shí)間,內(nèi)存,外設(shè)訪問(wèn)控制,并提供獨(dú)立的命名空間(namespace)。
LXC的實(shí)現(xiàn)是靠Linux內(nèi)核在資源管理和隔離控制方面的相關(guān)特性。
LXC在資源管理方面依賴于Linux內(nèi)核的控制組(cgroups)子系統(tǒng),cgroups子系統(tǒng)是Linux內(nèi)核提供的一個(gè)基于進(jìn)程組的資源管理的框架,可以為特定的進(jìn)程組限定可以使用的資源。
LXC在隔離控制方面依賴于Linux內(nèi)核的namespace特性,命名空間可以讓進(jìn)程與進(jìn)程之間,用戶與用戶之間彼此看不到對(duì)方。
Docker 是 PaaS 提供商 dotCloud ,也就是后來(lái)的Docker公司,開(kāi)源的一個(gè)基于 LXC 的高級(jí)容器引擎,源代碼托管在 Github 上, 基于go語(yǔ)言并遵從Apache2.0協(xié)議開(kāi)源。
Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包應(yīng)用到一個(gè)可移植的容器中,然后發(fā)布到Linux 機(jī)器上。容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口。
Docker基于Linux的LXC技術(shù),可以認(rèn)為是LXC的上層封裝。當(dāng)然除了容器以外,Docker還包括了鏡像管理的功能。從資源管理角度來(lái)說(shuō),Docker基于LXC,LXC基于cgroup。
以VMWare公司產(chǎn)品、KVM等為代表的虛擬機(jī)技術(shù),是通過(guò)對(duì)硬件的抽象來(lái)實(shí)現(xiàn)的。關(guān)于硬件抽象的原理,可以參考前文《云計(jì)算IaaS的核心技術(shù):虛擬化技術(shù)》。
以Docker為代表的容器技術(shù),是操作系統(tǒng)層面的虛擬化技術(shù)。與HAL(硬件抽象層)層面的虛擬化技術(shù)相比,有以下區(qū)別:
虛擬化開(kāi)銷。由于利用了Linux內(nèi)核提供的LXC特性,所以容器的虛擬化開(kāi)銷更小。傳統(tǒng)虛擬機(jī)要先創(chuàng)建虛擬機(jī),然后安裝操作系統(tǒng),最后部署應(yīng)用。
鏡像文件。由于容器鏡像不需要包括Guest OS,只需要包括應(yīng)用及其依賴包,因此鏡像文件更小。
部署。傳統(tǒng)的虛擬化技術(shù)則需要先創(chuàng)建虛擬機(jī),然后安裝系統(tǒng),再部署應(yīng)用。容器利用LXC相關(guān)命令,可直接創(chuàng)建并啟動(dòng)應(yīng)用的運(yùn)行環(huán)境。
跨平臺(tái)。由于底層基于LXC,所以Docker必須基于Linux系統(tǒng)搭建。虛擬機(jī)管理程序Hypervisor可以運(yùn)行在不同的操作系統(tǒng)上,甚至直接運(yùn)行在裸機(jī)上。