目前雲計算平臺經常使用的虛擬化技術有虛擬機(Virtual Machine)和容器(Container)兩種。虛擬機已是比較成熟的技術,容器技術做爲下一代虛擬化技術,國內的各廠商應用還不廣,但彷佛其表明着將來的發展方向。linux
先來看一下虛擬機和容器的架構圖:編程
![](http://static.javashuo.com/static/loading.gif)
左圖是虛擬機服務器
從下到上理解:網絡
- 基礎設施(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.spa
咱們知道每一個操做系統有多個進程(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.zhihu.com/question/48174633/answer/180743885