Container-basierte Anwendungen haben die Softwareentwicklung in den letzten zehn Jahren revolutioniert, weil sie die Bereitstellung und Wartung verteilter und Cloud-basierter Systeme vereinfachen.
Podman - Definition
Podman ist eine Container-Engine - ein Werkzeug, um Container (-Images) zu entwickeln, zu managen und auszuführen. Container sind standardisierte, in sich geschlossene Softwarepakete, die alle erforderlichen Elemente (einschließlich Anwendungde und unterstützenden Bibliotheken) enthalten, um an einem beliebigen Ort ausgeführt zu werden. Dabei sind keine Anpassungen erforderlich.
Podman ist ein kostenloses Open-Source-Projekt von Red Hat und ein Newcomer in der Container-Welt: Version 1.0 wurde im Jahr 2019 veröffentlicht. Seitdem hat die Container-Engine große Fortschritte gemacht - wobei ihr Aufstieg auch durch den allmählichen Niedergang von Docker begünstigt wurde, dem Projekt, das in vielerlei Hinsicht die Welt der Container, wie wir sie heute kennen, geschaffen hat.
Podman und Kubernetes
Wenn Sie auch nur ansatzweise mit containerbasierter Entwicklung vertraut sind, ist Ihnen Kubernetes ein Begriff. Weil containerisierte Applikationen im Laufe der Zeit immer komplexer wurden, brauchten die Softwareentwickler Tools, um Container zu koordinieren, die miteinander interagieren während sie auf verschiedenen, virtuellen (oder auch physischen) Maschinen laufen. Diese Tools werden als Plattformen zur Container-Orchestrierung bezeichnet. Kubernetes ist in diesem Bereich das mit Abstand bekannteste Beispiel und kann mit jedem Container arbeiten, der den Image-Spezifikationen der Open Container Initiative (OCI) entspricht. Das trifft auch auf Podman-Container zu.
Eines der wichtigsten Features von Kubernetes ist das Pod-Konzept, eine ephemere Gruppierung von einem oder mehreren Containern, die die kleinste Recheneinheit darstellt, die Kubernetes managen kann. Podman basiert - wie schon die Nomenklatur nahelegt - auf dem gleichen Prinzip: Ein Podman-Pod umfasst einen oder mehrere Container, die in einem einzigen Namespace, Netzwerk und Sicherheitskontext gruppiert werden. Entsprechend ergänzen sich Podman und Kubernetes auf natürliche Art und Weise.
Podman vs. Docker
Docker war zwar nicht die erste Container-Engine, hat aber in vielerlei Hinsicht die Containerisierung definiert. Viele Elemente der Funktionsweise von Docker sind inzwischen der De-facto-Standard für Container-basierte Entwicklung. Der große Einfluss von Docker manifestiert sich unter anderem auch darin, dass der Name vielfach synonym für Container verwendet wird.
Obwohl Docker und Podman einen ähnlichen Platz im Container-Ökosystem einnehmen, weisen sie zahlreiche Unterschiede auf, wenn es um die zugrundeliegende Philosophie und die Funktionsweise geht. So ist Docker eine All-in-One-Plattform mit Werkzeugen für bestimmte Aufgaben, während Podman für bestimmte Zwecke auch auf andere Projekte zurückgreift, etwa auf Buildah, um Container-Images zu erstellen. Auch hinsichtlich der Architektur gibt es Unterschiede: So bringt Docker kein eigenes Konzept für Pods mit. Ein weiterer wichtiger Unterschied: Docker verlässt sich auf ein kontinuierlich im Hintergrund laufendes Daemon-Programm, um Images zu erstellen und Container auszuführen. Podman startet Container und Pods als separate Prozesse. Dieser Design-Aspekt hat wichtige Konsequenzen für die Sicherheit, auf die wir gleich noch eingehen.
Docker-Befehle auf Podman
Aufgrund ihres Designs sind Podman und Docker im allgemeinen miteinander kompatibel, was zum Teil auf offene Standards zurückgeführt werden kann: Da beide Engines mit Containern arbeiten, die dem OCI-Standard entsprechen, ist es möglich, einen Container mit Docker zu erstellen und ihn in Podman zu modifizieren (oder umgekehrt), um ihn dann in Kubernetes bereitzustellen.
Zum Zeitpunkt der Veröffentlichung von Podman im Jahr 2019 war Docker so dominant, dass sein Kommandozeilen-Interface für viele Entwickler zum alltäglichen Teil ihrer Arbeit geworden war. Um einen Umstieg auf Podman möglichst nahtlos zu gestalten, haben dessen Entwickler dafür gesorgt, dass die Befehle und die Syntax so weit wie möglich an die von Docker angelehnt sind. Dabei gingen sie so weit, eine Alias-Funktion zu integrieren, die Docker-Befehle zu Podman umleitet.
Bessere Sicherheit mit Rootless Containers
Wenn Podman und Docker in vielerlei Hinsicht so ähnlich funktionieren, warum sollte man dann die Pferde wechseln? Ein wichtiger Grund: die Sicherheit. Der Docker-Daemon läuft mit Root-Rechten, was ihn zu einem potenziellen Einfallstor für bösartige Angreifer macht. Das stellt keine unüberwindbare Hürde für die sichere Datenverarbeitung dar, erfordert aber, sich mit den Sicherheits-Features von Docker zu beschäftigen.
In manchen Situationen möchten Sie einen Container mit Root-Rechten auf seinem Host-Rechner ausführen - das ist auch mit Podman möglich. Wenn Sie Ihre Container jedoch lieber auf den Userspace beschränken möchten, ermöglicht die quelloffene Engine auch das, indem ein sogenannter Rootless-Container eingesetzt wird. Dieser verfügt über die gleichen Berechtigungen wie der Benutzer, der ihn erstellt hat. Zudem können Containern über Command-Line Flags granulare Privilegien zugewiesen werden.
Wie sieht es mit der Leistung aus?
Ein Bereich, in dem Docker Podman nach Meinung vieler voraus ist, ist die Performance. Zwar gibt es zu diesem Thema wenig konkrete Informationen. In Foren wie Hacker News, Stack Overflow und Reddit finden sich aber immer wieder frustrierte Developers, die sich über die Performance von Podman beschweren - insbesondere wenn es ohne Root-Rechte läuft.
Podman - das neue Docker?
Kubernetes und Docker sind seit Jahren die beiden Giganten innerhalb der Container-Welt. Aber ihre Koexistenz war schon immer etwas unharmonisch. Der Aufstieg von Kubernetes erfolgte, nachdem sich Docker in seiner Nische etabliert hatte. Man könnte sogar so weit gehen, zu behaupten, Kubernetes ist nur deshalb so populär geworden, weil Docker der Aufgabe nicht gewachsen war all die Container zu managen, die eine große, verteilte Anwendungslandschaft mit sich bringt.
Das Unternehmen Docker entwickelte im Jahr 2015 seine eigene Container-Orchestrierungsplattform, die die Stärken von Docker ausspielen sollte. Swarm wurde mit großem Tamtam eingeführt, konnte allerdings nie ganz mit Kubernetes mithalten. Kubernetes ist heute der De-Facto-Standard für Container-Orchestrierung, so wie Docker das einst für andere Aspekte des Container-Ökosystems war.
Darüber hinaus hat Docker in Bezug auf seine Container-Runtime (die Low-Level-Komponente der Container-Engine, die unter anderem mit dem zugrundeliegenden Betriebssystem-Kernel arbeitet und einzelne Container-Images einbindet) nie ganz mit Kubernetes harmoniert. Sowohl Docker als auch Kubernetes sind konform mit der OCI-Image-Spezifikation, die Kubernetes zur Koordinierung der für Container erstellten Images verwendet. Kubernetes ist jedoch auch auf Container-Laufzeiten angewiesen, die mit einer standardisierten Plugin-API namens Container Runtime Interface (CRI) kompatibel sind. Diese hat Docker nie implementiert. Podman hingegen verwendet die kompatible CRI-O-Laufzeitumgebung der Cloud Native Computing Foundation.
Lange Zeit war Kubernetes aufgrund der Popularität von Docker gezwungen, Dockershim zu verwenden, eine CRI-kompatible Schicht, die als Vermittler zwischen Kubernetes und dem Docker-Daemon fungierte. Das war jedoch immer eher eine Notlösung - Anfang 2022 hat Kubernetes den Support für Dockershim eingestellt. Anders ausgedrückt: Docker war nie in der Lage, sich vollständig von Kubernetes zu lösen. Kubernetes hingegen braucht Docker nicht mehr in dem Maße, wie es einmal der Fall war.
Ob Podman Docker ersetzen wird, ist unklar, aber diese Möglichkeit besteht definitiv. Dabei ist es hilfreich, dass Podman kein Flaggschiffprodukt von Red Hat ist, das monetarisiert werden soll, sondern vielmehr ein Open-Source-Technologieangebot eines großen Unternehmens. Es ist davon auszugehen, dass Podman und Kubernetes in Zukunft eng miteinander verflochten bleiben.
Welche Container-Engine ist die Richtige?
Sowohl Podman als auch Docker erstellen Images, die der OCI-Spezifikation entsprechen und beide werden mit ähnlichen Befehlen gesteuert, so dass ein nahtloser Wechsel zwischen ihnen möglich ist. Docker ließe sich beispielsweise für die lokale Entwicklung nutzen - Podman, um die erstellten Container in Kubernetes bereitzustellen.
Ein Merkmal, das Docker abhebt, ist der kostenpflichtige Support. Aber das hat auch eine Kehrseite: Da Docker (das Unternehmen) versucht, sein Flaggschiffangebot zu monetarisieren, hat es begonnen, für die Entwicklungsumgebung Docker Desktop Gebühren zu erheben. Red Hat hingegen scheint sich damit zufrieden zu geben, Podman (vorerst) kostenlos anzubieten. (fm)
Dieser Beitrag basiert auf einem Artikel unserer US-Schwesterpublikation Infoworld.