什麼是Podman——取代Docker的容器引擎

語言: CN / TW / HK

什麼是Podman?取代Docker的容器引擎

Podman是新容器領域的一顆新星,它的參與者突然多了很多。瞭解什麼是Podman,以及它與Docker在Kubernetes兼容性方面的比較等等

Podman是一個容器引擎--一種開發、管理和運行容器和容器鏡像的工具。容器是標準化的、獨立的軟件包,包含了所有必要的元素,可以在任何地方運行而不需要定製,包括應用程序代碼和支持庫。基於容器的應用 在過去十年中徹底改變了軟件開發,使分佈式和基於雲的系統易於部署和維護。

Podman是紅帽公司的一個項目,是開源的,可以免費下載。它是容器化領域的一個相對新成員,1.0版本在2019年發佈。此後,Podman取得了長足的進步,它的崛起與Docker的逐漸衰落相得益彰,Docker項目在許多方面創造了我們今天所知道的容器世界。

Podman和Kubernetes

如果你對基於容器的開發稍微熟悉,你就會知道Kubernetes這個名字。隨着容器化的應用程序越來越複雜,開發人員需要一些工具,可以協調在不同的虛擬機上,甚至在不同的物理機上運行的容器之間的相互作用。這樣的工具被稱為容器編排平台,而Kubernetes是迄今為止最突出的例子。Kubernetes可以與任何符合開放容器倡議(OCI)圖像規範的容器一起工作,Podman的容器就符合這一規範。

Kubernetes的一個重要特徵是pod的概念,這是一個由一個或多個容器組成的短暫分組,是Kubernetes可以管理的最小的計算單位。Podman也是以pod的概念為中心,正如其名稱所暗示的那樣。一個Podman pod也包括一個或多個容器,它們被分組在一個命名空間、網絡和安全環境中。這種相似性使Podman和Kubernetes成為自然的結合,從一開始Red Hat的目標之一就是讓Podman用户與Kubernetes協調容器

Podman與Docker

容器世界的另一個大名,你幾乎肯定聽説過是Docker。Docker並不是第一個容器引擎,但在很多方面它已經定義了容器化。Docker的大部分工作方式是基於容器的開發的事實標準,以至於許多人使用 "Docker "作為容器的簡稱。

雖然Docker和Podman在容器生態系統中佔據了類似的空間,但它們並不一樣,它們在工作方式上有不同的理念和方法。例如,Docker是一個多合一的平台,有用於特定任務的工具,而Podman為了某些目的與其他項目合作--例如,它依靠Buildah來構建容器鏡像。

架構上也有差異。例如,Docker沒有本地的pods概念。另一個重要的區別是,Docker依靠一個持續運行的後台守護程序來創建鏡像和運行容器,而Podman則將容器和pod作為獨立的子進程啟動。Docker的這方面設計對安全有重要影響,我們很快會討論。

Podman上的Docker命令

由於設計和需要,Podman和Docker整體上是兼容的。這種兼容性部分歸因於對開放標準的遵守。因為這兩個引擎都使用符合OCI標準的容器,你可以用Docker創建一個容器並在Podman中修改它,或者反過來,然後將任何一個容器部署到Kubernetes。

當Podman在2019年推出時,Docker是如此占主導地位,其命令行界面已成為許多開發人員的編程程序和肌肉記憶的一部分。為了使潛在的移動到Podman更加無縫,Podman的創建者確保其命令和語法儘可能地反映Docker的命令和語法。他們甚至可以設置一個別名,將Docker的命令重新路由到Podman

無根容器的安全性更高

由於Podman和Docker在很多方面都很相似,為什麼你會選擇其中一個而不是另一個?嗯,一個重要的原因是安全。還記得Docker是如何依靠一個守護進程來完成它的大部分工作的嗎?該守護程序以root身份運行,這使得它成為攻擊者的潛在入口。這並不是安全計算的一個不可逾越的障礙,但它確實意味着你必須花一些心思來處理Docker的安全問題

在某些情況下,你想在主機上以root權限運行容器,而Podman可以讓你這樣做。但如果你想把你的容器安全地限制在用户空間,你也可以通過運行所謂的無根容器來做到這一點。無根容器沒有比啟動它的用户更多的權限;在容器內,該用户有root權限。你也可以使用命令行標誌,以一種精細的方式為你的容器添加權限。

性能如何?

Docker在性能方面比Podman更勝一籌,至少有人這樣認為。雖然關於這個問題的具體信息很少,但在Hacker NewsStack OverflowReddit上不難發現沮喪的開發者抱怨Podman的性能,尤其是在無根運行時。一些瑞典的大學生在幾個不同的容器平台上運行了一個基準測試套件,發現Podman的性能不足,儘管這是一個較早的1.0前版本的Podman。雖然沒有很多關於這個話題的技術信息,但從軼事上看,Podman的性能被扣分了。

Podman會取代Docker嗎?

從目前的討論來看,可能聽起來沒有任何偉大的氛圍轉變,用Podman取代Docker。但是,一個重大的變化即將到來,它將把Docker從其長期的利基中取代。Kubernetes本身。

Kubernetes和Docker多年來一直是容器世界的雙巨頭。但他們的共存總是有些不安。Kubernetes的興起是在Docker在其利基市場上站穩腳跟之後--事實上,你可以説Kubernetes之所以流行,部分原因是Docker不能勝任管理大型分佈式應用中需要協調的所有容器的任務。

Docker(公司)在2015年開發了自己的容器協調平台,被稱為Swarm,旨在發揮Docker的優勢。Swarm是在大張旗鼓的情況下推出的,但從未趕上Kubernetes。雖然Swarm仍有擁護者,但Kubernetes已經成為容器協調的事實標準,就像Docker成為容器生態系統其他方面的事實標準一樣。

此外,Docker在其容器運行時間方面從未與Kubernetes打過交道,Kubernetes是容器引擎的底層組件,除其他任務外,還與底層操作系統(OS)內核一起工作並掛載單個容器鏡像。Docker和Kubernetes都符合OCI圖像規範,Kubernetes使用該規範來協調為容器構建的圖像。但Kubernetes也依賴於與標準化插件API兼容的容器運行時間,該插件稱為容器運行時間接口(CRI),而Docker一直沒有實現。

長期以來,Docker的流行迫使Kubernetes使用Dockershim,這是一個符合CRI的層,是Kubernetes和Docker守護程序之間的一箇中介。然而,這始終是一個黑客,今年年初,Kubernetes放棄了對Dockershim的支持。(相比之下,Podman使用雲原生計算基金會的兼容CRI-O運行時)。

這是關於Docker試圖成為一家企業公司而又失敗的更大故事的一部分。簡而言之,Docker從未能完全擺脱Kubernetes的束縛。同時,Kubernetes也不再像以前那樣需要Docker了。

Podman是否會取代Docker還不清楚,但它肯定會成為競爭者之一。這有助於Podman不是一個尋求貨幣化的旗艦產品,而是一個更大的公司的單一開源技術產品。我們可以期待Podman和Kubernetes在未來的一段時間內保持交織在一起。

你應該使用哪個容器引擎?

希望這次討論能讓你瞭解到幫助你在這兩個容器引擎中選擇的因素。Podman是基於更安全的架構,而Docker則有更深的歷史。Podman是Kubernetes原生的,而Docker也可以和Docker Swarm一起工作。Docker包含了許多容器相關任務所需的所有功能。Podman是模塊化的,可以讓你為不同的目的嘗試不同的工具。

綜上所述,"Podman vs. Docker "的問題在某種程度上是一個錯誤的選擇。這兩個平台都能創建符合OCI規範的鏡像,而且都由許多相同的命令驅動,所以你可以在兩者之間無縫移動。例如,你可能想使用Docker進行本地開發,然後使用Podman來部署你在Kubernetes內構建的容器