44 Container-Netzwerkmodelle

Container-Netzwerke sind isolierte Kommunikationsdomänen, in denen Prozesse sicher, deterministisch und reproduzierbar miteinander interagieren. Podman implementiert Container-Netzwerke vollständig ohne Daemon, unabhängig vom Host-Netzwerksystem und ohne privilegierte Hintergrunddienste. Dadurch entstehen Netzwerkmodelle, die sich strukturell von Docker unterscheiden und näher an Kubernetes-artigen Mechanismen liegen. Die Wahl des Netzwerkmodells beeinflusst Latenz, Erreichbarkeit, Isolation, Routing und damit die gesamte Architektur eines containerisierten Systems.

44.1 Grundprinzip: Netzwerknamespaces als Basiseinheit

Jeder Container läuft in einem eigenen Netzwerknamespace. Das ist kein Podman-spezifischer Mechanismus, sondern ein Linux-Feature. Jeder Namespace besitzt:

Alle Netzwerkmodelle bauen auf diesem Grundprinzip auf, indem sie festlegen, wie dieser Namespace an andere Namespaces oder den Host gebunden wird.

Dies erklärt auch, warum Container-Netzwerklogik grundsätzlich isoliert ist – ein Container „sieht“ das Host-Netzwerk nicht, solange man es nicht explizit verbindet.

44.2 Netavark und Aardvark: Podmans Netzwerkstack

Podman hat sich von der CNI-Welt gelöst und mit Netavark + Aardvark einen Netzwerkstack geschaffen, der rootless funktioniert, deterministisch ist und die DNS-Logik bewusst aus dem Kernel in den Userspace verlagert.

Dadurch entfällt die Komplexität großer Plugin-Systeme. Podman steuert Netzwerke konsistent, schnell und reproduzierbar – ohne Daemon, ohne iptables-Hacks und ohne unkontrolliertes Plugin-Verhalten.

44.3 Bridge-Netzwerk: das Standardmodell

Das klassische Container-Netzwerk ist ein Bridge-Netzwerk – ein virtuelles Layer-2-Segment, das mehrere Container miteinander verbindet und optional NAT zum Host bereitstellt.

Eigenschaften des Bridge-Netzes:

Für die meisten Entwicklungs- und Integrationsumgebungen ist das Bridge-Modell ideal: klar isoliert, einfach konfigurierbar, vorhersehbar.

44.4 Slirp-Netzwerk: Rootless-Modus und Userspace-NAT

Wenn Podman rootless läuft, kann kein Kernel-NAT oder Bridge-Interface erzeugt werden. Stattdessen wird ein Userspace-NAT genutzt: slirp4netns.

slirp4netns ist nicht so performant wie NAT im Kernel, aber es ermöglicht ein komplettes Netzwerkmodell ohne Rootrechte:

Für Laptops, Dev-Workspaces oder CI ohne Privilegien ist slirp unverzichtbar und erstaunlich robust.

44.5 Host-Netzwerk: maximal performant, minimal isoliert

Das Host-Netzwerkmodell entfernt den Netzwerknamespace vollständig. Der Container wird direkt im Host-Namespace ausgeführt:

Dieses Modell ist riskant, aber performant. Es eignet sich für:

Im Rootless-Modus ist host networking nur begrenzt möglich, da Podman ohne Root keinen Zugriff auf den Host-Netzwerknamespace erhält.

44.6 MACVLAN: Container als „vollwertige“ Teilnehmer im LAN

MACVLAN erlaubt es Containern, eigene MAC-Adressen zu erhalten und sich wie physische Geräte im Netzwerk zu verhalten. Das Modell:

Eigenschaften:

Einsatzgebiet: appliance-artige Container, die im LAN real existieren sollen (z. B. Monitoring-Agenten, DHCP-Server, Reverse-Proxies).

MACVLAN erfordert Rootrechte und ist daher kein Rootless-Konzept.

44.7 None-Netzwerk: vollständige Isolation

Ein Container kann vollständig netzlos betrieben werden:

podman run --network none

Der Container hat dann keinerlei Netzwerkgeräte außer lo. Das ist für sicherheitssensitive Prozesse oder Sandboxing-Szenarien ideal.

Anwendungsfälle:

Dieses Modell parodiert gewissermaßen die Idee des „Offline-Rechners“.

44.8 Benutzerdefinierte Netzwerke: Modularität und Dienstentkopplung

Benutzerdefinierte Netzwerke erlauben die Kindereigenschaft aus Kubernetes: Gruppierung.

Beispiel:

Dieses Modell erzwingt Architekturdisziplin.

44.9 DNS-Isolation pro Netzwerk

Aardvark trennt DNS pro Netzwerksegment. Das bedeutet:

Das Modell ist Kubernetes-ähnlich und lässt sich hervorragend für Microservice-Architekturen nutzen.

44.10 Netzwerk-Troubleshooting: systematisch statt zufällig

Netzwerkfehler gehören zu den kompliziertesten Problemen in Container-Umgebungen, aber sie lassen sich systematisch strukturieren:

  1. Namespace prüfen

    podman inspect <container> | jq .NetworkSettings
  2. DNS testen

    podman exec <container> getent hosts service
  3. Routing prüfen

    podman exec <container> ip route
  4. NAT testen

    podman exec <container> curl -v http://example.com
  5. Netzwerk-Backend prüfen

    podman info | grep network

Viele vermeintliche Containerfehler sind tatsächlich Host-DNS- oder Routingfehler.

44.11 Rootless-spezifische Einschränkungen und Workarounds

Workarounds:

Rootless ist sicher, aber nicht grenzenlos.