Docker與虛擬機的簡介以及比較

Docker與虛擬機

Docker

什麼是Docker

Docker是一個集開發、打包、運行應用於一體的開放式平臺。Docker可以用來快速交付應用。使用Docker,你可以將應用程序從你的基礎設施中分離出來,並將基礎設施當做一個管理平臺。Docker可以加快打包時間,加快測試,加快發佈,縮短開發及運行代碼之間的週期。Docker通過結合內核容器化特點和工作流,並使之工具化來實現這一切,幫助管理和發佈你的應用。

Docker的兩個重要概念

鏡像(Images)

Docker鏡像是一個只讀的模板。包含了容器運行時所需要的文件系統和一些參數。鏡像是無狀態的,也不會改變。鏡像是用來創建容器的。你可以使用docker pull命令獲取一個別人已創建好的鏡像,或者使用dockerbuild來構建一個自己的鏡像。

容器(Containers)

Docker容器就像是一個文件夾,容器中包含了應用運行所需的一切。每個容器都是一個隔離的和安全的應用平臺。容器是鏡像的一個實例,它是有狀態的,而且隨時會改變,容器一般是短暫的。

Docker架構

Docker架構

說明:

該圖顯示Docker虛擬化的架構:其中Docker Engine可以簡單看成對Linux的NameSpace、Cgroup、鏡像管理文件系統操作的封裝。Docker並沒有和虛擬機一樣利用一個完全獨立的Guest OS實現環境隔離,它利用的是目前linux內核本身支持的容器方式實現資源和環境隔離。簡單的說,Docker是利用namespace實現系統環境的隔離;利用Cgroup實現資源限制;利用鏡像實現根目錄環境的隔離。

Docker Engine

Docker Engine屬於Docker的運行層。這是一套輕量化運行時及工具組合,負責管理容器、鏡像、構建 等等。它以原生方式運行在Linux系統之上,並由以下元素構成:

  • Docker Daemon,運行在主機計算機之上。

  • Docker Client,負責與Docker Daemon通信以執行命令。

  • REST API,用於同Docker Daemon遠程交互。

現在詳細介紹一下這三者:

Docker Daemon

Docker Daemon直接將執行命令發送至Docker Client——例如構建、運行以及分發等等。Docker Daemon運行在主機設備之上,但作爲用戶,我們永遠不會直接與該Daemon進行通信。Docker Client也可以運行在主機設備上,但並非必需。它亦能夠運行在另一臺設備上,並與運行在目標主機上的Docker Daemon進行遠程通信。

Docker Client

Docker Client是我們作爲最終用戶的通信對象。我們可以將其視爲Docker的UI。

我們進行的一切操作都將直接接入Docker Client,再由其將指令傳遞至Docker Daemon。

REST API

用於同Docker Daemon遠程交互。

Docker可以做什麼

  • 快速交付應用

  • 便捷的部署和調整

  • 高密集度,高負載

虛擬機

什麼是虛擬機

虛擬機在本質上就是在模擬一臺真實的計算機設備,同時遵循同樣的程序執行方式。虛擬機能夠利用“虛擬機管理程序”運行在物理設備之上。反過來,虛擬機管理程序則可運行在主機設備或者“裸機”之上。

傳統的虛擬機需要模擬整臺機器包括硬件,每臺虛擬機都需要有自己的操作系統,虛擬機一旦被開啓,預分配給他的資源將全部被佔用。,每一個虛擬機包括應用,必要的二進制和庫,以及一個完整的用戶操作系統。

虛擬機架構

虛擬機架構

說明:

該圖展示虛擬機的架構,其中Guest OS層和Hypervisor層在docker中被Docker Engine層所替代。虛擬機的Guest OS即爲虛擬機安裝的操作系統,它是一個完整操作系統內核;虛擬機的Hypervisor層可以簡單理解爲一個硬件虛擬化平臺,它在Host OS是以內核態的驅動存在的。

虛擬機實現資源隔離的方法是利用獨立的OS,並利用Hypervisor虛擬化CPU、內存、IO設備等實現的。例如,爲了虛擬CPU,Hypervisor會爲每個虛擬的CPU創建一個數據結構,模擬CPU的全部寄存器的值,在適當的時候跟蹤並修改這些值。需要指出的是在大多數情況下,虛擬機軟件代碼是直接跑在硬件上的,而不需要Hypervisor介入。只有在一些權限高的請求下,Guest OS需要運行內核態修改CPU的寄存器數據,Hypervisor會介入,修改並維護虛擬的CPU狀態。

Hypervisor虛擬化內存的方法是創建一個shadow page table。正常的情況下,一個page table可以用來實現從虛擬內存到物理內存的翻譯。在虛擬化的情況下,由於所謂的物理內存仍然是虛擬的,因此shadow page table就要做到:虛擬內存->虛擬的物理內存->真正的物理內存。

對於IO設備虛擬化,當Hypervisor接到page fault,並發現實際上虛擬的物理內存地址對應的是一個I/O設備,Hypervisor就用軟件模擬這個設備的工作情況,並返回。比如當CPU想要寫磁盤時,Hypervisor就把相應的數據寫到一個host OS的文件上,這個文件實際上就模擬了虛擬的磁盤。

總結

Docker和虛擬機有各自擅長的領域,在軟件開發、測試場景和生產運維場景中各有優劣

  1. Docker啓動快速屬於秒級別。虛擬機通常需要幾分鐘去啓動。

  2. Docker需要的資源更少,Docker在操作系統級別進行虛擬化,Docker容器和內核交互,幾乎沒有性能損耗,性能優於通過Hypervisor層與內核層的虛擬化。

  3. Docker更輕量,Docker的架構可以共用一個內核與共享應用程序庫,所佔內存極小。同樣的硬件環境,Docker運行的鏡像數遠多於虛擬機數量。對系統的利用率非常高。

  4. 與虛擬機相比,Docker隔離性更弱,Docker屬於進程之間的隔離,虛擬機可實現系統級別隔離。

  5. 安全性:Docker的安全性也更弱。Docker的租戶root和宿主機root等同,一旦容器內的用戶從普通用戶權限提升爲root權限,它就直接具備了宿主機的root權限,進而可進行無限制的操作。虛擬機租戶root權限和宿主機的root虛擬機權限是分離的,並且虛擬機利用如Intel的VT-d和VT-x的ring-1硬件隔離技術,這種隔離技術可以防止虛擬機突破和彼此交互,而容器至今還沒有任何形式的硬件隔離,這使得容器容易受到攻擊。

  6. 可管理性:Docker的集中化管理工具還不算成熟。各種虛擬化技術都有成熟的管理工具,例如VMware vCenter提供完備的虛擬機管理能力。

  7. 高可用和可恢復性:Docker對業務的高可用支持是通過快速重新部署實現的。虛擬化具備負載均衡、高可用、容錯、遷移和數據保護等經過生產實踐檢驗的成熟保障機制,VMware可承諾虛擬機99.999%高可用,保證業務連續性。

  8. 快速創建、刪除:虛擬化創建是分鐘級別的,Docker容器創建是秒級別的,Docker的快速迭代性,決定了無論是開發、測試、部署都可以節約大量時間。

  9. 交付、部署:虛擬機可以通過鏡像實現環境交付的一致性,但鏡像分發無法體系化;Docker在Dockerfile中記錄了容器構建過程,可在集羣中實現快速分發和快速部署。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章