1. 程式人生 > >Docker、LXC、虛擬機器異同

Docker、LXC、虛擬機器異同



一、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.

一、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.