= Podman - Container =

Nachdem ich bereits längere Erfahrung mit Virtualisierung von ganzen Maschinen habe (zur Zeit benutze ich hauptsächlich [KVM] aber auch noch ein paar VirtualBox Instanzen), wollte ich doch mal sehen, was denn nun wirklcih hiner all diesem Gerede von Containers steckt. Im Grunde könnte das ja eine Möglcihkeit sein, meinen Virtualisierungs-Server noch effektiver auszulasten als mit den relativ schwergewichtigen KVM-Instanzen. Also habe ich mich mal eingelesen.

Die erste Wahl scheint wohl zu sein, ob man Docker oder [podman|https://podman.io/] benutzt. Da alle Vergleiche betonen, das podman ja so viel hipper sei, weil es keinen zentralen Daemon benutzt, habe ich mich entschieden, meine ersten Container-Experimente hiermit zu machen. Irgendwie auch aus Abenteuerlust, denn sowas verspricht natürlich, das weder Installation, noch Tools und Dokumentation wirklich ausgereift sind. Kicher!

== Installation ==

Um es nicht allzu kompliziert zu machen, habe ich mich entschlossen, es mit Debian-Paketen zu versuchen. Da gerade Debian 10 Buster aktuell ist, geht das aber natürlich nicht. Also fing ich damit an, auf Debian 11 Bullseye/Testing zu upgraden. Danach war der erste Schritt dann trivial:

  aptitude install podman

Ich wollte von vorneherein meine Container wenn möglich als Benutzer (und nicht als root) starten, das heisst bei podman "rootless". Damit das auf einem normalen Debian-System funktioniert, muss man wohl folgendes erlauben:

  sysctl -w kernel.unprivileged_userns_clone=1


== Images auswählen und herunterladen ==

In den allermeisten Fällen hat es Sinn, als Ausgangspunkt eines eigenen Images ein vorbereitetes Docker-Image von einem zentralen Repository zu nehmen. Oftmals will man natürlich auch bereits ein fertiges Image einer Applikation dort herunterladen. Eine Liste solcher Images gibt es in "/etc/containers/registries.conf.d/shortnames.conf". Um da mit der search-Funktion einfach arbeiten zu können, habe ich in der Datei /etc/containers/registries.conf noch diese Zeilen hinzugefügt. Ich habe hier das Repository "docker.io" benutzt, das mir recht gross und vielversprechend erscheint. Man kann dort natürlich auch andere stattdessen oder zusätzlich angeben.

  # -TB-
  [registries.search]
  registries = ['docker.io']

Danach funktioniert dann auch ein Befehl wie dieser, um z.B. das aktuelle Debian-Image zu finden. Es ergeben sich Zeilen aus der Suche, aus denen man dann (mit pull) ein entsprechendes Image heraussuchen und herunterladen kann.

  podman search debian --filter=is-official
  podman pull docker.io/library/debian

Wer mehr zu einem Image erfahren möchte, findet auch jeweils eine Webseite dazu auf dem Docker Server, also z.B. https://index.docker.io/_/debian. Dort ist auch erklärt, welches Image-Tag das "latest" ist, das man mit obigem Befehl heruntergeladen hat (bei Debian immer die aktuelle stable-Distribution). Ähnlich wie bei einem Versionskontrollsystem kann man auch andere Tags angeben, indem man anstatt "debian" einfach "debian:testing" angibt, um eine Testing-Distribution herunterzuladen.

Macht man das alles als normaler Benutzer (was empfohlen wird) und man fragt sich, wo da wohl sein Speicher verbraucht wird, so befinden sich die Images übrigens unter ~/.local/share/containers/.

Mit dem Befehl

  podman images
  
sieht man, welche Images man bereits heruntergeladen hat. Diese sind dann lokal verfügbar und können benutzt werden, um eine oder mehrere Container-Instanzen zu starten.


== Container starten ==

  podman run -dt debian

startet eine Instanz des Debian-Images. Dabei sorgt "-d" dafür, das der Container in den Hintergrund gelegt wird und der Befehl sofort zurückkehrt. Außerdem wird eine ID ausgegeben (eine lange hexadezimale Zeichenkette). Damit (bzw. zur Abkürzung mit dem Anfang derselben) kann man später den laufenden Container adressieren. Die Option "-t" sorgt dafür, das es ein Pseudo-TTY gibt, das mit der Standardausgabe des Containers verbunden ist. Damit kann man dann z.B. innerhalb des Containers Befehle ausführen.

  podman ps
  
zeigt eine Liste der laufenden Container.

Mit dem exec-Kommando kann man nun innerhalb des Containers Befehle ausführen. Die Option -i führt ggf. zu einer interaktiven Eingabe.

  podman exec ip link
  podman exec -i bash

Damit kann man jetzt schon einiges machen.


== Eigene Images erstellen ==

Wer ein eigenes Docker-Image erstellen möchte, kann das nur als root-User machen. Es gibt dazu zwei Wege. Zum einen kann ein vorhandener Container mit einem commit-Befehl wie

  podman commit -l meinwebserver:latest

als Image gespeichert werden. Zum anderen kann man auch ein sogenanntes Containerfile (oder auch Dockerfile, das ist das gleiche, hat nur einen anderen Namen) benutzen, in dem Befehle stehen, die benutzt werden, um ein Image aus einem anderen zu erstellen.

Der erste Weg ist sicher in der Entwicklung einfacher und schneller, der zweite dürfte jedoch besser dokumentierbar und nachvollziehbar sein. Auch im Falle eines Updates von Komponenten könnte ein Containerfile nahtlos oder mit kleineren Änderungen auch mit der neuen Version funktionieren, während das Image aus einem lebenden Container auch am lebenden Objekt wieder geupdated und ggf. angepasst werden muss.

Viele Anwendungsfälle für Container erzeugen einen Server. [Hier|https://docs.docker.com/config/containers/multi-service_container/] und auch [hier|https://stackoverflow.com/questions/25135897/how-to-automatically-start-a-service-when-running-a-docker-container] habe ich ein paar Hinweise gefunden, wie man diesen Service am besten startet.

Links:
* Sehr gut erklärt sind beide Wege hier: https://rancher.com/learning-paths/how-to-build-and-run-your-own-container-images/
* Hier ist gut erklärt, wie man so ein Image in ein eigenes Repository oder eine Datei speichert. https://docs.fedoraproject.org/en-US/iot/build-docker/

= Fazit =

podman ist eine ausgereifte Umgebung, um mit Containers zu arbeiten. Soweit ich das verstanden jhabe, steht es dem ausgereiften Docker in nichts nach. Unter der Haube werden viele Teile wohl sowieso identisch sein, denn letztlich beruht die ganze Technologie auf einer Vielzahl von Linux-Entwicklungen der letzten Jahre und Jahrzehnte.

Ich werde in Zukunft versuchen, anstatt für jede Kleinigkeit eine neue virtuelle Maschine zu erzeugen, besser Container zu nutzen. Ich denke, das die Ressourcenaufteilung so flexibler ist und mein guter Server damit besser ausgenutzt werden kann.


=== von mir benutzte Links ===

* https://www.ionos.de/digitalguide/server/tools/podman-tutorial/
* https://podman.io/getting-started/

= Anwendungsbeispiele =

Neben den Tags (unten auf der Seite) habe ich hier noch ein paar Seiten hier im Wiki verlinkt:

* [iDempiere im Container]

[{Tag ServerDienste Cloud Container}]