Obwohl es viele gute Blogs und Tutorials zu Podman und Buildah gibt, fehlen Docker-Benutzern eindeutig klare und präzise Erklärungen, wie sie zu Podman wechseln, warum Buildah in anderen Ausgaben dieser Art benötigt wird.

Wir werden versuchen, diese Fragen zu beantworten und Ihnen zu erklären, wie Sie nahtlos von Docker zu Podman migrieren können.
Wie Docker funktioniert
Lassen Sie uns zunächst klären, wie Docker funktioniert, um zu verstehen, warum Podman und Buildah entstanden sind. Wie Sie wissen, funktionieren Docker-Befehle nur, wenn der Docker-Dämonprozess ausgeführt wird. Die Idee mit dem Daemon war anscheinend, alle coolen Sachen, die Docker macht, an einem Ort zu sammeln und gleichzeitig nützliche APIs zu organisieren, um für die Zukunft damit zu arbeiten. Wie in der folgenden Abbildung dargestellt, enthält der Docker-Dämon alle Funktionen, die zur Ausführung der folgenden Aufgaben erforderlich sind:
- Pull- und Push-Vorgänge bei der Arbeit mit der Registrierung von Bildern;
- Erstellen von Kopien von Bildern im lokalen Containerspeicher und Hinzufügen von Ebenen zu diesen Containern;
- Festschreiben von Änderungen in Containern und Entfernen von Container-Images aus dem lokalen Repository auf dem Host;
- Fordern Sie den Betriebssystemkern auf, den Container im entsprechenden Namespace, in der entsprechenden cgroup usw. zu starten.
Im Wesentlichen kümmert sich der Docker-Daemon um die gesamte Arbeit mit Registern, Bildern, Containern und dem Kernel. Und Sie sagen ihm einfach über die Befehlszeilenschnittstelle (CLI), was zu tun ist.
Hier werden wir die Vor- und Nachteile dieses Ansatzes nicht abwägen, wenn alles in einem Dämonenprozess zusammengesetzt ist. Viele Argumente können zu seinen Gunsten vorgebracht werden, und zum Zeitpunkt der Entstehung von Docker war dies durchaus sinnvoll. Mit der aktiven Nutzung von Docker stellten sich ihm jedoch Fragen, zum Beispiel:
- Ein einzelner Prozess bedeutet einen einzelnen Fehlerpunkt.
- Der Dämonprozess besitzt alle untergeordneten Prozesse (laufende Container).
- Wenn der Dämon geht, bleiben die Kinderprozesse Waisen;
- Die Behälterbaugruppe weist Sicherheitslücken auf.
- Um Docker-Vorgänge ausführen zu können, benötigen die Benutzer die vollständigen Root-Berechtigungen.
Es gab andere Beschwerden. Man kann dem nicht zustimmen oder sagen, dass diese Mängel bereits beseitigt wurden, aber wir werden nicht streiten. Podman-Entwickler glauben, dass sie es geschafft haben, viele dieser Probleme zu lösen. Wenn Sie Podman nutzen möchten, ist dieser Artikel genau das Richtige für Sie.
Die Essenz von Podman besteht darin, mit der Image-Registrierung, mit Containern und Image-Speicher sowie mit dem Linux-Kernel nicht über einen Daemon, sondern direkt über den runC-Prozess zu interagieren, der für das Starten von Containern verantwortlich ist.
Nachdem wir die Motive der Podman-Entwickler teilweise herausgefunden haben, ist es Zeit zu diskutieren, was der Übergang zu Podman für den Benutzer bedeutet. Und hier müssen wir Folgendes verstehen und klarstellen (wir werden es unten tun):
- Podman ersetzt Docker. Gleichzeitig ist es nicht mehr erforderlich, einen Daemon-Prozess wie den Docker-Daemon zu starten.
- Die bekannten Docker-Befehle funktionieren in Podman genauso.
- Podman speichert Container und Bilder nicht am selben Ort wie Docker.
- Podman- und Docker-Bilder sind kompatibel.
- In Kubernetes-Umgebungen kann Podman mehr als nur Docker.
- Außerdem werden wir analysieren, was Buildah ist und warum es benötigt wird.
Podman-Installation
Wenn Sie Docker verwenden, können Sie es entfernen, wenn Sie sich für einen Wechsel entscheiden. Sie können Docker jedoch verlassen, während Sie Podman ausprobieren. Es gibt einige nützliche
Lektionen und großartige
Demos , die für den Anfang hilfreich sein können, um den Übergangsprozess besser zu verstehen. In einem Beispiel in der Demo muss Docker die Kompatibilität zeigen.
Verwenden Sie Folgendes, um Podman unter
Red Hat Enterprise Linux 7.6 oder höher zu installieren. Wenn Sie Fedora verwenden, ersetzen Sie yum durch dnf:
# yum -y install podman
Podman verwendet dieselben Befehle wie Docker
Podman wurde so konzipiert, dass es einfach ist, von Docker zu wechseln. Daher arbeiten alle Teams, die Sie von Docker kennen, in Podman auf dieselbe Weise. Darüber hinaus wird argumentiert, dass Docker-Aufrufskripte gut funktionieren sollten, wenn Sie den entsprechenden Alias wie folgt erstellen: alias docker = podman - probieren Sie es einfach aus. Natürlich müssen Sie vorher Docker stoppen (systemctl stop docker). Darüber hinaus können Sie das Podman-Docker-Paket installieren, das alle erforderlichen Konvertierungen für Sie vornimmt. Es wird einfach ein Skript in / usr / bin / docker abgelegt, das Podman mit denselben Argumenten ausführt, die Docker verwendet.
Die üblichen Docker-Befehle wie Ziehen, Drücken, Erstellen, Ausführen, Festschreiben, Markieren usw. befinden sich alle in Podman. Weitere Informationen finden Sie im Podman-Handbuch. Ein wichtiger Unterschied besteht darin, dass einige Teams in Podman Convenience-Flags hinzugefügt haben, z. B. die Flags --all (-a) für die Befehle podman rm und podman rmi, die viele als sehr nützlich empfinden.
Darüber hinaus kann Podman als normaler Benutzer ohne Root-Rechte ausgeführt werden. Richtig, bisher funktioniert dies nur in Fedora und mit Podman 1.0, und in RHEL sollte es ab den Versionen 7.7 und 8.1 erscheinen. Möglich wurde dies durch Verbesserungen im User-Space-Schutz. Wenn Sie als normaler Benutzer ausgeführt werden, speichert Podman standardmäßig Bilder und Container im Ausgangsverzeichnis des Benutzers. Wir werden dies im nächsten Abschnitt ausführlicher erläutern. Weitere Informationen zum Ausführen von Podman ohne Root-Rechte finden Sie in Dan Walshs Artikel
Wie funktioniert rootless Podman? .
Podman- und Containerbilder
Wenn Sie den Befehl podman images zum ersten Mal eingeben, werden Sie höchstwahrscheinlich entmutigt, da Sie keine Docker-Images sehen, die bereits zuvor auf Ihren Computer heruntergeladen wurden. Tatsache ist, dass sich das lokale Podman-Repository im Ordner / var / lib / container und nicht im Verzeichnis / var / lib / docker befindet. Dies geschah nicht nur so, sondern als Teil einer neuen Speicherstruktur, die den OCI-Standards (Open Containers Initiative) entspricht.
Im Jahr 2015 gründeten Docker, Red Hat, CoreOS, SUSE, Google und andere Linux-Container-Trendsetter die Open Container Initiative, eine unabhängige Einrichtung zur Verwaltung von Standardspezifikationen für das Format von Container-Images und deren Laufzeit. Im Rahmen der OCI wurden Container / Image- und Container / Storage-Projekte auf GitHub erstellt.
Da Podman ohne Root-Rechte ausgeführt werden kann, benötigt es einen separaten Ort für die Aufnahme von Bildern. Daher befindet sich das Podman-Repository im Benutzerverzeichnis ~ / .local / share / container des Benutzers. Dies hilft, eine Situation zu vermeiden, in der sie alles in / var / lib / container und in Bezug auf andere Praktiken schreiben können, die aus Sicherheitsgründen gefährlich sind. Außerdem verfügt jetzt jeder Benutzer über einen eigenen, separaten Satz von Containern, sodass mehrere Benutzer gleichzeitig auf dem Host arbeiten können. Nach Abschluss der Arbeit können Benutzer Push-Sendungen an die allgemeine Registrierung senden, um ihre Bilder anderen zur Verfügung zu stellen.
Wenn Sie von Docker zu Podman wechseln, ist es hilfreich, die neuen Container-Speicherpfade zu kennen, wenn Sie debuggen und das lokale Repository mit dem Befehl rm -rf / var / lib / container löschen möchten, um von vorne zu beginnen. Wenn Sie jedoch zu Podman wechseln, werden Sie höchstwahrscheinlich die neue Option -all für die Befehle podman rm und podman rmi anstelle dieses Befehls verwenden.
Containerkompatibilität zwischen Podman und anderen Laufzeiten
Trotz der unterschiedlichen Speicherorte der lokalen Repositorys erstellen sowohl Docker als auch Podman Container-Images, die mit dem OCI-Standard kompatibel sind. Podman kann beliebte Containerregister wie Quay.io oder Docker Hub sowie private Register in beide Richtungen (Push and Pull) verwenden. Mit Podman können Sie beispielsweise das neueste Fedora-Image vom Docker Hub herunterladen und ausführen. Wenn Sie keine Registrierung angeben, durchsucht Podman standardmäßig die in der Datei "regies.conf." Aufgeführten Registrierungen in der in dieser Datei angegebenen Reihenfolge. Das erste in dieser Datei ist zunächst die Docker Hub-Registrierung.
$ podman pull fedora:latest $ podman run -it fedora bash
Bilder, die mit Docker in die Registrierung hochgeladen wurden, können mit Podman heruntergeladen und ausgeführt werden. Wenn wir beispielsweise mit Docker ein myfedora-Image erstellt und in unser Quay.io-Repository (ipbabble) hochgeladen haben, können Sie es mit Podman wie folgt herunterladen:
$ podman pull quay.io/ipbabble/myfedora:latest $ podman run -it myfedora bash
Mit Podman können Sie Bilder einfach und elegant zwischen den Verzeichnissen / var / lib / docker und / var / lib / container verschieben, indem Sie die Push- und Pull-Befehle verwenden, zum Beispiel:
$ podman push myfedora docker-daemon:myfedora:latest
Wenn Sie in diesem Beispiel den Docker-Daemon weglassen, wird der Push-Send an den Docker Hub gesendet. Wenn Sie quay.io/myquayid/myfedora angeben, wird das Bild in die Registrierung von Quay.io hochgeladen (hier ist myquayid der Name unseres Kontos auf Quay.io):
$ podman push myfedora quay.io/myquayid/myfedora:latest
Wenn Sie Docker verlassen möchten, um es zu deinstallieren, fahren Sie einfach den Dämon herunter und entfernen Sie das Docker-Paket mithilfe des Paketmanagers. Laden Sie jedoch vorher alle Bilder, die Sie mit Docker benötigen, in die externe (nicht lokale) Registrierung herunter, damit Sie sie später von dort herunterladen können. Sie können sie auch mit Podman aus dem lokalen Docker-Repository in das lokale Podman-OCI-Repository herunterladen. In RHEL erfolgt die Übertragung eines Fedora-Bilds beispielsweise folgendermaßen:
# systemctl stop docker # podman pull docker-daemon:fedora:latest # yum -y remove docker # optional
Podman macht es einfach, zu Kubernetes zu wechseln
Podman bietet im Vergleich zu Docker eine Reihe zusätzlicher Funktionen, die Entwicklern und IT-Betreibern bei der Arbeit mit Kubernetes nützlich sind, insbesondere nützliche Befehle, über die Docker einfach nicht verfügt. Wenn Sie mit Docker vertraut sind und in Betracht ziehen, als Containerplattform auf Kubernetes / OpenShift umzusteigen, ist Podman hilfreich.
Podman kann eine Kubernetes YAML-Datei basierend auf einem laufenden Container mit dem Befehl podman generate kube generieren. Beim Debuggen laufender Pods können Sie zusätzlich zu den Standardbefehlen für die Arbeit mit Containern auch den Befehl podman pod verwenden. Weitere Informationen darüber, wie Podman beim Wechsel zu Kubernetes hilft, finden Sie in Brent Baudes Artikel Podman kann jetzt den Übergang zu Kubernetes und CRI-O erleichtern.
Buildah - was ist das und warum?
Buildah erschien früher als Podman. Und dies entmutigt Docker-Benutzer manchmal: „Warum sprechen Podman-Apologeten plötzlich über Buildah? Podman weiß nicht, wie man baut? "
Wir beeilen uns zu beruhigen, Podman kann und tut es genau wie Docker. Das heißt, die Assembly kann entweder mit dem Dockerfile- und dem Podman-Build-Befehl ausgeführt werden, oder Sie können den Container starten, die erforderlichen Änderungen vornehmen und diese dann festschreiben (Commit ausführen) und ein neues Tag im Container-Image erstellen. In unserer Interpretation ist Buildah ein erweiterter Befehlssatz zum Erstellen und Verwalten von Containerbildern und bietet daher eine viel feinere Kontrolle beim Arbeiten mit Bildern. Der Podman-Build-Befehl enthält teilweise die Buildah-Funktionalität und verwendet für den Build denselben Programmcode wie Buildah selbst.
Der effizienteste Weg, Buildah zu verwenden, besteht darin, Bash-Skripte zu schreiben, um Bilder zu erstellen, ähnlich wie Sie für eine Docker-Datei schreiben.
Was die Chronologie des Auftretens von Buildah und Podman betrifft, so ereigneten sich die Ereignisse ungefähr wie folgt. Als Kubernetes lernte, mit CRI-O basierend auf dem OCI-Standard für Containerlaufzeiten zu arbeiten, wurde der Docker-Daemon nicht mehr benötigt. Das heißt, Docker musste nicht mehr auf allen Knoten des Kubernetes-Clusters installiert werden, um Pods und Container darin auszuführen. Kubernetes kann jetzt CRI-O aufrufen und RunC direkt ausführen, wodurch wiederum Containerprozesse gestartet werden. Wenn wir jedoch gleichzeitig denselben Kubernetes-Cluster nicht nur zum Starten, sondern auch zum Zusammenstellen von Containern verwenden möchten (wie beispielsweise in OpenShift), benötigen wir ein neues Build-Tool, das nicht vom Docker-Daemon und abhängt Infolgedessen wäre die Installation von Docker nicht erforderlich. Darüber hinaus würde ein solches Tool, das auf der Grundlage der Projekte Container / Speicher und Container / Image erstellt wurde, die Sicherheitsrisiken beseitigen, die mit dem offenen Socket des Docker-Dämons während der Montage verbunden sind, und viele Docker-Benutzer sind über diese Risiken besorgt.
Und Buildah wurde zu einem so neuen Werkzeug (der Name lautet „Build“ und ahmt den Bostoner Akzent des Projektmanagers Dan Walsh nach, während er das Wort „Builder“ ausspricht). Weitere Informationen zu Buildah finden Sie unter buildah.io sowie Blogs und Link-Anleitungen am Ende dieses Artikels.
Wenn Sie Buildah verwenden möchten, müssen Sie einige weitere Details beachten:
- Es bietet eine genauere Steuerung beim Erstellen von Bildebenen. Insbesondere können Sie damit das tun, was viele Containerbenutzer schon lange wollten - viele Änderungen gleichzeitig mit nur einer Ebene übernehmen.
- Buildahs Lauf und Podmans Lauf sind zwei verschiedene Dinge. Da Buildah zum Erstellen von Images entwickelt wurde, entspricht der Befehl run im Wesentlichen dem Befehl RUN in der Docker-Datei. William Henry, einer der Entwickler von Buildah, erinnert sich an die Entstehung dieser Lösung: „Ich habe irgendwie gejammert, dass ein Port oder Mount überhaupt nicht wie erwartet funktioniert hat. Dan Walsh (@rhatdan) wog alles ab und sagte, dass Buildah überhaupt nicht mit Containern auf diese Weise arbeiten sollte. Alles, keine Portzuordnungen mehr und keine Mount-Volumes mehr. Wir entfernen diese Flags und verwenden stattdessen buildah run, um die Befehle auszuführen, die beim Erstellen von Container-Images erforderlich sind, z. B. buildah run dnf -y install nginx. "
- Buildah kann Bilder von Grund auf neu erstellen (Scratch-Bilder). Das heißt, Bilder, in denen es buchstäblich nichts gibt. Wenn Sie sich den Containerspeicher ansehen, der als Ergebnis des Befehls buildah von Grund auf neu erstellt wurde, gibt es tatsächlich ein leeres Verzeichnis. Dies ist unter dem Gesichtspunkt sehr nützlich, um superleichte Images zu erstellen, die nur die Pakete enthalten, die zum Ausführen der Anwendung erforderlich sind.
Warum von Grund auf neu bauen? Vergleichen wir das Entwicklungsimage einer Java-Anwendung mit dem Image für eine Produktionsumgebung oder eine Staging-Umgebung. In der Entwicklungsphase enthält das Image möglicherweise den Java-Compiler Maven und andere Tools, die der Entwickler benötigt. Bei der Übersetzung in die Produktion sollten jedoch nur die Java-Laufzeit und Ihre Pakete im Image verbleiben. Übrigens, um das Überflüssige zu entfernen, benötigen Sie überhaupt keinen Paketmanager wie DNF / YUM und Sie benötigen nicht einmal Bash - Sie können alles über die Buildah CLI-Schnittstelle tun, wie in der folgenden Abbildung gezeigt, wobei sich der traditionelle mehrschichtige Container links und der einschichtige Container rechts befindet Kratzbild. Weitere
Informationen finden Sie unter Erstellen eines Buildah-Container-Images für Kubernetes und
Buildah-Einführungsdemo .
Zurück zur Chronologie. Kubernetes hat also gelernt, mit CRI-O und runC zu arbeiten, und für den Build haben wir Buildah gestapelt - alles, von Docker auf dem Kubernetes-Host, können Sie ablehnen? Nein, das Debuggen bleibt weiterhin bestehen. Wie löse ich Probleme mit Containern, wenn der Host nicht über die entsprechenden Tools verfügt? Setzen Sie Docker nicht darauf, sonst kehren wir wieder zum Dämon zurück und alle Bemühungen waren vergebens. Und dann betritt Podman die Szene.
Das heißt, Podman löst zwei Probleme gleichzeitig. Erstens können IT-Bediener Container und Bilder mit vertrauten Befehlen überprüfen. Und zweitens gibt er Entwicklern dieselben Tools. Infolgedessen können alle Docker-Benutzer - sowohl Entwickler als auch Betreiber - zu Podman wechseln und die Aufgaben, für die sie zuvor Docker verwendet haben, ruhig ausführen sowie eine ganze Reihe neuer Aufgaben lösen.
Benötigte Ressourcen:
- Website für die Projekte Podman.io und Buildah.io.
- Projekte unter github.com/containers (verbinden Sie sich, studieren Sie die Quelle und sehen Sie, was sich in der Entwicklung befindet:
- Libpod (Podman);
- Buildah;
- Bild (Code für die Arbeit mit Container-OCI-Bildern);
- Speicherung (Code zur lokalen Speicherung von Container-Images).
Nützliche Links: