一、Docker簡介
Docker 項目的目標是實現輕量級的操作系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。
在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在操作系統層面上實現虛擬化,直接復用本地主機的操作系統,而傳統方式則是在硬件層面實現。
二、Docker與KVM對比
作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。
-
1. Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多。 其次,Docker 對系統資源的利用率很高,一台主機上可以同時運行數千個 Docker 容器。
-
2. 容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷盡量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啟動 10 個隔離的應用即可。
-
3. 虛擬化技術依賴物理CPU和內存,是硬件級別的;而docker構建在操作系統上,利用操作系統的containerization技術,所以docker甚至可以在虛擬機上運行。
-
4. 虛擬化系統一般都是指操作系統鏡像,比較復雜,稱為“系統”;而docker開源而且輕量,稱為“容器”,單個容器適合部署少量應用,比如部署一個Redis、一個memcached。
-
5. 傳統的虛擬化技術使用快照來保存狀態;而docker在保存狀態上不僅更為輕便和低成本,而且引入了類似源代碼管理機制,將容器的快照歷史版本一一記錄,切換成本很低。
-
6. 傳統的虛擬化技術在構建系統的時候較為復雜,需要大量的人力;而docker可以通過Dockfile來構建整個容器,重啟和構建速度很快。更重要的是Dockfile可以手動編寫,這樣應用程序開發人員可以通過發布Dockfile來指導系統環境和依賴,這樣對於持續交付十分有利。
-
7. 當然KVM對比於容器也有一個比較大的優勢就是可以使用不同的操作系統或內核。所以,舉例說,你可以使用微軟Azure,同時運行Windows Server2012的實例和SUSE Linux企業級服務器的實例。至於Docker,所有容器都必須使用同樣的操作系統和內核。
具體說來,Docker 在如下幾個方面具有較大的優勢。
2.1 更快速的交付和部署
對開發和運維(devop)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。
開發者可以使用一個標准的鏡像來構建一套開發容器,開發完成之后,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速迭代應用程序,並讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。
2.2 更高效的虛擬化
Docker 容器的運行不需要額外的 hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。
2.3 更輕松的遷移和擴展
Docker 容器幾乎可以在任意的平台上運行,包括物理機、虛擬機、公有雲、私有雲、個人電腦、服務器等。這種兼容性可以讓用戶把一個應用程序從一個平台直接遷移到另外一個。
2.4 更簡單的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化並且高效的管理。
2.5 對比傳統虛擬機(KVM)總結
特性 |
容器 |
虛擬機 |
啟動 |
秒級 |
分鍾級 |
硬盤使用 |
一般為 MB |
一般為 GB |
性能 |
接近原生 |
弱於 |
系統支持量 |
單機支持上千個容器 |
一般幾十個 |
三、Docker在實際應用中的一些問題和局限性
-
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)的支持,但是這方面暫時還沒有很明顯的最佳解決方案,所以大多數人都在摸索和搭建自己的解決方案。