容器和虛擬機到底有啥區別?

Docker這幾年的迅猛發展讓容器從新流行起來,不過但很資料裏介紹Docker時都說是 "新瓶裝舊酒"。除了容器外虛擬機也是咱們或多或少會接觸到的虛擬化技術。虛擬機和容器都用於建立隔離的虛擬環境,可是這兩種虛擬化技術有顯著的不一樣,今天的文章就來聊一下它們之間的區別。web

虛擬機

虛擬機(VM)是共享一個服務器的物理資源的操做系統。它是主機硬件上的Guest,所以也被稱爲Guest虛擬機。安全

虛擬機由幾層組成。支持虛擬化的層是hypervisorhypervisor是一種虛擬化服務器的軟件。服務器

虛擬機是怎麼工做的

運行應用程序所需的一切都包含在虛擬機裏--虛擬化的硬件,操做系統以及任何所需的二進制文件和庫。所以,虛擬機具備本身獨立的基礎架構。網絡

虛擬機架構圖
虛擬機架構圖

虛擬機的優點

虛擬機可減小在服務器設備上的支出,能夠利用一個物理服務器資源切分紅多個獨立的虛擬機來完成許多工做。架構

因爲只有一臺主機,所以能夠利用虛擬機管理程序的集中功能高效地管理全部虛擬環境。這些系統徹底相互獨立,這意味着你能夠在不一樣的虛擬機裏安裝不一樣的系統環境。編輯器

最重要的是,虛擬機與主機操做系統隔離,是進行實驗和開發應用程序的安全場所。微服務

虛擬機的劣勢

虛擬機可能佔用主機的大量系統資源,虛擬機的大小爲數GB。在虛擬服務器上運行單個應用程序意味着還要運行Guest OS以及Guest OS運行所需的全部硬件的虛擬副本。這樣很快就增長了不少RAMCPU資源消耗。flex

遷移虛擬機上運行的應用程序的過程也可能很複雜,由於它始終附加在操做系統上。所以,必須同時遷移應用程序和操做系統。一樣,在建立虛擬機時,系統管理程序會分配專用於VM的硬件資源。 不過與運行單獨的實體服務器相比,這仍然是經濟的。url

容器

容器是一個不依賴於操做系統,運行應用程序的環境。它經過Linux的NamespacesCgroups技術對應用程序進程進行隔離和限制的,Namespace的做用是隔離,它讓應用進程只能看到該Namespace內的世界;而Cgroups 的做用是限制分配給進程的宿主機資源。但對於宿主機來講,這些被「隔離」了的進程跟其餘進程並無太大區別。spa

容器只是運行在宿主機上的一種特殊的進程,多個容器之間使用的仍是同一個宿主機的操做系統內核。

關於NamespacesCgroups後面再詳細介紹,這裏你只知道他們是啓動隔離和限制應用進程的就好了。

容器是怎麼工做的

Namespace的做用是隔離,它讓應用進程只能看到該Namespace內的世界;而Cgroups的做用是限制,它給這個世界圍上了一圈看不見的牆。經過Mount Namespace能夠修改容器進程對本身的文件系統 "掛載點"的認知。在容器進程啓動以前從新掛載它的整個根目錄"/"(經過pivot_root系統調用改變進程的文件系統,若是系統不支持,則使用chroot),而因爲Mount Namespace的存在,這個掛載對宿主機不可見的。這個掛載在容器根目錄上、用來爲容器進程提供隔離後執行環境的文件系統,就是所謂的「容器鏡像」。它還有一個更爲專業的名字,叫做:rootfs(根文件系統)。rootfs只是一個操做系統所包含的文件、配置和目錄,並不包括操做系統內核。

因此說,rootfs 只包括了操做系統的 "軀殼",並無包括操做系統的內核。同一臺機器上的全部容器,都共享宿主機操做系統的內核。

這就意味着,若是容器裏的應用程序須要配置內核參數、跟內核進行直接的交互,這些都是操做的宿主機操做系統的內核,它對於該機器上的全部容器來講是一個「全局變量」,牽一髮而動全身。這也是容器相比於虛擬機的主要缺陷之一:畢竟虛擬機有模擬出來的硬件機器充當沙盒,並且每一個虛擬機裏還運行着一個完整Guest OS讓應用隨便折騰。不過因爲rootfs裏打包的不僅是應用,而是整個操做系統的文件和目錄,也就意味着,應用以及它運行所須要的全部依賴,都被封裝在了一塊兒。這就賦予了容器所謂的一致性:不管在本地、雲端,仍是在一臺任何地方的機器上,用戶只須要解壓打包好的容器鏡像,那麼這個應用運行所須要的完整的執行環境就被重現出來。

容器的優點

容器佔用的大小比虛擬機小不少,甚至能夠小到10MB,能夠輕鬆限制容器的內存和CPU使用率。與部署應用須要部署整個操做系統的虛擬機相比,容器很是輕巧且啓動迅速。這樣讓咱們能夠快速擴展容器並添加相同的容器。

一樣,容器對於持續集成和持續部署(CI / CD)實施也是極好的選擇。他們經過在開發人員之間分發和合並鏡像來促進協做開發。

容器的劣勢

容器仍沒法提供與虛擬機相同的安全性和穩定性。因爲它們共享主機的內核,所以不能像虛擬機同樣徹底隔離。

容器是進程級的隔離,一個容器能夠經過影響宿主機內核的穩定性來影響其餘容器。

一旦容器執行了任務,它就會關閉並刪除其中的全部數據。若是但願數據保留下來,則必須使用"數據卷"進行保存,這須要在主機上進行手動配置。

容器仍是虛擬機

上面咱們列出了容器和虛擬機各自的優點和劣勢,咱們在由於優點選擇了其一後默認就要其忍受劣勢所帶來的反作用,凡事都有兩面性沒有東西能夠只有優勢沒缺點的。就容器和虛擬機來講,由於其完整的隔離和安全性虛擬機一般用於要求苛刻的應用程序,網絡基礎結構以及將消耗VM大部分資源的應用程序。而容器一般用於Web應用,微服務。

本文使用 mdnice 排版

相關文章
相關標籤/搜索