在對比Docker和虛擬機前,先簡單了解下虛擬化,明確Docker和虛擬機分別對應的虛擬化級別,然后對Docker和虛擬機進行比較。需要注意的是,Docker和虛擬機并沒有什么可比性,而是Docker使用的容器技術和虛擬機使用的虛擬化技術的比較。
虛擬化(Virtualization)簡介
虛擬化是一個通用的概念,在不同的領域有不同的理解。在計算機領域,一般指的是計算虛擬化(Computer Virtualization)。維基百科上對計算機虛擬化的定義如下:
在計算機技術中,虛擬化是一種資源管理技術,是將計算機的各種實體資源,如服務器、網絡、內存及存儲等,
予以抽象、轉換后呈現出來,打破實體結構間的不可切割的障礙,使用戶可以用比原來的組態更好的方式來應用這些資源。
可見,虛擬化的核心是對資源的抽象,目標往往是為了在同一個主機上同時運行多個系統或應用,從而提高系統資源的利用率,并且帶來降低成本、方便管理和容錯容災等好處。
根據作用的對象,可將虛擬化分為基于硬件的虛擬化和基于軟件的虛擬化。注意,真正意義上的基于硬件的虛擬化技術并不多見,少數如網卡中的單根多IO虛擬化(Single Root I/O Virtualization and Sharing Specification,SR-IOV)等技術,不在本文的討論范圍。
基于軟件的虛擬化從對象所在的層次,有可以分為應用虛擬化和平臺虛擬化。其中應用虛擬化一般指的是一些模擬設備,如一些模擬器軟件。平臺虛擬化又可細分為以下幾個子類:
(1) 完全虛擬化。虛擬機模擬完整的底層硬件環境和特權指令的執行過程,客戶操作系統無需進行修改。如VMware Workstation、VirtualBox等。
(2) 硬件輔助虛擬化。利用硬件輔助支持處理敏感指令來實現完全虛擬化的功能,客戶操作系統無需修改,如VMware Workstation、KVM等。
(3) 部分虛擬化。只針對部分硬件資源進行虛擬化,客戶操作系統修改進行修改。現在某些虛擬機技術的早期版本支持部分虛擬化。
(4) 超虛擬化。部分硬件接口以軟件的形式提供給客戶操作系統,客戶操作系統需要進行修改,如早期的Xen。
(5) 操作系統級虛擬化。內核通過創建多個虛擬的操作系統實例(內核和庫)來隔離(如容器技術)不同的進程,如Docker。
Docker與虛擬機比較
對于虛擬機來說,虛擬機通過硬件虛擬化功能模擬出運行一個操作系統所需的各種硬件,比如CPU、內存、I/O設備等。然后,它在這些虛擬的硬件上安裝一個新的操作系統——客戶操作系統(Guest OS)。這樣,用戶的應用程序就可以在這個虛擬的機器中運行。
對于Docker來說,Docker通過容器技術,在操作系統的上層提供了隔離的環境。然后用戶的應用程序就可以在這個隔離的環境中運行。
虛擬機和Docker的架構差異可以用下圖表示:
從上圖可知,虛擬機通過虛擬的硬件,可安裝一個操作提供和其他應用程序。所以,虛擬機創建的時間比較長,啟動時間以分鐘為單位。因為在運行應用程序前還得運行整個操作系統,所以分配所需的CPU、內存、磁盤等資源較多。同時,基于虛擬機方式運行N個不同的應用需要啟用N個虛擬機(每個虛擬機需要單獨分配獨占的內存、磁盤等資源),運行密度較低。虛擬機因為提供了隔離操作系統的環境,所以可以實現完全隔離,從而保證安全性。
而Docker等容器引擎,可以和主機的內核直接打交道。因為容器中運行的應用程序和計算機的操作系統之間沒有額外的中間層,沒有資源被冗余軟件的運行或虛擬硬件的模擬浪費掉。所以,容器的創建時間較短,啟動時間以秒為單位。且分配所需的CPU、內存、磁盤等資源較少。同時,基于容器方式運行N個不同的應用只需要啟用N個容器即可,運行密度較高。Docker等容器引擎利用namespace、cgroup、根文件系統等技術實現了容器隔離環境,支持進程級隔離,存在一定的安全風險。但是,從1.3.0版本開始,Docker重點改善了容器的安全控制和鏡像的安全機制,極大地提高了使用Docker的安全性。在已知的大規模應用中,目前尚未出現值得擔憂的安全隱患。
Docker等容器引擎與虛擬機的比較,可以總結為一下幾個方面:
特性 | 容器 | 虛擬機 |
---|---|---|
隔離 | 提供與主機和其他容器的輕度隔離,但不提供與虛擬機一樣強的安全邊界 | 提供與主機和其他VM的完全隔離。 |
啟動速度 | 秒級 | 分鐘級 |
性能 | 接近原生 | 較弱 |
資源占用 | 運行操作系統的用戶模式部分,可以對其進行定制,使之只包含應用所需的服務,減少所使用的系統資源。 | 運行包含內核的完整操作系統,需要更多的系統資源,如CPU、內存、存儲等。 |
運行密度 | 單機支持上千個容器 | 單機一般十幾個 |
安全性 | 輕度隔離,存在不安全隱患 | 完全隔離,安全性更高 |
參考
《Docker實戰》 Jeff Nickoloff 著, 胡震,楊潤青 黃帥 譯
《Docker技術入門與實戰》 楊保華 戴王劍 曹亞侖 著
https://blog.daocloud.io/4001.html 容器與虛擬機
https://zhuanlan.zhihu.com/p/81525291 虛擬機與容器的區別
https://zhuanlan.zhihu.com/p/271846374 容器、Docker、虛擬機
https://learn.microsoft.com/zh-cn/virtualization/windowscontainers/about/containers-vs-vm 容器與虛擬機
https://aijishu.com/a/1060000000206531 Docker容器、虛擬機和裸機運行的性能比較