Podman vs. Docker: Welches soll man wählen?

Wer sich mit Virtualisierung und Containerisierung auseinandersetzt, ist wahrscheinlich auf Podman und Docker gestoßen und fragt sich, worin die Unterschiede liegen.

Dieser Artikel beleuchtet die Differenzen zwischen Docker und Podman, um Ihnen bei der Entscheidung zu helfen, welches Tool besser zu Ihren Bedürfnissen passt!

Docker

Docker ist eine Technologie zur Containerisierung, die das Management von Abhängigkeiten innerhalb eines Projekts in allen Phasen (Entwicklung und Bereitstellung) vereinfacht.

Docker ist für Linux, Windows und macOS verfügbar und konzentriert sich auf Container und deren Orchestrierung, was es von der traditionellen Virtualisierung unterscheidet.

Docker basiert auf zwei Hauptelementen: Docker CLI und Docker Daemon.

Docker-Daemon:

Dies ist ein ständiger Hintergrundprozess, der Docker-Images, Container, Netzwerke und Speichervolumes verwaltet. Docker nutzt seine Docker-Engine-REST-API zur Kommunikation mit dem Docker-Daemon, auf den über das HTTP-Protokoll zugegriffen wird.

Docker-CLI:

Bildquelle: Redhat

Die Docker-Befehlszeilenschnittstelle dient zur Interaktion mit dem Docker-Daemon. Sie verwenden diese Schnittstelle, wenn Sie Docker-Befehle ausführen.

Docker basiert auf dem Linux-Kernel und dessen Funktionen wie Cgroups und Namespaces. Diese Funktionen isolieren Prozesse voneinander, sodass diese unabhängig laufen können, was der Grundgedanke von Containern ist, nämlich die Ausführung mehrerer Prozesse und Anwendungen separat.

Dies ermöglicht eine effizientere Nutzung der Infrastruktur, ohne dabei die Sicherheit im Vergleich zu einzelnen Systemen zu beeinträchtigen.

Alle Container-Tools, wie auch Docker, verwenden ein Image-basiertes Bereitstellungsmodell. Dieses Modell erleichtert die gemeinsame Nutzung von Anwendungen oder Dienstgruppen über verschiedene Umgebungen hinweg.

Zusätzlich unterstützt Docker die Automatisierung der Anwendungsbereitstellung innerhalb einer Containerumgebung. Diese Tools bieten Nutzern vollständigen Zugriff auf Anwendungen und ermöglichen eine schnellere Bereitstellung, Versionskontrolle und Zuweisung.

Podman

Podman (der POD MANager) erstellt, betreibt und verwaltet OCI-Container und Container-Images. Es wurde von Red Hat entwickelt und ursprünglich für deren Enterprise Linux 8 konzipiert. Es dient der Containerverwaltung und gilt als offizieller Nachfolger von Docker.

Red Hat stellte anschließend die Unterstützung für Docker ein, versicherte aber, dass der Übergang für Benutzer einfach sei, da Podman auf Docker aufbaue, obwohl es ursprünglich nur als Debugging-Tool gedacht war.

Es verwaltet das gesamte Container-Ökosystem mit der libpod-Bibliothek. Da Podman nur auf Linux-Systemen funktioniert, werden derzeit eine REST-API und Clients entwickelt, um die Nutzung des Dienstes auch auf macOS- und Windows-Systemen zu ermöglichen.

Aktuell existiert ein Varlink-basierter Remote-Client für macOS- oder Windows-Systeme, der eine Remote-Kommunikation mit einem Linux-basierten Podman-Server erlaubt. Die libpod-Bibliothek unterstützt verschiedene Methoden für das sichere Hochladen von Images, einschließlich Vertrauenswürdigkeit und Image-Verifizierung.

Zudem werden Pods zur gemeinsamen Verwaltung von Containergruppen sowie verschiedene Image-Formate wie OCI- und Docker-Images unterstützt.

In überschaubaren Umgebungen kann Podman sogar als Vorstufe zu Kubernetes dienen. Es schließt die Lücke zwischen der singulären Verwaltung einzelner Instanzen, die in den Anfangsjahren des Container-Hypes üblich war, und der modernen Orchestrierung mit Kubernetes.

Anspruchsvolle Containernutzer können mit Pods bereits die nächste Ebene nutzen. Der Aufbau und Betrieb eines Kubernetes-Clusters entfällt. Im einfachsten Fall können neu gestaltete Pods in einzelnen Schritten getestet und optimiert werden. Auch eine spätere Übertragung auf Kubernetes ist möglich.

Der Befehl `podman generate kube` liefert die entsprechenden Konfigurationsdateien. Diese dienen dann als direkte Eingabe für das Kubernetes-Tool `kubectl`.

Aktuelle Versionen von Podman können sogar Konfigurationsdateien für `systemd` erstellen – ein großer Vorteil für alle, die den weit verbreiteten Init-Nachfolger zur Container-Orchestrierung nutzen.

Podman vs. Docker: Unterschiede

Docker hat sich schnell als Standard für die Containerverwaltung etabliert. Docker bietet viele Vorteile, insbesondere die wachsende Anzahl an verfügbaren Images, hat aber auch Nachteile und potenzielle Sicherheitsrisiken. Zudem wird Docker nicht mehr als Container-Runtime für Kubernetes unterstützt.

Die Tatsache, dass Container im Gegensatz zu virtuellen Systemen keinen eigenen Kernel benötigen, wird oft als großer Vorteil gesehen. Bei Docker stellt dies jedoch ein Sicherheitsrisiko dar, da Docker-Container meist nur mit Root-Rechten laufen können.

Dies ermöglicht es Prozessen in Containern, mit Root-Rechten auf den Kernel zuzugreifen und potenziell das Host-System anzugreifen.

Der erste Unterschied wird bei der ersten Verwendung deutlich. Während bei Docker zunächst der Docker-Daemon gestartet werden muss, kann ein Podman-Container direkt von der Kommandozeile aus gestartet werden. Es gibt also keinen Hintergrundprozess, und die Anwendung wird nur bei Bedarf ausgeführt.

Aus Sicherheitsgründen ist dies vorteilhaft, da Podman weniger anfällig für Angriffe ist, weil der Daemon nicht ständig mit Superuser-Rechten laufen muss. Podman benötigt aufgrund seiner Architektur, die sich grundlegend von Docker unterscheidet, keinen Hintergrundprozess.

Während Docker dem Client-Server-Modell folgt, bei dem der Docker-Client über eine API mit dem Docker-Daemon kommuniziert, nutzt Podman das Fork-Exec-Modell. Jeder Container wird als untergeordneter Prozess von Podman ausgeführt.

Ein Benutzernamensraum wird bei der ersten Verwendung erstellt, wenn Podman mit normalen Benutzerrechten gestartet wird. Innerhalb des Benutzernamensraums läuft Podman mit Root-Rechten und hat die Berechtigung, Dateisysteme zu mounten und Container zu erstellen.

Entsprechend hat der Podman-Container nur die Rechte des ausführenden Benutzers. Die Nutzung von Benutzernamensräumen bedeutet, dass jeder Benutzer seine eigenen Container erstellen und verwalten kann, diese aber für andere Benutzer und den Superuser unsichtbar sind.

Da Podman unabhängig von Docker betrieben wird, haben die Entwickler mehr Spielraum und können auf die Wünsche der Community eingehen. Zu den interessanten Ergänzungen von Podman gehören der Mount/Unmount-Befehl und die `systemd`-Integration.

Mit dem Befehl `mount/unmount` kann das Host-System das Dateisystem des Containers mounten, um beispielsweise auf Dateien zuzugreifen oder sie zu ändern, und sie anschließend wieder unmounten.

Während die Überwachung von Containern mit `systemd` bei Docker aufgrund des Daemons nicht einfach ist, können Container mit Podman über `systemd` gestartet, überwacht und sogar neu gestartet werden.

Podman bietet außerdem den Befehl `podman generate systemd` an, der einen entsprechenden `systemd`-Dienst für den jeweiligen Container erstellt und dem Benutzer somit die Erstellung der `systemd`-Dienste abnimmt, was die Integration auf dem Host-System erleichtert.

Ein weiterer entscheidender Unterschied zwischen Podman und Docker ist, dass Podman die Firewall-Regeln oder die aktuelle `dnsmasq`-Installation nicht verändert, da es ein internes Netzwerk erstellen kann. Im Gegensatz dazu muss Docker die Firewall-Regeln überschreiben, um die Kommunikation zwischen den Containern zu ermöglichen.

Podman Docker
Architektur Daemonless Daemon
Services Management Systemd Docker Engine
Firewall-Kompatibilität Respektiert Firewall-Regeln Überschreibt Firewall-Regeln
Plattform Native Unterstützung für Linux Linux, Windows und Mac

Wann sollten Sie von Docker zu Podman wechseln?

Wenn Sie Container in einer RHEL-basierten Umgebung bereitstellen, haben Sie kaum eine andere Wahl als Podman, da es nativ in RHEL integriert ist. Sie können auch zu Podman wechseln oder Docker bevorzugen, wenn Sie kleinere Bereitstellungen mit wenigen Containern haben.

Sobald es jedoch komplexer wird, mit mehreren Containern und einem Stapel koordinierender Container mit `docker-compose`/`podman-compose` über ein Netzwerk, ist es oft besser, Docker zu verwenden, da es die Vernetzung besser handhabt.

Wenn Sie gerade erst mit Containern beginnen, ist Docker oft eine bessere Wahl, da es stabiler und etablierter ist, eine gute Dokumentation bietet und eine flachere Lernkurve hat, im Gegensatz zu Podman, dem es noch an Stabilität und umfassender Dokumentation mangelt.

Migration von Podman zu Docker

Wenn Sie die Befehlszeile verwenden, ist der Wechsel von Docker Engine zu Podman recht einfach. Im einfachsten Fall funktioniert der Befehl `docker=podman` meist mit einem $-Alias.

Dies setzt natürlich voraus, dass die entsprechende Software auf dem System installiert ist. Bei Linux ist dies kein Problem; für übliche Distributionen sind fertige Softwarepakete verfügbar.

Windows oder macOS gehören nicht zu den unterstützten Betriebssystemen. Der Alias-Ansatz funktioniert, weil viele Docker-Befehle ein Äquivalent in Podman haben.

Es gibt aber auch Ausnahmen, da einige Docker-Befehle keine Entsprechung in der Podman-Welt haben. Zudem verhalten sich einige Befehle in Docker anders als im Podman-Universum. Dies betrifft derzeit hauptsächlich die Handhabung bereits eingerichteter Volumes.

Etwas schwieriger gestaltet sich der Wechsel, wenn grafische Tools wie Docker Desktop verwendet werden. Davon dürften besonders Entwickler betroffen sein, die mit Windows oder macOS arbeiten.

Benutzer von Docker Desktop müssen sich an die Kommandozeile gewöhnen, dasselbe gilt für Docker Compose. Es gibt jedoch das Projekt `podman-compose`. Die in Python geschriebene Software dient als Ersatz für Docker Compose.

Letzte Worte

Die Ablösung von Docker durch Podman kann als nahezu abgeschlossen betrachtet werden. Für Benutzer und Administratoren ist dieser Übergang meist unkompliziert. Viele Docker-Funktionen haben direkte Entsprechungen in Podman.

Ein deutlicher Vorteil ist das Fehlen eines einzelnen Daemon-Prozesses und Root-Privilegien, sowie die natürliche Verwendung von Containergruppen. Dennoch bleibt Docker die führende Technologie im Bereich Container, dies könnte sich aber langfristig ändern.

Sie können auch einige Docker-Befehle zur Verwaltung von Containern ausprobieren.