反思|容器與虛擬機的真正區別在哪里?


“Docker和虛擬機有什么不同?”,這似乎是我聽到的有關容器最常見的問題之一,我一般給出的答案取決於提出此問題的不同方式。但是我喜歡這樣開頭:“容器和虛擬機僅僅相似於它們都提供了隔離環境。” 接着我闡述他們之間的差異,“容器能做的事少得多並且使用起來相當廉價。而虛擬機提供整個虛擬化硬件層,可以做更多的事情但是使用成本顯著。“ 我想有人會有疑問的最大的原因是這兩種技術在功能上似乎類似,至少在第一點看來。

“ 它如何影響我的部署策略?

有人希望直接跳到結論或者他們想要的結果。 “這樣會如何影響我的部署策略?我剛上雲,難道真的要改變一切,重新來過?這要花費多少?這要花費多大精力來學習呢?“

如果你從頭到尾的解釋給他們聽,通常他們會由懷疑變成好奇。向他們展示那些項目,比如Docker,如何更簡單地使用容器,如何將已經實現的項目與他們在使用的工具整合。他們會明白的,雖然還是有一些工作要做,但是學習和整合很容易。他們仍會希望得到更多的細節。

“ 它的性能如何?

“它的性能如何?” 這個問題甚至比第一個還要常見。我不確定他們希望聽到什么,還有為什么他們會這樣問,但是答案會讓他們吃驚:性能非常接近裸機(直接地/非虛擬化)的性能。他們不會相信,但是原因就是隔離並不是虛擬化。

Docker volumes只是綁定掛載文件(文件就像指針指向磁盤上的一個位置,它創建一個綁定掛載僅僅是創建一個指向同一地點的另一個文件而已)。讀取或寫入該文件基本上像裸機操作的那樣廉價。另一方面,讀取或寫入Volume以外的Docker容器文件系統比較昂貴。所以說不要那樣做。

Docker networking就像裸機的網絡。有一組用於每個容器而創建的虛擬(即邏輯的)以太網接口。任何網絡性能下降是由於額外的內部跳動,比如:NAT。

容器的建立在一組Linux內核提供的功能牆壁上。對於IO(如果有的話)很少需要額外的處理或重定向。容器是廉價的。因為使它們工作的軟件是內置於操作系統中的,因此你可以停止(或至少減少)虛擬化軟件的開支(或雲實例)。

“ 它是不是比虛擬機更不安全呢?

當然,精明健談的會問,“它是不是比虛擬機更不安全呢?” 目前來說也許是的……。

這個比較復雜,因為它取決於你正在拿它們做什么。為了全面了解請參考PPT – Docker,Linux容器(LXC)與安全 by Jérôme Petazzoni。我會盡力來總結概括。

容器使用由Linux內核提供的命名空間。大多數人把命名空間認為是一個上下文或域的授權決定(進程X有權訪問資源Y)。

如果容器內的進程掃描文件系統來尋找要竊取的東西,它只能找到容器內明確可見的文件。如果容器內的進程中想嘗試做一些惡意的事情,比如打開端口31337后門服務,它不會有多大好處,因為這個端口實際上不會暴露在容器外的任何地方。容器內部的惡意進程不能訪問的任何容器外的其他進程的內存。

有幾個方法可以擺脫容器的束縛,但這些通常需要容器的root訪問權限。不要以root運行應用程序。通過簡單的幾個步驟穩固root訪問權限。

容器使用cgroup來提供與虛擬機相同級別的資源使用保護機制。容器和虛擬機都可以獲取整個網絡鏈接。

有些人會指出並非所有的Linux內核是命名空間的。這意味着有一些資源尚未隔離。這可能是真的,但它正在發生變化。集成的其他穩固的工具,像AppArmor或SELinux,可以幫助你構建一些真正的堡壘。如果有額外的工作來使容器達到與虛擬機相同的安全級別,那么它是值得的。

  • 容器提供的隔離對於更密切的軟件集成可以聲明性地減少。虛擬機則是剛性的。

  • 容器運行的是不完整的操作系統(盡管它們可以)。虛擬機必須運行完整的。

  • 容器比虛擬機使用更少的閑置資源。它們不運行完整的操作系統。

  • 容器在在雲硬件(或虛擬機)中可以被復用,就像虛擬機在裸機上可以被復用。所不同的是…

  • 容器需要毫秒分配。虛擬機需要幾分鍾。所以,你可以另配、重新平衡、釋放以及使用容器比虛擬機的迭代更加迅速。

老實說,我感覺大多數傻傻的。以我的經驗最常見的原因是人們提供硬件(虛擬或物理)是提供的隔離。

隔離

如果每個容器運行的只有一個服務或者數據庫,這是比較容易管理的。而且比較容易監控性能,了解故障的影響,並預測成本。像亞馬遜公司,團隊擁有他們自己的軟件和硬件,隔離是其中的關鍵。你有沒有與其他團隊分享過一個負載均衡的重要資源?那么,當因為你的服務把他們的VIP設置為激增隊列來代替外溢,它們會失敗或者在半夜你被叫醒,你就會渴望有隔離了。

離目標進程越遠,隔離會變得更昂貴。虛擬機是偉大的,它通過抽象來增加並行,服務於多操作系統的使用情況以及業界最好的安全性。但對於隔離,它們相當的昂貴。

容器提供的隔離就便宜。趁熱得到它。


如果你想到閱讀更多有關Docker和容器的內容,請查閱我的書《Docker in Action》。目前可以在Manning Early Access Program瀏覽電子版。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM