Zum Inhalt springen

Podman

aus www.kruedewagen.de, Homepage von Ralf und Judith Krüdewagen (Kruedewagen)

Diese Seite befasst sich mit Podman, einer Alternative zur Docker-Umgebung, um (Docker-)Images und Container zu managen und Container laufen zu lassen. Dabei kommt Podman ohne Daemon aus und benötigt daher keine Root-Rechte. Außerdem kann Podman mit Pods (bekannt aus Kubernetes) umgehen.

Es geht hier vor allem um Änderungen und Besonderheiten von Podman, wenn man damit Docker ersetzen möchte.

Artikel

apiVersion: v1
kind: Pod
metadata:
  name: guestbook
spec:
  containers:
  - name: backend
    image: "docker.io/redis:6"
    ports:
    - containerPort: 6379
  - name: frontend
    image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend:v5
    privileged: true
    ports:
    - containerPort: 80
      hostPort: 8080
  env:
  - name: GET_HOSTS_FROM
    value: "env"
  - name: REDIS_SLAVE_SERVICE_HOST
    value: "guestbook-backend"

Management von Images und Containern

Podman ist fast vollständig befehls-kompatibel zu Docker. Man kann also genau wie bei Docker einen Container starten. Der "docker" Befehl wird nur gegen "podman" ausgetauscht.

Beispiel für GitLab

podman run --detach \
    --hostname gitlab.kruedewagen.de \
    --publish 9443:9443 --publish 9080:9080 --publish 9022:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

Rootless

Container bei Systemstart automatisch starten

Das automatische Starten eines Containers muss wie ein normaler Service in das Linux-System eingebaut werden, da kein eigener Daemon zur Verfügung steht.

Bei systemd geht einfach mit einer eingebauten Generator (Beispiel GitLab):

podman generate systemd gitlab > /etc/systemd/system/gitlab.service
systemctl daemon-reload
systemctl enable gitlab
systemctl start gitlab
Warnung Die systemd Service-Datei enthält Referenzen zur Container-ID. Daher muss die systemd Service-Datei nach jedem Wechsel der Container-ID neu erstellt werden (also nach Löschen und Neuerstellung des Containers, z.B. nach Update des Images).

Weblinks:

Container updaten

Quadlets

Podman API

Wenn Container auf die Podman API zugreifen müssen (z.B. über ein Socket), muss der Podman API Service laufen.

Ein Podman-Socket kann dann rückwärts-kompatibel zu Docker so in den Container hinein gereicht werden:

podman run -d --name gitlab-runner --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /run/podman/podman.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

Weblinks:

Socket Status:

systemctl status podman.socket

Login Shell

IPv6

  • Voraussetzung:
    • Podman-Host hinter Fritzbox
    • Fritzbox bekommt öffentliches /56 Prefix
  • Aktivieren im Netzwerk
podman network create --ipv6 mynet
podman network create --subnet 2003:00f4:b72a:9401::/64 --ipv6 mynet
podman network ls
podman inspect mynet
  • Mit IPv6 Adresszuweisungen spielen (ohne Erfolg beim Routing)
podman network create --subnet 2003:f4:b733:8e02::/64 --gateway 2003:f4:b733:8e02::1 --ipv6 mynet
podman network create --ipv6 mynet
podman network create --ipv6 --ipam-driver=dhcp mynet
  • Offen
    • Damit noch kein Routing aktiviert.
    • Welches IPv6 Subnet nehmen?
  • Erkenntnisse
    • Man muss eine neue Bridge anlegen und per DHCPv6 ein Prefix anfordern. Daraus dann über ein neues Podman Netzwerk IP-Adessen an die Container verteilen. Ggf. radvd nötig. Nachteil: Mit "wicked" viele Feinheiten und Fehler ... und auch nicht hinbekommen.
    • Beste Lösung: systemd-networkd nutzen mit nativem Support für "IPv6-Prefix-Delegation" plus Podman Bridge. Nachteil: Nicht in SUSE Tumbleweed als Netzwerk-Standard auswählbar, ggf. sogar Inkonistenzen mit YAST bzw. initramfs Erstellung. Also aktuell auch nicht besonders zu empfehlen (Stand 08/2026).
  • Lösungen
    • Vorher:
systemctl enable --now netavark-dhcp-proxy.socket
    • macvlan Treiber von Podman verwenden -> virt. MAC Adresse + IP Adresse aus dem LAN vom Podman-Host
podman network create   --driver macvlan   --opt parent=enp226s0   --ipv6   macvlan-ipv6
podman run --rm -it --network ipvlan-monitoring --sysctl net.ipv6.conf.eth0.accept_ra=2 --sysctl net.ipv6.conf.eth0.autoconf=1 --ip 192.168.1.221 jonlabelle/network-tools
    • ipvlan Treiber
podman network create   --driver ipvlan   --opt parent=enp226s0   --opt mode=l2   --subnet 192.168.1.0/24   --gateway 192.168.1.1   --ip-range 192.168.1.220/29   --ipv6 ipvlan-monitoring
podman run --rm -it --network ipvlan-monitoring --sysctl net.ipv6.conf.eth0.accept_ra=2 --sysctl net.ipv6.conf.eth0.autoconf=1 --ip 192.168.1.221 jonlabelle/network-tools
    • ABER: Bei beiden kein IPv4 Ping auf LAN-Geräte (außer Default GW) möglich.
    • DAHER: Für Monitoring das Host Netzwerk nehmen
podman run --rm -it --network host jonlabelle/network-tools

Tools

Monitoring

Remote Monitoring von Podman Containern:

-v /run/podman/podman.sock:/run/podman/podman.sock

Siehe auch