1. 程式人生 > >3.Docker與LXC、虛擬化技術的區別——虛擬化技術本質上是在模擬硬件,Docker底層是LXC,本質都是cgroups是在直接操作硬件

3.Docker與LXC、虛擬化技術的區別——虛擬化技術本質上是在模擬硬件,Docker底層是LXC,本質都是cgroups是在直接操作硬件

相對 art 下載 replace tar mes 虛擬化存儲 不同配置 viso

先說和虛擬化技術的區別

難道虛擬技術就做不到嗎?

不不不,虛擬技術也可以做到,但是會有一定程度的性能損失,靈活度也會下降。容器技術不是模仿硬件層次,而是 在Linux內核裏使用cgroup和namespaces來打造輕便的、將近裸機速度的虛擬技術操作系統環境。因為不是虛擬化存儲,所以容器技術不會管 底層存儲或者文件系統,而是你放哪裏,它操作哪裏。

這從根本上改變了我們如何虛擬化工作負載和應用程序,因為容器速度比硬件虛擬化技術更快,更加便捷,彈性擴容的更加高效,只是它的工作負載要求操作系統,而不是Linux或特定的Linux內核版本。

那VMWare就這樣玩完了?

沒那麽快!虛擬技術相對成熟,又有廣泛的工具,還有生態系統來支持它在不同環境下的配置。至於工作負載,它要求非Linux操作系統,或者只能使用特定的核心虛擬化技術。

Docker並不是LXC的替代品,Docker的底層就是使用了LXC來實現的。LXC將Linux進程沙盒化,使得進程之間相互隔離,並且能夠控制各進程的資源分配。
在LXC的基礎之上,Docker提供了一系列更強的功能。

這裏整理《Docker進階與實戰 》中提到的幾個問題,這些問題也是在面試過程中經常被問到的。

一、Docker在LXC基礎上做了什麽

LXC,一般指Linux Container,即內核容器技術的簡稱。Docker在內核容器技術上做了什麽工作,簡單的說,Docker在內核容器技術(Cgroup和Namespace)的基礎上,提供了一個更高層的控制工具,該工具包含以下特性:

1、跨主機部署。Docker定義鏡像格式,該格式將應用程序和其所依賴的文件打包到同一個鏡像文件中,從而使其在轉移到任何運行Docker的機器中時都可以運行,並能保證在任何機器中該應用程序執行的環境都是一樣的。LXC實現了“進程沙盒”,這一重要特性是跨主機部署的前提條件,但是只有這一點是不夠的,比如,在一個特定的LXC配置下執行應用程序,將該應用程序打包並拷貝到另一個LXC環境下,程序很有可能無法正常執行,因為該程序的執行依賴該機器的特定環境配置,包括網絡、存儲、發行版等。而Docker則將上述相關配置進行抽象並與應用程序一同打包,所以可以保證在不同硬件、不同配置的機器上Docker容器中運行的環境和其所依賴的環境配置是一樣的。

2、以應用為中心。Docker為簡化應用程序的部署過程做了很多優化,這一目的在Docker的API、用戶接口、設計哲學和用戶文檔中都有體現。其Dockerfile機制大大簡化和規範了應用的部署方法。

3、自動構建。Docker提供了一套能從源碼自動構建鏡像的工具。該工具可以靈活地使用make、maven、chef、pupper、salt、RPM和源碼包等形式,將應用程序的依賴、構建工具和安裝包進行打包處理,而且當前機器的配置不會影響鏡像的構建過程。

4、版本管理。Docker提供了類似於Git的版本管理功能,支持追蹤鏡像版本,檢驗版本更新、提交新的版本改動和回退版本等功能。鏡像的版本信息中包括制作方式和制作者信息,因此可以從生產環境回溯到上遊開發人員。Docker同樣實現了鏡像的增量上傳和下載的功能,用戶可以通過獲取新舊版本直接新增的鏡像層來更新鏡像版本,而不必下載完整鏡像,類似於Git的pull命令。

5、組件重用。任何容器都可以用作生成另一個組件的基礎鏡像。這一過程可以手動執行,也可以寫入自動化構建腳本。例如,可以創建一個包含Python開發環境的鏡像,並將其作為基礎鏡像部署其他使用Python環境進行開發的應用程序。

6、共享。Docker用戶可以訪問公共的鏡像Registry

7、工具生態鏈。

二、Docker容器和虛擬機之間有什麽不同

容器與虛擬機是互補的。虛擬機是用來進行硬件劃分的完美解決方案,它利用了硬件虛擬化技術,例如VT-x,AMD-V會同時通過一個hypervisor層來實現對資源的隔離;而容器則是操作系統級別的虛擬化,利用的是內核的Cgroup和NameSpace特性,此功能完全通過軟件來實現,僅僅是進程本身就可以與其他進程隔開,不需要任何輔助。

Docker容器與主機共享操作系統內核,不同容器之間可以共享部分系統資源,因此容器更加輕量級,消耗的資源也更少。而虛擬機會獨占分配給自己的資源,幾乎不存在資源共享,各個虛擬機之間近乎完全隔離,虛擬機更加重量級,也會消耗更多的資源。
我們可以很輕松地在一臺物理機上運行100個或者更多的呃Docker容器,而且不會占用太多系統資源(如果Docker占用資源不多);而在單臺機器上不可能創建100臺虛擬機,因為每一個虛擬機實例都會占用一個完整的操作系統所需要的所有資源。另外,Docker容器啟動很快,通常是秒級甚至是毫秒級啟動。而虛擬機的啟動雖然會快於物理機,但是也是在數秒級甚至數十秒級。

因此,可以根據需求的不同選擇相應的隔離方式。如果需要資源完全隔離並且不考慮資源消耗,可以選擇使用虛擬機;而若是想隔離進程並且需要大量進程實例,則應該選擇Docker.

關於Namespace機制,可以參考陳浩的兩篇博客:
http://coolshell.cn/articles/17010.html
http://coolshell.cn/articles/17029.html

3.Docker與LXC、虛擬化技術的區別——虛擬化技術本質上是在模擬硬件,Docker底層是LXC,本質都是cgroups是在直接操作硬件