入門解讀:小白也能看懂的容器和虛擬機介紹

如今,網絡上對容器和虛擬機的比較很常見。理論上,正如大多數人所言,容器比虛擬機更好,甚至虛擬機會被徹底淘汰。但是,容器和虛擬機並不一定要站在對立面互相開撕,畢竟容器目前存在的很多問題並沒有徹底解決,虛擬機的啓動速度和內存開銷也未必落後於容器。

因此,如果處於初級入門階段,有必要認真瞭解容器和虛擬機的區別,以便做出更優選擇。

開始之前,我們先想想應用程序在真實計算機環境中的運行情況。假設,我們需要運行MySQL數據庫、Nodejs應用程序和MongoDB數據庫三個應用程序。真實的計算機環境需要配備服務器,這是運行操作系統的物理設備;主機操作系統,在服務器上運行的操作系統,比如可以選擇Linux Ubuntu。

如果希望應用彼此隔離,每個程序都有自己的操作系統,可以在Linux Fedora上運行MySQL、在Linux Ubuntu上運行Nodejs並在Windows上運行MongoDB。如果不依靠虛擬機和容器,這個過程需要用三臺計算機實現,彼此之間還需要互相通信。

虛擬機

這種方式既不友好也不科學,虛擬機和容器的出現解決了這些問題。相較而言,虛擬機歷史更久遠,用戶也更加熟悉。簡單來說,虛擬機通過虛擬化來模擬真實計算環境,以執行在真實計算機上運行的應用程序。

優缺點

虛擬機的優點是可創建完全隔離的環境並實現完全虛擬化,每個虛擬機都有對應的CPU虛擬化。其缺點也很明顯,重,虛擬機通常在繁重的隔離進程中執行,因爲需要Guest OS;性能一般,當虛擬機無法直接訪問硬件(託管的虛擬機管理程序)時,需要在擁有一個層,這會明顯降低性能。

研究進展

在理論層面, neclab 的研究學者已經把虛擬機的啓動速度做到比Docker還快,並且內存開銷比Docker更低,這些成果以paper形式發表在SOSP’17 上。長期以來,由於虛擬機需要完整的操作系統,所以體積比較大,如果想優化速度必須精簡操作系統。

論文作者提供了兩種方法:一是Unikernels,這種方法相對極端,簡單來說是爲應用專門定製操作系統內核,該內核只提供運行此服務最基本的功能;二是精簡Linux內核只保留必要功能和模塊,作者專門開發了Tinyx 工具,根據應用objdump信息自動尋找依賴,並根據啓發性測試不斷尋找可關閉linux 模塊。這種方式不僅可以縮小鏡像體積(與啓動速度最相關的因素),還可以降低佔用內存。

容器

簡單來說,容器是與主機共享資源的獨立進程。與虛擬機不同,容器不會虛擬化硬件,也不需要客戶操作系統。在容器中,運行應用程序所需的必要組件都打包爲單個映像,可重複使用。執行映像時,它在隔離環境中運行,不共享內存、CPU或主機操作系統磁盤。這可以保證容器內的進程無法監視容器外的任何進程。

優缺點

容器的優點是由隔離進程執行但可與同一主機上的其他容器共享資源環境;允許將容器內部的文件和資源安裝到外部;容器不在客戶操作系統中運行,因此其過程是輕量級的,具有更好的性能,並可在幾秒鐘內啓動。

容器的缺點有相同的Host OS,當應用程序需要特定的操作系統並且使用虛擬機更容易實現時,我們可能會遇到這種情況;安全問題,容器相當於彼此隔離的進程,可以直接訪問重要的命名空間,比如主機名、網絡和共享內存。當然,這一點可以通過控制root用戶有所緩解,但始終是個問題。

容器VS虛擬機

從輿論層面來看,我們似乎應該放棄虛擬機,畢竟不少媒體已經開始使用“虛擬機已死”的言論。但就可維護性而言,虛擬機的動態遷移等技術相對成熟,實現原理從根上就很簡單,不需要操心少個依賴進程的內存沒過去。所以,我們無法孤立分析二者的好壞,需要結合應用特點、解決問題和場景等因素選擇。

實際上,容器誕生之初更多的目的是解決裸進程的隔離和部署問題,並不是衝着取代虛擬機。目前還有不少人選擇應用虛擬機,如果場景和需求合適,也不妨將虛擬機和容器一起使用,比如,生產環境使用Windows,但有一個僅在Linux上運行的應用程序,此時可以使用虛擬機運行Linux發行版,然後在此虛擬機中運行容器。當然,這件事情現在似乎也由雲廠商代做了。

前不久,AWS開源Firecracker,這其實可以算是是容器和虛擬化優勢結合的產物,專門用於創建和管理多租戶容器以及基於函數的服務,利用傳統虛擬機提供的安全性和工作負載隔離,同時兼具容器的資源效率。不少人認爲這可能是未來虛擬機和容器的發展方向,今年可能會看到更多雲計算廠商推出此類服務。

參考鏈接:https://dzone.com/articles/part-4-docker-images-in-more-details
https://dl.acm.org/citation.cfm?id=3132763

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章