很遺憾,我也不知道什麼是容器!
題圖抽象的形容了容器和虛擬機是那麼的相似,又是那麼的不同!
在近期的一些會議和學術交流會上,我一直在講述有關 DevOps 的安全問題(亦稱為 DevSecOps) 注1 。通常,我首先都會問一個問題:「在座的各位有誰知道什麼是容器嗎?」 通常並沒有很多人舉手 注2 ,所以我都會先簡單介紹一下什麼是容器 注3 ,然後再進行深層次的討論交流。
更準確的說,在運用 DevOps 或者 DevSecOps 的時候,容器並不是必須的。但容器能很好的融於 DevOps 和 DevSecOps 方案中,結果就是,雖然不用容器便可以運用 DevOps ,但我還是假設大部分人依然會使用容器。
什麼是容器
幾個月前的一個會議上,一個同事正在容器上操作演示,因為大家都不是這個方面的專家,所以該同事就很簡單的開始了他的演示。他說了諸如「在 Linux 內核源碼中沒有一處提及到 容器 。「之類的話。事實上,在這樣的特殊群體中,這種描述表達是很危險的。就在幾秒鐘內,我和我的老闆(坐在我旁邊)下載了最新版本的內核源代碼並且查找統計了其中 「container」 單詞出現的次數。很顯然,這位同事的說法並不準確。更準確來說,我在舊版本內核(4.9.2)代碼中發現有 15273 行代碼包含 「container」 一詞 注4 。我和我老闆會心一笑,確認同事的說法有誤,並在休息時糾正了他這個有誤的描述。
後來我們搞清楚同事想表達的意思是 Linux 內核中並沒有明確提及容器這個概念。換句話說,容器使用了 Linux 內核中的一些概念、組件、工具以及機制,並沒有什麼特殊的東西;這些東西也可以用於其他目的 注 5 。所以才有會說「從 Linux 內核角度來看,並沒有容器這樣的東西。」
然後,什麼是容器呢?我有著虛擬化( 管理器 和虛擬機)技術的背景,在我看來, 容器既像虛擬機(VM)又不像虛擬機。我知道這種解釋好像沒什麼用,不過請聽我細細道來。
容器和虛擬機相似之處有哪些?
容器和虛擬機相似的一個主要方面就是它是一個可執行單元。將文件打包生成鏡像文件,然後它就可以運行在合適的主機平台上。和虛擬機一樣,它運行於主機上,同樣,它的運行也受制於該主機。主機平台為容器的運行提供軟體環境和硬體資源(諸如 CPU 資源、網路環境、存儲資源等等),除此之外,主機還需要負責以下的任務:
- 為每一個工作單元(這裡指虛擬機和容器)提供保護機制,這樣可以保證即使某一個工作單元出現惡意的、有害的以及不能寫入的情況時不會影響其他的工作單元。
- 主機保護自己不會受一些惡意運行或出現故障的工作單元影響。
虛擬機和容器實現這種隔離的原理並不一樣,虛擬機的隔離是由管理器對硬體資源劃分,而容器的隔離則是通過 Linux 內核提供的軟體功能實現的 注6 。這種軟體控制機制通過不同的「命名空間」保證了每一個容器的文件、用戶以及網路連接等互不可見,當然容器和主機之間也互不可見。這種功能也能由 SELinux 之類軟體提供,它們提供了進一步隔離容器的功能。
容器和虛擬機不同之處又有哪些?
以上描述有個問題,如果你對 管理器 機制概念比較模糊,也許你會認為容器就是虛擬機,但它確實不是。
首先,最為重要的一點 注7 ,容器是一種包格式。也許你會驚訝的反問我「什麼,你不是說過容器是某種可執行文件么?」 對,容器確實是可執行文件,但容器如此迷人的一個主要原因就是它能很容易的生成比虛擬機小很多的實體化鏡像文件。由於這些原因,容器消耗很少的內存,並且能非常快的啟動與關閉。你可以在幾分鐘或者幾秒鐘(甚至毫秒級別)之內就啟動一個容器,而虛擬機則不具備這些特點。
正因為容器是如此輕量級且易於替換,人們使用它們來創建微服務——應用程序拆分而成的最小組件,它們可以和一個或多個其它微服務構成任何你想要的應用。假使你只在一個容器內運行某個特定功能或者任務,你也可以讓容器變得很小,這樣丟棄舊容器創建新容器將變得很容易。我將在後續的文章中繼續跟進這個問題以及它們對安全性的可能影響,當然,也包括 DevSecOps 。
希望這是一次對容器的有用的介紹,並且能帶動你有動力去學習 DevSecOps 的知識(如果你不是,假裝一下也好)。
- 注 1:我覺得 DevSecOps 讀起來很奇怪,而 DevOpsSec 往往有多元化的理解,然後所討論的主題就不一樣了。
- 注 2:我應該注意到這不僅僅會被比較保守、不太喜歡被人注意的英國聽眾所了解,也會被加拿大人和美國人所了解,他們的性格則和英國人不一樣。
- 注 3:當然,我只是想討論 Linux 容器。我知道關於這個問題,是有歷史根源的,所以它也值得注意,而不是我故弄玄虛。
- 注 4:如果你感興趣的話,我使用的是命令
grep -ir container linux-4.9.2 | wc -l
- 注 5:公平的說,我們快速瀏覽一下,一些用途與我們討論容器的方式無關,我們討論的是 Linux 容器,它是抽象的,可以用來包含其他元素,因此在邏輯上被稱為容器。
- 注 6:也有一些巧妙的方法可以將容器和虛擬機結合起來以發揮它們各自的優勢,那個不在我今天的主題範圍內。
- 注 7:很明顯,除了我們剛才介紹的執行位。
原文來自 Alice, Eve, and Bob—a security blog ,轉載請註明
(題圖: opensource.com )
作者簡介:
原文作者 Mike Bursell 是一名居住在英國、喜歡威士忌的開源愛好者, Red Hat 首席安全架構師。其自從 1997 年接觸開源世界以來,生活和工作中一直使用 Linux (儘管不是一直都很容易)。更多信息請參考作者的博客 https://aliceevebob.com ,作者會不定期的更新一些有關安全方面的文章。
via: https://opensource.com/article/17/10/what-are-containers
作者:Mike Bursell 譯者:jrglinux 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive