目前雲計算平台常用的虛擬化技術有虛擬機(Virtual Machine)和容器(Container)兩種。虛擬機已經是比較成熟的技術,容器技術作為下一代虛擬化技術,國內的各廠商應用還不廣,但似乎其代表着未來的發展方向。
先來看一下虛擬機和容器的架構圖:
左圖是虛擬機
從下到上理解:
- 基礎設施(Infrastructure)。它可以是你的個人電腦,數據中心的服務器,或者是雲主機。
- 主機操作系統(Host Operating System)
- 虛擬機管理系統(Hypervisor)。利用Hypervisor,可以在主操作系統之上運行多個不同的從操作系統。類型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V、Xen以及KVM。類型2的Hypervisor有VirtualBox和VMWare workstation。
- 客戶機操作系統(Guest Operating System)。假設你需要運行3個相互隔離的應用,則需要使用Hypervisor啟動3個客戶機操作系統,也就是3個虛擬機。這些虛擬機都非常大,也許有700MB,這就意味着它們將占用2.1GB的磁盤空間。更糟糕的是,它們還會消耗很多CPU和內存。
- 各種依賴。每一個客戶機操作系統都需要安裝許多依賴。如果你的應用需要連接PostgreSQL的話,則需要安裝libpq-dev;如果你使用Ruby的話,應該需要安裝gems;如果使用其他編程語言,比如Python或者Node.js,都會需要安裝對應的依賴庫。
- 應用。安裝依賴之后,就可以在各個客戶機操作系統分別運行應用了,這樣各個應用就是相互隔離的。
由於有了多個操作系統,所以虛擬機的架構中我們知道每個虛機中都有一個獨立的Kernel.
什么是Kernel?
簡單來講Kernel 就是連接操作系統(OS)和硬件(Hardware)的一個中間組件。
大概個架構圖如下

上面的右圖是
從下到上理解上圖:
- 基礎設施(Infrastructure)。
- 主操作系統(Host Operating System)。所有主流的Linux發行版都可以運行Docker。對於MacOS和Windows,也有一些辦法”運行”Docker。
- Docker守護進程(Docker Daemon)。Docker守護進程取代了Hypervisor,它是運行在操作系統之上的后台進程,負責管理Docker容器。
- 各種依賴。對於Docker,應用的所有依賴都打包在Docker鏡像中,Docker容器是基於Docker鏡像創建的。
- 應用。應用的源代碼與它的依賴都打包在Docker鏡像中,不同的應用需要不同的Docker鏡像。不同的應用運行在不同的Docker容器中,它們是相互隔離的。
很明顯圖中只有一個操作系統,即只有一個獨立的Kernel.
我們知道每個操作系統有多個進程(Process)
簡單來講容器可以理解為進程沙盒(sandbox)
那到底這個進程沙盒里裝了些什么呢?
- process namespace (進程命名空間): 來規定可以使用什么資源
- Cgroups (控制組) : 來規定可以用多少資源:如CPU,內存, 網絡等
- Union-capable file system: 把不同文件聯合到一個掛載點的文件系統服務

在linux系統中有6種Namespace可以給linux資源提供進程級別的隔離。Namespace保證了每個容器只可以看到它自己所擁有的環境,並且不會影響運行在其他容器中的進程。
Namespace也讓容奇港擁有自己的網絡設備,因此每一個容器都有自己的IP地址和主機名,這讓容器之間可以相互獨立。
相對虛擬機架構來講,容器架構有什么好處呢?
左圖的虛擬機架構中,我們的主機有Host 三個不同的操作系統,這個就意味着需要模擬(emulate) 三個操作系統。
對比右圖的容器架構中,我們的3個容器都在一個操作系統上運行,並不需要模擬任何操作系統。所以相對左圖我們會消耗更少的資源,並達到跟虛擬機架構中等同的效果。
用一張圖大概描述容器相對虛擬機的優勢

對比圖
- 容器架構降低了硬件成本
- 更快速的部署開發/測試/生產環境
- 更簡便的維護開發/測試/生產環境
- 與微服務架構更為契合
參考:
https://www.jianshu.com/p/d132333dbf40
https://www.jianshu.com/p/d132333dbf40