容器和虛擬機器到底有啥區別?
Docker
這幾年的迅猛發展讓容器重新流行起來,不過但很多資料裡介紹Docker
時都說是 "新瓶裝舊酒"。除了容器外虛擬機器也是我們或多或少會接觸到的虛擬化技術。虛擬機器和容器都用於建立隔離的虛擬環境,但是這兩種虛擬化技術有顯著的不同,今天的文章就來聊一下它們之間的區別。
虛擬機器
虛擬機器(VM)是共享一個伺服器的物理資源的作業系統。它是主機硬體上的Guest
,因此也被稱為Guest
虛擬機器。
虛擬機器由幾層組成。支援虛擬化的層是hypervisor
。hypervisor
是一種虛擬化伺服器的軟體。
虛擬機器是怎麼工作的
執行應用程式所需的一切都包含在虛擬機器裡--虛擬化的硬體,作業系統以及任何所需的二進位制檔案和庫。因此,虛擬機器具有自己獨立的基礎架構。
虛擬機器的優勢
虛擬機器可減少在伺服器裝置上的支出,可以利用一個物理伺服器資源切分成多個獨立的虛擬機器來完成許多工作。
由於只有一臺主機,因此可以利用虛擬機器管理程式的集中功能高效地管理所有虛擬環境。這些系統完全相互獨立,這意味著你可以在不同的虛擬機器裡安裝不同的系統環境。
最重要的是,虛擬機器與主機作業系統隔離,是進行實驗和開發應用程式的安全場所。
虛擬機器的劣勢
虛擬機器可能佔用主機的大量系統資源,虛擬機器的大小為數GB。在虛擬伺服器上執行單個應用程式意味著還要執行Guest OS
以及Guest OS
執行所需的所有硬體的虛擬副本。這樣很快就增加了很多RAM
和CPU
資源消耗。
遷移虛擬機器上執行的應用程式的過程也可能很複雜,因為它始終附加在作業系統上。因此,必須同時遷移應用程式和作業系統。同樣,在建立虛擬機器時,系統管理程式會分配專用於VM的硬體資源。不過與執行單獨的實體伺服器相比,這仍然是經濟的。
容器
容器是一個不依賴於作業系統,執行應用程式的環境。它通過Linux的Namespaces
和Cgroups
技術對應用程式程式進行隔離和限制的,Namespace
的作用是隔離,它讓應用程式只能看到該Namespace
內的世界;而Cgroups
的作用是限制分配給程式的宿主機資源。但對於宿主機來說,這些被“隔離”了的程式跟其他程式並沒有太大區別。
容器只是執行在宿主機上的一種特殊的程式,多個容器之間使用的還是同一個宿主機的作業系統核心。
關於Namespaces
和Cgroups
後面再詳細介紹,這裡你只知道他們是啟動隔離和限制應用程式的就行了。
容器是怎麼工作的
Namespace
的作用是隔離,它讓應用程式只能看到該Namespace
內的世界;而Cgroups
的作用是限制,它給這個世界圍上了一圈看不見的牆。通過Mount Namespace
可以修改容器程式對自己的檔案系統 "掛載點"的認知。在容器程式啟動之前重新掛載它的整個根目錄"/"(通過pivot_root
系統呼叫改變程式的檔案系統,如果系統不支援,則使用chroot
),而由於Mount Namespace
的存在,這個掛載對宿主機不可見的。這個掛載在容器根目錄上、用來為容器程式提供隔離後執行環境的檔案系統,就是所謂的“容器映象”。它還有一個更為專業的名字,叫做:rootfs
(根檔案系統)。rootfs
只是一個作業系統所包含的檔案、配置和目錄,並不包括作業系統核心。
所以說,rootfs
只包括了作業系統的 "軀殼",並沒有包括作業系統的核心。同一臺機器上的所有容器,都會共享宿主機作業系統的核心。
這就意味著,如果容器裡的應用程式需要配置核心引數、跟核心進行直接的互動,這些都是操作的宿主機作業系統的核心,它對於該機器上的所有容器來說是一個“全域性變數”,牽一髮而動全身。這也是容器相比於虛擬機器的主要缺陷之一:畢竟虛擬機器有模擬出來的硬體機器充當沙盒,而且每個虛擬機器裡還執行著一個完整Guest OS
讓應用隨便折騰。不過由於rootfs
裡打包的不只是應用,而是整個作業系統的檔案和目錄,也就意味著,應用以及它執行所需要的所有依賴,都被封裝在了一起。這就賦予了容器所謂的一致性:無論在本地、雲端,還是在一臺任何地方的機器上,使用者只需要解壓打包好的容器映象,那麼這個應用執行所需要的完整的執行環境就能被重現出來。
容器的優勢
容器佔用的大小比虛擬機器小很多,甚至可以小到10MB,可以輕鬆限制容器的記憶體和CPU使用率。與部署應用需要部署整個作業系統的虛擬機器相比,容器非常輕巧且啟動迅速。這樣讓我們可以快速擴充套件容器並新增相同的容器。
同樣,容器對於持續整合和持續部署(CI / CD)實施也是極好的選擇。他們通過在開發人員之間分發和合並映象來促進協作開發。
容器的劣勢
容器仍無法提供與虛擬機器相同的安全性和穩定性。由於它們共享主機的核心,因此不能像虛擬機器一樣完全隔離。
容器是程式級的隔離,一個容器可以通過影響宿主機核心的穩定性來影響其他容器。
一旦容器執行了任務,它就會關閉並刪除其中的所有資料。如果希望資料保留下來,則必須使用"資料卷"進行儲存,這需要在主機上進行手動配置。
容器還是虛擬機器
上面我們列出了容器和虛擬機器各自的優勢和劣勢,我們在因為優勢選擇了其一後預設就要其忍受劣勢所帶來的副作用,凡事都有兩面性沒有東西可以只有優點沒缺點的。就容器和虛擬機器來說,因為其完整的隔離和安全性虛擬機器通常用於要求苛刻的應用程式,網路基礎結構以及能消耗VM大部分資源的應用程式。而容器通常用於Web應用,微服務。
❤️愛心三連
1.看到這裡了就點個在看支援下吧,你的「在看」是我創作的動力。
2.關注公眾號網管叨bi叨
,「每週為您分享原創技術文章」!
3.特殊階段,帶好口罩,做好個人防護。
“在看轉發”是最大的支援
相關文章
- Docker容器和虛擬機器區別Docker虛擬機
- 虛擬主機和ECS有啥區別
- VM和Container 虛擬機器和容器AI虛擬機
- 虛擬機器、容器與沙盒技術有什麼區別?虛擬機
- 伺服器和虛擬主機有何區別伺服器
- 伺服器的獨立機器和虛擬機器的區別伺服器虛擬機
- java虛擬機器和Dalvik虛擬機器Java虛擬機
- Java虛擬機器(JVM)和Python直譯器有什麼區別?Java虛擬機JVMPython
- 虛擬機器、容器和沙箱是什麼關係?虛擬機
- 雲伺服器和雲虛擬主機有哪些區別呢伺服器
- VPS和虛擬主機有什麼區別
- 伺服器、雲伺服器和虛擬主機有什麼區別?伺服器
- 雲伺服器與虛擬主機的區別伺服器
- 容器技術和虛擬機器技術的對比虛擬機
- Java 8 中的抽象類和介面到底有啥區別?Java抽象
- 沙盒化容器:是容器還是虛擬機器虛擬機
- 雲虛擬主機和雲伺服器有什麼區別?雲虛擬主機能用來幹什麼?伺服器
- Dalvik虛擬機器、Java虛擬機器與ART虛擬機器虛擬機Java
- 香港雲主機:雲伺服器和雲虛擬主機的區別,雲伺服器真的就比虛擬主機好嗎?伺服器
- 中外程式設計師到底有啥區別?程式設計師
- 所以,e.target 和 e.currentTarget 到底有啥區別呢?
- 虛擬主機、VPS主機與雲伺服器的區別伺服器
- VMware虛擬機器如何設定使主機和虛擬機器不同IP虛擬機
- 統計學和機器學習到底有什麼區別?機器學習
- 技術界中的虛擬機器、容器和沙箱的關係虛擬機
- 虛擬機器與容器的混合管理實踐虛擬機
- 你問我答|虛擬機器、容器和無伺服器,怎麼選?虛擬機伺服器
- 憑什麼別的虛擬機器叫虛擬機器,Python的叫直譯器?虛擬機Python
- Android 虛擬機器 Vs Java 虛擬機器Android虛擬機Java
- 啥是伺服器虛擬化,虛擬化的優勢伺服器
- Linux虛擬主機與Windows虛擬主機之間有什麼區別LinuxWindows
- docker容器和虛擬化有什麼區別?linux就業前景怎麼樣DockerLinux就業
- 虛擬主機、VPS、雲伺服器三者的區別伺服器
- React 的虛擬 DOM 和 Vue 的虛擬 DOM 有什麼區別?ReactVue
- 輕雲伺服器、虛擬主機、雲伺服器ECS的區別?伺服器
- JDK1.8-Java虛擬機器執行時資料區域和HotSpot虛擬機器的記憶體模型JDKJava虛擬機HotSpot記憶體模型
- 虛擬機器(三)虛擬機器配置靜態Ip虛擬機
- 全國產交換機、軍用交換機與普通交換機到底有啥區別?