http://www.techug.com/post/comparing-virtual-machines-vs-docker-containers.htmlhtml
譯者按: 各類虛擬機技術開啓了雲計算時代;而Docker,做爲下一代虛擬化技術,正在改變咱們開發、測試、部署應用的方式。那虛擬機與Docker究竟有何不一樣呢?前端
原文: Comparing Virtual Machines vs Docker Containersdocker
譯者: Fundebug數據庫
爲了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原做者全部,翻譯僅用於學習。編程
首先,你們須要明確一點,Docker容器不是虛擬機。後端
2014年,當我第一次接觸Docker的時候,我把它比作一種輕量級的虛擬機。這樣作無可厚非,由於Docker最初的成功祕訣,正是它比虛擬機更節省內存,啓動更快。Docker不停地給你們宣傳,」虛擬機須要數分鐘啓動,而Docker容器只須要50毫秒」。服務器
然而,Docker容器並不是虛擬機,咱們不妨來比較一下它們。編程語言
理解虛擬機
使用虛擬機運行多個相互隔離的應用時,以下圖:wordpress
從下到上理解上圖:
- 基礎設施(Infrastructure)。它能夠是你的我的電腦,數據中心的服務器,或者是雲主機。
- 主操做系統(Host Operating System)。你的我的電腦之上,運行的多是MacOS,Windows或者某個Linux發行版。
- 虛擬機管理系統(Hypervisor)。利用Hypervisor,能夠在主操做系統之上運行多個不一樣的從操做系統。類型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。類型2的Hypervisor有VirtualBox和VMWare。
- 從操做系統(Guest Operating System)。假設你須要運行3個相互隔離的應用,則須要使用Hypervisor啓動3個從操做系統,也就是3個虛擬機。這些虛擬機都很是大,也許有700MB,這就意味着它們將佔用2.1GB的磁盤空間。更糟糕的是,它們還會消耗不少CPU和內存。
- 各類依賴。每個從操做系統都須要安裝許多依賴。若是你的的應用須要鏈接PostgreSQL的話,則須要安裝libpq-dev;若是你使用Ruby的話,應該須要安裝gems;若是使用其餘編程語言,好比Python或者Node.js,都會須要安裝對應的依賴庫。
- 應用。安裝依賴以後,就能夠在各個從操做系統分別運行應用了,這樣各個應用就是相互隔離的。
理解Docker容器
使用Docker容器運行多個相互隔離的應用時,以下圖:post
不難發現,相比於虛擬機,Docker要簡潔不少。由於咱們不須要運行一個臃腫的從操做系統了。
從下到上理解上圖:
- 基礎設施(Infrastructure)。
- 主操做系統(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的優點,你們也沒有必要徹底否認虛擬機技術,由於二者有不一樣的使用場景。虛擬機更擅長於完全隔離整個運行環境。例如,雲服務提供商一般採用虛擬機技術隔離不一樣的用戶。而Docker一般用於隔離不一樣的應用,例如前端,後端以及數據庫。
若是你對Docker感興趣的話,不妨學習一下Dive Into Docker course。