虛擬機(VM)是對某種計算機操做系統的模擬,虛擬機的實現是基於計算機虛擬化的架構和指令,具體可能須要特定的硬件、軟件、或軟硬件同時的支持。在本文中希雲將爲你們揭曉Docker容器和全虛擬化之間的區別。docker
Docker是一個建立封裝好的隔離計算機環境,每一個封裝好的環境都被稱爲容器。架構
啓動一個Docker容器很是迅速,由於:spa
每一個容器共享宿主系統的內核操作系統
然而,各個容器都運行着一個Linux的副本翻譯
這意味着沒有hypervisor,並且不須要額外的啓動進程
對比之下,KVM, VirtualBox 或者 VMware之類的虛擬機實現是不一樣的。ip
宿主系統 vs 客戶系統資源
若是是安裝在虛擬機上,客戶系統能夠與宿主系統不一樣get
若是是安裝在一個磁盤分區上,客戶系統必須與宿主系統相同虛擬機
宿主系統
是直接安裝在計算機上的原生系統
客戶系統
是安裝在一個虛擬機上,或者在宿主機的一個分區上的系統
是一種計算機軟件、固件或者硬件,用於建立並運行虛擬機的
一個系統中安裝着hypervisor,裏邊運行着一個或多個虛擬機,這個系統可被定義爲宿主機
各個虛擬機被定義爲客戶機
使用Linux虛擬機去運行容器
基於Linux內核提供的組件構建的(特別是cgroups和namespaces)
不像虛擬機,不須要包含一個獨立的操做系統
由Docker建立的一個封閉計算環境
Linux平臺上的Docker
非Linux平臺上的Docker
是管理容器的持久進程
使用Linux特定的內核特性去實現
全虛擬化的系統分配到的是獨有的一組資源,只有極少許的資源會共享,是有更強的隔離性,可是更加劇了(須要更加多的資源)。用Docker容器有弱些的隔離性,可是它們更加輕量,須要更少的資源,因此你能夠絕不費力地啓動上千個容器。
基本上,Docker容器和全虛擬化VM有着本質上不一樣的目標
VM是用於徹底模擬一個外部環境
相反地,容器的系統(或者更準確來講,是內核)必須與宿主系統一致,並且與容器和宿主間共享着
在一個全虛擬化VM的實現上,Hypervisor主要做用是翻譯客戶系統和宿主系統之間的指令
每一個虛擬機中,應用以及相關依賴運行在一個完整的操做系統上
若是你須要同時運行不一樣的操做系統(如Windows, OS/X 或 BSD),或者須要爲特定平臺的系統編譯程序,那你須要的是一個全虛擬化VM的實現
容器使應用具備可移植性,並能自包含
這意味着沒有hypervisor,並且不須要額外的系統啓動
容器引擎負責啓動或中止容器,這與虛擬機實現中的hypervisor相似
然而,容器中運行的進程與宿主系統的進程是同行級別的,因此不會被相關的hypervisor殺掉
各容器共享着宿主機的內核
各容器共享着宿主機的內核
在本文中,咱們只關注了Linux平臺下的Docker實現,換言之,咱們討論的是排除掉了非Linux平臺(也就是Windows,Mac OS X等等),由於Docker守護進程使用特定的Linux內核特性,你不能在Windows 或 Mac OS X直接運行原生的Docker。在非Linux平臺上,Docker使用Linux虛擬機去運行容器。