Eine Einführung in Podman

1. Einleitung

In diesem Tutorial werden wir uns mit Podman (kurz für „Pod Manager“), seinen Funktionen und seiner Verwendung befassen.

2. Podman

Podman ist ein Open-Source-Containerverwaltungstool zum Entwickeln, Verwalten und Ausführen von OCI-Containern. Schauen wir uns einige der Vorteile von Podman im Vergleich zu anderen Tools zur Containerverwaltung an:

  • Von Podman erstellte Bilder sind mit anderen Tools zur Containerverwaltung kompatibel . Die von Podman erstellten Bilder entsprechen dem OCI-Standard und können daher in andere Containerregister wie Docker Hub übertragen werden
  • Es kann als normaler Benutzer ausgeführt werden, ohne dass Root-Rechte erforderlich sind. Wenn Podman als Nicht-Root-Benutzer ausgeführt wird, erstellt er einen Benutzernamensraum, in dem er die Root-Berechtigung erhält. Dadurch können Dateisysteme bereitgestellt und erforderliche Container eingerichtet werden
  • Es bietet die Möglichkeit, Pods zu verwalten. Im Gegensatz zu den anderen Container-Laufzeit-Tools kann der Benutzer mit Podman Pods verwalten (eine Gruppe von einem oder mehreren Containern, die zusammenarbeiten). Benutzer können Vorgänge wie Erstellen, Auflisten und Überprüfen der Pods ausführen

Podman unterliegt jedoch bestimmten Einschränkungen:

  • Es läuft nur auf Linux-basierten Systemen. Derzeit läuft Podman nur unter Linux-basierten Betriebssystemen und hat keinen Wrapper für Windows und MacOS.
  • Für Docker Compose gibt es keine Alternative. Podman unterstützt die lokale Verwaltung mehrerer Container nicht, ähnlich wie Docker Compose. Eine Implementierung von Docker Compose mithilfe des Podman-Backends wird im Rahmen des Podman-Compose- Projekts entwickelt, ist jedoch noch in Arbeit.

3. Vergleich mit Docker

Nachdem wir verstanden haben, was Podman ist und welche Vor- und Nachteile es hat, vergleichen wir es mit Docker, einem der am häufigsten verwendeten Tools für die Containerverwaltung.

3.1. Befehlszeilenschnittstelle (CLI)

Podman bietet denselben Befehlssatz wie der Docker-Client. Mit anderen Worten, es gibt eine Eins-zu-Eins-Zuordnung zwischen den Befehlen dieser beiden Dienstprogramme.

Die Befehle wie podman ps und podman images zeigen jedoch nicht die mit Docker erstellten Container oder Images an. Dies liegt daran, dass das lokale Repository von Podman / var / lib / container ist und nicht / var / lib / docker , das von Docker verwaltet wird.

3.2. Containermodell

Docker verwendet eine Client-Server-Architektur für die Container, während Podman das traditionelle Fork-Exec-Modell verwendet, das für Linux-Prozesse gleich ist. Die mit Podman erstellten Container sind der untergeordnete Prozess des übergeordneten Podman-Prozesses. Dies ist der Grund, warum Docker beim Ausführen des Versionsbefehls für Docker und Podman die Versionen von Client und Server auflistet, während Podman nur die Version auflistet.

Beispielausgabe für Docker-Version :

Client: Version: 17.12.0-ce API version: 1.35 Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:11:19 2017 OS/Arch: linux/amd64 Server: Engine: Version: 17.12.0-ce API version: 1.35 (minimum version 1.12) Go version: go1.9.2 Git commit: c97c6d6 Built: Wed Dec 27 20:09:53 2017 OS/Arch: linux/amd64 Experimental: false

Beispielausgabe für die Podman-Version :

Version: 0.3.2-dev Go Version: go1.9.4 Git Commit: "4f4a78abb40fa0e8407e8a55d5a67a2650d8fd96" Built: Mon Mar 5 11:10:35 2018 OS/Arch: linux/amd64

Da Podman selbst als Prozess ausgeführt wird, sind im Hintergrund keine Daemon-Prozesse erforderlich. Im Gegensatz zu Podman benötigt Docker einen Daemon-Prozess, den Docker-Daemon, um die API-Anforderungen zwischen Client und Server zu koordinieren .

3.3. Rootless-Modus

Wie bereits erwähnt, benötigt Podman keinen Root-Zugriff, um seine Befehle auszuführen. Docker hingegen erfordert vom Daemon-Prozess abhängig Root-Berechtigungen oder erfordert, dass der Benutzer Teil der Docker- Gruppe ist , um die Docker-Befehle ohne Root-Berechtigungen ausführen zu können .

$ sudo usermod -aG docker $USER

4. Installation und Verwendung

Beginnen wir mit der Installation von Podman. Der Befehl podman info zeigt Podman-Systeminformationen an und hilft bei der Überprüfung des Installationsstatus.

$ podman info

Dieser Befehl zeigt die Informationen zum Host an, z. B. die Kernel-Version, den verwendeten und verfügbaren Swap-Speicherplatz sowie die Informationen zu Podman, z. B. Registrierungen, auf die Bilder abgerufen und verschoben werden können, den verwendeten Speichertreiber, den Speicherort und andere:

host: MemFree: 546578432 MemTotal: 1040318464 SwapFree: 4216320000 SwapTotal: 4216320000 arch: amd64 cpus: 2 hostname: base-xenial kernel: 4.4.0-116-generic os: linux uptime: 1m 2.64s insecure registries: registries: [] registries: registries: - docker.io - registry.fedoraproject.org - registry.access.redhat.com store: ContainerStore: number: 0 GraphDriverName: overlay GraphOptions: null GraphRoot: /var/lib/containers/storage GraphStatus: Backing Filesystem: extfs Native Overlay Diff: "true" Supports d_type: "true" ImageStore: number: 0 RunRoot: /var/run/containers/storage

Werfen wir einen Blick auf einige der grundlegenden Podman-Befehle.

4.1. Ein Bild erstellen

Zunächst wird ein Bild mit Podman erstellt. Beginnen wir mit der Erstellung einer Docker-Datei mit folgendem Inhalt:

FROM centos:latest RUN yum -y install httpd CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"] EXPOSE 80 

Jetzt erstellen wir das Image mit dem Befehl build :

$ podman build .

Hier ziehen wir zuerst das Basis-Image von CentOS, installieren Apache darüber und führen es dann als Vordergrundprozess aus, wobei Port 80 freigelegt ist. Wir können auf den Apache-Server zugreifen, indem wir dieses Image ausführen und den exponierten Port einem Host-Port zuordnen.

Der Befehl build übergibt rekursiv alle im Kontextverzeichnis verfügbaren Ordner. Das aktuelle Arbeitsverzeichnis wird standardmäßig zum Erstellungskontext, wenn kein Verzeichnis angegeben ist. Daher ist es ratsam, keine Dateien und Ordner im Kontextverzeichnis zu haben, die für die Bilderstellung nicht erforderlich sind.

4.2. Auflistung der verfügbaren Bilder

Der Befehl podman images listet alle verfügbaren Bilder auf. Es werden auch verschiedene Optionen zum Filtern der Bilder unterstützt.

$ podman images

This command lists all the images available in the local repository. It contains the information on which repository the image was pulled from, the tag, its image id, created time and size.

REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/centos latest 0f3e07c0138f 2 months ago 227MB  
    

4.3. Running Images

The run command creates a container of a given image and then runs it. Let's run the CentOS image we have created earlier

$ podman run -p 80:80 -dit centos

This command first checks if there is a local image available for CentOS. If the image isn't present locally, it tries to pull the image from the registries that were configured. If the image isn't present in the registries, it shows an error about unable to find the image.

The above run command specifies to map the exposed 80 port of the container to the port 80 of the host and the dit flag specifies to run the container in detached and interactive mode. The id of the container created will be the output.

4.4. Deleting Images

The rmi command removes the images present in the local repository. Multiple images can be removed by providing their ids as space-separated in the input. Specifying the -a flag removes all the images

$ podman rmi 785188cd988c

4.5. Listing the Containers

All the available containers including the ones which aren't running can be listed using the ps -a command. Similar to the images command, this can also be used with various options.

$ podman ps -a

The output for the above command lists all the containers with the information such as image it was created from, the command used to launch it, it's status, ports it's running on and the name assigned to it.

CONTAINER ID IMAGE COMMAND CREATED AT STATUS PORTS NAMES eed30719cd37 centos /bin/bash 2019-12-09 02:57:37 +0000 UTC Up 14 minutes ago 0.0.0.0:80->80/udp, 0.0.0.0:80->80/tcp reverent_liskov

4.6. Deleting Containers

The rm command removes the containers. This command does not remove the containers in running or paused state. They need to be first stopped and then removed.

$ podman stop eed30719cd37 $ podman rm eed30719cd37

4.7. Creating Pods

The pod create command creates a pod. The create command supports different options.

$ podman pod create

The pod create command creates a pod with an infra container by default associated with it unless explicitly set with infra flag as false.

$ podman pod create --infra = false

Infra container allows Podman to connect various containers in the pod.

4.8. Listing Pods

The pod list command displays all the available pods

$ podman pod list

The output of this command displays the information such as the pod id, its name, number of associated containers, the id of the infra container if available:

POD ID NAME STATUS CREATED # OF CONTAINERS INFRA ID 7e0a68528aed gallant_raman Running 5 seconds ago 1 c6d06673c667

All the available Podman commands and their usage can be found in the official documentation.

5. Conclusion

In this tutorial, we've looked at the basics of Podman and its features, its comparison to Docker and a few of the commands available.

As usual, the code sample used in this article is available over GitHub.