虛擬化按目前使用的類別分類,可分為兩種,主機級別虛擬化和容器級別虛擬化
這種虛擬化,hypervisor繞過我們熟知的os內核,直接接管硬體,然後自己再虛擬出對應所需要的os內核。主要產品有VMware ESXI,如下圖左側
宿主機虛擬化,hypervisor層運行於宿主機os之上,通過主機os內核來進行硬體的內核調試,主要產品有VMware workstation,如上圖右側
容器虛擬化,有別於主機虛擬化,其存在宿主機os,但其與主機級別虛擬化的type-II不一樣,並非進行內核的虛擬化,而是通過namespace進行虛擬化,通過namespace的隔離,進行各程序的隔離,通過cgroups,進行資源的控制,以此來進行虛擬化。如下圖
linux 內核從版本 2.4.19 開始陸續引入了 namespace 的概念。當一個程序運行於主機之中時,其基本要求有,系統根文件目錄、運行pid進程號、主機名、網卡、ipc通信、程序運行用戶這六大類。
linux將以上六類進行了內核級別的虛擬化,這六大類統稱為namespace
因為centos6的內核為2.6,所以user name不支持,所以centos6天然不太支持容器,雖然可以通過升級內核來進行支持,不過建議直接使用centos7以上的系統
cgroups: Linux control groups,linux為運行的任務分配cpu、ram等,當namespace為容器進行隔離之後,還需要對每個容器進行資源的使用進行控制,不能讓其搶佔其它容器的資源。
cgroups主要對以下內容進行資源控制
AUFS:Union File System,聯合文件系統,主要功能是將位於不同物理位置的目錄合併成同一個目錄,有點類似於hadoop中hdfs的分布式存儲。
linux系統啟動,至少需要有兩種文件系統,一種是bootfs,一種是rootfs,
同一個內核版本的所有linux系統的bootfs是相同的,rootfs不同
在docker images中,其採用的是分層技術,基礎鏡像中的roofs會一直保持只讀模式,docker利用union mount來在這個rootfs上增加更多的只讀文件系統,最後它們看起來就像一個文件系統即容器的rootfs。
在docker的分層鏡像中,除了支持aufs之外,還支持devicemapper,因為在aufs暫時還未被收納入linux內核主幹,ubuntu14支持aufs,所以docker在ubuntu上面使用aufs,而作為比較保留的redhat系列上,docker使用的devicemapper