【摘要】各類虛擬機技術開啓了雲計算時代;而Docker,做爲下一代虛擬化技術,正在改變咱們開發、測試、部署應用的方式。那虛擬機與Docker究竟有何不一樣呢?前端
首先,你們須要明確一點,Docker容器不是虛擬機。數據庫
當我第一次接觸Docker的時候,我把它比作一種輕量級的虛擬機。這樣作無可厚非,由於Docker最初的成功祕訣,正是它比虛擬機更節省內存,啓動更快。Docker不停地給你們宣傳,"虛擬機須要數分鐘啓動,而Docker容器只須要50毫秒"。編程
然而,Docker容器並不是虛擬機,咱們不妨來比較一下它們。後端
使用虛擬機運行多個相互隔離的應用時,以下圖:服務器
從下到上理解上圖:編程語言
基礎設施(Infrastructure)。它能夠是你的我的電腦,數據中心的服務器,或者是雲主機。測試
主操做系統(Host Operating System)。你的我的電腦之上,運行的多是MacOS,Windows或者某個Linux發行版。雲計算
虛擬機管理系統(Hypervisor)。利用Hypervisor,能夠在主操做系統之上運行多個不一樣的從操做系統。類型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。類型2的Hypervisor有VirtualBox和VMWare。spa
從操做系統(Guest Operating System)。假設你須要運行3個相互隔離的應用,則須要使用Hypervisor啓動3個從操做系統,也就是3個虛擬機。這些虛擬機都很是大,也許有700MB,這就意味着它們將佔用2.1GB的磁盤空間。更糟糕的是,它們還會消耗不少CPU和內存。操作系統
各類依賴。每個從操做系統都須要安裝許多依賴。若是你的的應用須要鏈接PostgreSQL的話,則須要安裝libpq-dev;若是你使用Ruby的話,應該須要安裝gems;若是使用其餘編程語言,好比Python或者Node.js,都會須要安裝對應的依賴庫。
應用。安裝依賴以後,就能夠在各個從操做系統分別運行應用了,這樣各個應用就是相互隔離的。
使用Docker容器運行多個相互隔離的應用時,以下圖:
主操做系統(Host Operating System)。全部主流的Linux發行版均可以運行Docker。對於MacOS和Windows,也有一些辦法"運行"Docker。
Docker守護進程(Docker Daemon)。Docker守護進程取代了Hypervisor,它是運行在操做系統之上的後臺進程,負責管理Docker容器。
各類依賴。對於Docker,應用的全部依賴都打包在Docker鏡像中,Docker容器是基於Docker鏡像建立的。
應用。應用的源代碼與它的依賴都打包在Docker鏡像中,不一樣的應用須要不一樣的Docker鏡像。不一樣的應用運行在不一樣的Docker容器中,它們是相互隔離的。
Docker守護進程能夠直接與主操做系統進行通訊,爲各個Docker容器分配資源;它還能夠將容器與主操做系統隔離,並將各個容器互相隔離。虛擬機啓動須要數分鐘,而Docker容器能夠在數毫秒內啓動。因爲沒有臃腫的從操做系統,Docker能夠節省大量的磁盤空間以及其餘系統資源。
說了這麼多Docker的優點,你們也沒有必要徹底否認虛擬機技術,由於二者有不一樣的使用場景。虛擬機更擅長於完全隔離整個運行環境。例如,雲服務提供商一般採用虛擬機技術隔離不一樣的用戶。而Docker一般用於隔離不一樣的應用,例如前端,後端以及數據庫。