Docker 項目的目標是實現輕量級的操做系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。linux
在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不須要去關心容器的管理,使得操做更爲簡便。用戶操做 Docker 的容器就像操做一個快速輕量級的虛擬機同樣簡單。web
下面的圖片比較了 Docker 和傳統虛擬化方式的不一樣之處,可見容器是在操做系統層面上實現虛擬化,直接複用本地主機的操做系統,而傳統方式則是在硬件層面實現。docker
做爲一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具備衆多的優點。服務器
1. Docker 容器的啓動能夠在秒級實現,這相比傳統的虛擬機方式要快得多。 其次,Docker 對系統資源的利用率很高,一臺主機上能夠同時運行數千個 Docker 容器。網絡
2. 容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷儘可能小。傳統虛擬機方式運行 10 個不一樣的應用就要起 10 個虛擬機,而Docker 只須要啓動 10 個隔離的應用便可。架構
3. 虛擬化技術依賴物理CPU和內存,是硬件級別的;而docker構建在操做系統上,利用操做系統的containerization技術,因此docker甚至能夠在虛擬機上運行。框架
4. 虛擬化系統通常都是指操做系統鏡像,比較複雜,稱爲「系統」;而docker開源並且輕量,稱爲「容器」,單個容器適合部署少許應用,好比部署一個Redis、一個memcached。運維
5. 傳統的虛擬化技術使用快照來保存狀態;而docker在保存狀態上不只更爲輕便和低成本,並且引入了相似源代碼管理機制,將容器的快照歷史版本一一記錄,切換成本很低。memcached
6. 傳統的虛擬化技術在構建系統的時候較爲複雜,須要大量的人力;而docker能夠經過Dockfile來構建整個容器,重啓和構建速度很快。更重要的是Dockfile能夠手動編寫,這樣應用程序開發人員能夠經過發佈Dockfile來指導系統環境和依賴,這樣對於持續交付十分有利。性能
7. 固然KVM對比於容器也有一個比較大的優點就是可使用不一樣的操做系統或內核。因此,舉例說,你可使用微軟Azure,同時運行Windows Server2012的實例和SUSE Linux企業級服務器的實例。至於Docker,全部容器都必須使用一樣的操做系統和內核。
具體說來,Docker 在以下幾個方面具備較大的優點。
對開發和運維(devop)人員來講,最但願的就是一次建立或配置,能夠在任意地方正常運行。
開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。 Docker 能夠快速建立容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做的。 Docker 容器很輕很快!容器的啓動時間是秒級的,大量地節約開發、測試、部署的時間。
Docker 容器的運行不須要額外的 hypervisor 支持,它是內核級的虛擬化,所以能夠實現更高的性能和效率。
Docker 容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。
使用 Docker,只須要小小的修改,就能夠替代以往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。
特性 |
容器 |
虛擬機 |
啓動 |
秒級 |
分鐘級 |
硬盤使用 |
通常爲 MB |
通常爲 GB |
性能 |
接近原生 |
弱於 |
系統支持量 |
單機支持上千個容器 |
通常幾十個 |
LXC是基於cgroup等linux kernel功能的,所以Container的guest系統只能是linux base的
隔離性相比KVM之類的虛擬化方案仍是有些欠缺,全部container公用一部分的運行庫
網絡管理相對簡單,主要是基於namespace隔離
cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(因此dotcloud主要是安內存收費)
container隨着用戶進程的中止而銷燬,container中的log等用戶數據不便收集
另外,Docker是面向應用的,其終極目標是構建PAAS平臺,而現有虛擬機主要目的是提供一個靈活的計算資源池,是面向架構的,其終極目標是構建一個IAAS平臺,因此它不能替代傳統虛擬化解決方案。目前在容器可管理性方面,對於方便運維,提供UI來管理監控各個containers的功能還不足,還都是第三方實現。由於容器技術自己更適於解決大規模應用場景,因此一般都是集羣基礎上的部署、運維,可是目前對這一系列任務的自動化處理尚無統一的或者標準的框架。若是要讓Docker真正在實際環境中發揮最大的效能而且易於維護,就須要有成熟穩定的資源編排(orchestration)、資源調度(scheduling)和部署(deployment)的支持,可是這方面暫時尚未很明顯的最佳解決方案,因此大多數人都在摸索和搭建本身的解決方案。