什麼是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內構建的容器