- Bei Docker werden aufgrund der Architektur mit einem Hintergrund-Daemon (
dockerd) seit Langem immer wieder Sicherheitslücken und unnötiger Ressourcenverbrauch kritisiert
- Podman setzt auf eine daemonlose Architektur, sodass Container direkt mit Benutzerrechten ausgeführt werden, was die Angriffsfläche verkleinert und die Stabilität erhöht
- Durch die Unterstützung von Systemd-Integration, Kubernetes-freundlichem Design und getrennten Tools nach Unix-Philosophie wie Buildah/Skopeo steigt die betriebliche Effizienz
- Dank der hohen Kompatibilität zur Docker-CLI funktionieren die meisten bestehenden Workflows schon mit
alias docker=podman unverändert weiter
- Auch in realen Betriebsumgebungen werden Sicherheit und Ressourcenmanagement einfacher, und bei neuen Projekten wird Podman zu einer vernünftigeren und zukunftsorientierten Wahl
Grenzen von Docker und Sicherheitsprobleme
- Docker basiert auf einer Struktur, bei der der
dockerd-Daemon ständig mit Root-Rechten läuft
- Wird eine Schwachstelle im Daemon gefunden, kann der gesamte Host gefährdet sein
- Beispiele wichtiger Sicherheitsvorfälle
- 2019: runC-Container-Escape (CVE-2019-5736)
- 2022: Linux-Dirty-Pipe-Schwachstelle, cgroups-v1-Escape
- 2024: runC „Leaky Vessels“, BuildKit-Schwachstelle
- 2024: Cryptojacking-Kampagne über exponierte Docker-APIs
- Die Wiederholung solcher Vorfälle macht das grundsätzliche Risiko einer daemonbasierten Architektur deutlich
Podmans daemonlose Architektur
- Podman verwendet keinen Hintergrund-Daemon
- Beim Ausführen von
podman run läuft der Container als direkter Kindprozess des aufrufenden Befehls
- Im rootless-Modus ausgeführt bedeutet Root im Container auf dem Host nur normale Benutzerrechte
- Vorteile
- Höhere Sicherheit: Im Fall eines Container-Escapes ist der Schaden begrenzter
- Mehr Stabilität: Wenn ein Container abstürzt, bleiben andere unbeeinflusst
- Effizientere Ressourcennutzung: Kein unnötiger ständig laufender Daemon, dadurch geringerer Speicherverbrauch
Besondere Funktionen von Podman
- Systemd-Integration
- Mit
podman generate systemd lassen sich systemd-Unit-Dateien automatisch erzeugen
- Dienste können mit den Standardbefehlen von
systemctl verwaltet werden
- Kubernetes-Freundlichkeit
- Das Pod-Konzept ist standardmäßig integriert und erleichtert die Entwicklung von Multi-Container-Apps
- Mit
podman generate kube lassen sich direkt Kubernetes-YAML-Dateien erzeugen
- Unix-Philosophie
- Podman konzentriert sich auf die Ausführung von Containern, für Image-Builds dient Buildah, für Registry-Verwaltung Skopeo
- So lassen sich für jeden Zweck optimal angepasste Tools nutzen
Umstieg und Kompatibilität
- Der Wechsel von Docker zu Podman erfolgt nahezu ohne Unterbrechung
- Die CLI ist kompatibel, sodass sich statt
docker einfach podman verwenden lässt
- Vorhandene Dockerfiles funktionieren unverändert weiter
- Unterschiede
- Im rootless-Modus ist das Binden an Ports unter 1024 nicht möglich → ein Reverse Proxy wird empfohlen
- Volumeberechtigungen müssen verwaltet werden
- Tools, die vom Docker-Socket abhängen, können den Docker-API-kompatiblen Modus von Podman verwenden
Einsatz in der Praxis und Vorteile
- Nach dem Einsatz von Podman in Betriebsumgebungen
- sinkt der Aufwand für Sicherheitsprüfungen, rootless-Sicherheit ist standardmäßig vorhanden
- werden Ressourcennutzungsmuster einfacher und besser vorhersehbar
- Docker ist weiterhin populär, aber für neue Projekte oder wenn es Freiheit bei der Technologiewahl gibt, ist Podman oft besser geeignet
- Natürliche Integration in Linux-Verwaltungsmechanismen
- Auf Kubernetes ausgerichtete Architektur
- Eine sicherere und vernünftigere Umgebung für die Container-Ausführung
Zusammenfassung des FastAPI-Migrationsleitfadens
- Vorhandene Dockerfiles können unverändert weiterverwendet werden
- Einfacher Ersatz durch
podman build und podman run
- Mit
podman generate systemd als systemd-Dienst registrierbar
- Unterstützung für Multi-Service-Umgebungen wie Datenbanken durch die Nutzung von Pods
- Docker-Compose-Workflows können mit
podman-compose oder durch Konvertierung mit kompose abgedeckt werden
8 Kommentare
Hier steht zwar, dass eine Umstellung ohne Downtime möglich ist, aber in der tatsächlichen Produktionsumgebung gab es ziemlich viele merkwürdige Dinge. Auf dem Mac wird zum Beispiel in der Standardeinstellung
zstd-Komprimierung verwendet, sodass die gebauten Images die Registry ziemlich stark belasten oder übermäßig beanspruchen.Docker, Podman, alles dasselbe....
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
securityContext:
runAsNonRoot: true
runAsUser: UID
In der Praxis ist die Docker-Kompatibilität nicht besonders gut, daher ist die Nutzbarkeit nicht so toll...
Ich bin wegen Rootless zu Podman gewechselt und dann wieder zu Docker zurückgekehrt.
Wie andere schon gesagt haben: Wenn man es mit Kubernetes nutzen will, kann man auch einfach
containerdverwenden.Wenn Docker Compose nicht gut funktioniert und der Vorteil in der guten Kubernetes-Kompatibilität liegt, frage ich mich, ob man dann nicht einfach direkt Kubernetes verwenden sollte.
Ich wollte es auch ausprobieren, aber da es nicht auf Anhieb lief und Port-Mappings unter 1024 auch nicht direkt möglich waren, nutze ich stattdessen einfach eine Kombination aus k3s und
nerdctlzum Bauen von Images.Ich möchte zwar schon länger irgendwann wechseln, aber als ich es früher ausprobiert habe, liefen im Gegensatz zu dem, was Entwickler oft sagen, zu viele
docker compose-Projekte einfach nicht richtig ...Docker unterstützt doch keine Netzwerke.
Soweit ich weiß, werden ähnlich wie bei Docker auch Netzwerkfunktionen unterstützt.
Gibt es denn noch Dinge, die noch nicht richtig funktionieren?
Hacker-News-Kommentar
chrootund das Jail-Konzept entschieden. Mein Deployment-Code führte Software außerhalb der Jail-Umgebung aus und überwachte mitptrace, welche Dateien der Prozess öffnete. Aus dieser Ausgabe habe ich eine Abhängigkeitsliste extrahiert und sie paketiert. Das Ergebnis war klein, unveränderlich und sicherer. Als Docker auftauchte, fühlte ich mich an diese frühere Methode erinnert, und ich frage mich, ob es ein ähnliches Tool gibt, das die Dateinutzung von Docker-Containern überwacht, um Deployments zu verkleinerngit pushden Build statischer Dateien und den Neustart von httpd. Man musste nurgit push live masterausführen, und schon war deployed. Ich habe viel Docker genutzt, aber das war das einfachste Deployment überhaupt. Ich verstehe die Vorteile von Docker, aber HTTP unter Ubuntu oder OpenBSD einzurichten ist auch nicht besonders schwer. Ich frage mich, ob die Docker-eigene Reproduzierbarkeit den zusätzlichen Verwaltungsaufwand wirklich wert istLink zum relevanten Code
--connectiondie gewünschte Umgebung angeben. Bei Bedarf kann Podman auch automatisch eine VM erzeugen und nutzen dafürlima. Podman Desktop hat außerdem eine Docker-Kompatibilitätsschicht, die Kompatibilitätsprobleme abmildertkubectleine Art Sugar-Funktion zum gegenseitigen Umwandeln von einfachen und komplexen YAMLs hättepodman generate systemdist inzwischen deprecated. Als Alternative gibt es Podman Quadlets, die ähnlich wie eine docker-compose.yaml in einer systemd-Unit-Datei definiert werdenwww-dataoder Benutzer 1000. Diese werden auf dem Host auf sekundäre IDs gemappt, wodurch bei Volume-Mounts Dateibesitzer verwaisen und große Verwirrung entsteht. Es fehlt eine einfache Option, alle UIDs auf einen einzelnen Benutzer zu mappen, und bestehende Optionen wiecrun-uidmapoderusernsfunktionieren nicht gut. Ich zweifle am praktischen Nutzen dieser sekundären ID-Zuordnungenignore_chown_errorskann man Root auf die Benutzer-ID mappen und das ohne zusätzliche Mapping-Konfiguration relativ einfach umsetzenslirp4netnsliegen.pastaist ein schnellerer Ansatz. Docker richtet standardmäßig über einen privilegierten Daemon das Netzwerk ein, also sollte es keinen Performance-Unterschied geben, wenn man Podman als Root nutzt/dev-Geräte zu mounten und sehr eingeschränkte Programme in ein isoliertes Netzwerk zu stellencrunundrunczu liegen. Außerdem ist Podman leichtergewichtig, weil kein Daemon läufthier,
hier,
und hier