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

有限自動機發表於2020-10-10

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

虛擬機器

虛擬機器(VM)是共享一個伺服器的物理資源的作業系統。它是主機硬體上的Guest,因此也被稱為Guest虛擬機器。

虛擬機器由幾層組成。支援虛擬化的層是hypervisorhypervisor是一種虛擬化伺服器的軟體。

虛擬機器是怎麼工作的

執行應用程式所需的一切都包含在虛擬機器裡--虛擬化的硬體,作業系統以及任何所需的二進位制檔案和庫。因此,虛擬機器具有自己獨立的基礎架構。

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

虛擬機器的優勢

虛擬機器可減少在伺服器裝置上的支出,可以利用一個物理伺服器資源切分成多個獨立的虛擬機器來完成許多工作。

由於只有一臺主機,因此可以利用虛擬機器管理程式的集中功能高效地管理所有虛擬環境。這些系統完全相互獨立,這意味著你可以在不同的虛擬機器裡安裝不同的系統環境。

最重要的是,虛擬機器與主機作業系統隔離,是進行實驗和開發應用程式的安全場所。

虛擬機器的劣勢

虛擬機器可能佔用主機的大量系統資源,虛擬機器的大小為數GB。在虛擬伺服器上執行單個應用程式意味著還要執行Guest OS以及Guest OS執行所需的所有硬體的虛擬副本。這樣很快就增加了很多RAMCPU資源消耗。

遷移虛擬機器上執行的應用程式的過程也可能很複雜,因為它始終附加在作業系統上。因此,必須同時遷移應用程式和作業系統。同樣,在建立虛擬機器時,系統管理程式會分配專用於VM的硬體資源。不過與執行單獨的實體伺服器相比,這仍然是經濟的。

容器

容器是一個不依賴於作業系統,執行應用程式的環境。它通過Linux的NamespacesCgroups技術對應用程式程式進行隔離和限制的,Namespace的作用是隔離,它讓應用程式只能看到該Namespace內的世界;而Cgroups 的作用是限制分配給程式的宿主機資源。但對於宿主機來說,這些被“隔離”了的程式跟其他程式並沒有太大區別。

容器只是執行在宿主機上的一種特殊的程式,多個容器之間使用的還是同一個宿主機的作業系統核心。

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

容器是怎麼工作的

Namespace的作用是隔離,它讓應用程式只能看到該Namespace內的世界;而Cgroups的作用是限制,它給這個世界圍上了一圈看不見的牆。通過Mount Namespace可以修改容器程式對自己的檔案系統 "掛載點"的認知。在容器程式啟動之前重新掛載它的整個根目錄"/"(通過pivot_root系統呼叫改變程式的檔案系統,如果系統不支援,則使用chroot),而由於Mount Namespace的存在,這個掛載對宿主機不可見的。這個掛載在容器根目錄上、用來為容器程式提供隔離後執行環境的檔案系統,就是所謂的“容器映象”。它還有一個更為專業的名字,叫做:rootfs(根檔案系統)。rootfs只是一個作業系統所包含的檔案、配置和目錄,並不包括作業系統核心。

所以說,rootfs 只包括了作業系統的 "軀殼",並沒有包括作業系統的核心。同一臺機器上的所有容器,都會共享宿主機作業系統的核心。

這就意味著,如果容器裡的應用程式需要配置核心引數、跟核心進行直接的互動,這些都是操作的宿主機作業系統的核心,它對於該機器上的所有容器來說是一個“全域性變數”,牽一髮而動全身。這也是容器相比於虛擬機器的主要缺陷之一:畢竟虛擬機器有模擬出來的硬體機器充當沙盒,而且每個虛擬機器裡還執行著一個完整Guest OS讓應用隨便折騰。不過由於rootfs裡打包的不只是應用,而是整個作業系統的檔案和目錄,也就意味著,應用以及它執行所需要的所有依賴,都被封裝在了一起。這就賦予了容器所謂的一致性:無論在本地、雲端,還是在一臺任何地方的機器上,使用者只需要解壓打包好的容器映象,那麼這個應用執行所需要的完整的執行環境就能被重現出來。

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

容器的優勢

容器佔用的大小比虛擬機器小很多,甚至可以小到10MB,可以輕鬆限制容器的記憶體和CPU使用率。與部署應用需要部署整個作業系統的虛擬機器相比,容器非常輕巧且啟動迅速。這樣讓我們可以快速擴充套件容器並新增相同的容器。

同樣,容器對於持續整合和持續部署(CI / CD)實施也是極好的選擇。他們通過在開發人員之間分發和合並映象來促進協作開發。

容器的劣勢

容器仍無法提供與虛擬機器相同的安全性和穩定性。由於它們共享主機的核心,因此不能像虛擬機器一樣完全隔離。

容器是程式級的隔離,一個容器可以通過影響宿主機核心的穩定性來影響其他容器。

一旦容器執行了任務,它就會關閉並刪除其中的所有資料。如果希望資料保留下來,則必須使用"資料卷"進行儲存,這需要在主機上進行手動配置。

容器還是虛擬機器

上面我們列出了容器和虛擬機器各自的優勢和劣勢,我們在因為優勢選擇了其一後預設就要其忍受劣勢所帶來的副作用,凡事都有兩面性沒有東西可以只有優點沒缺點的。就容器和虛擬機器來說,因為其完整的隔離和安全性虛擬機器通常用於要求苛刻的應用程式,網路基礎結構以及能消耗VM大部分資源的應用程式。而容器通常用於Web應用,微服務。

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

Kubernetes部署執行Go專案

執行在筆記本上的Kubernetes叢集

Go併發程式設計裡的資料競爭以及解決之道

❤️愛心三連

1.看到這裡了就點個在看支援下吧,你的「在看」是我創作的動力。

2.關注公眾號網管叨bi叨,「每週為您分享原創技術文章」!

3.特殊階段,帶好口罩,做好個人防護。

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

“在看轉發”是最大的支援

相關文章