Zugriff auf Docker Network Namespace vom Host-System aus
Die Befehle sind mit Root-Rechten durchzuführen und können bei falscher Handhabung zu Netzwerkproblemen führen!
Vorwort
Erklärungen zum Thena Linux Network Namespaces finden sich im Internet, beispielsweise:
- https://www.man7.org/linux/man-pages/man7/network_namespaces.7.html
- https://www.sobyte.net/post/2021-10/learn-linux-net-namespace/
Docker Netzwerke werden durch Namespaces repräsentiert und ermöglichen damit die Isolation der Container.
Im Gegensatz zu händisch angelegten Namespaces können diese aber nicht per ip netns Befehl aufgelistet, oder betreten werden.
Hierzu muss erst eine Verlinkung erstellt werden, damit man den Weg in den Namespace definiert…
Wofür wird das ganze benötigt?
Zum Debuggen kann es sehr hilfreich sein, wenn man statt den Container zu betreten (docker exec
), den Network Namespace betritt.
Denn im Container selbst ist auch das Dateisystem isoliert.
Durch das Betreten des Network Namespaces stehen alle Tools aus dem Hostsystem zur Verfügung.
Das ist immer dann nützlich, wenn Anwendungen im Container nicht zur Verfügung stehen (z.B. tcpdump, ip, ssh, ss, netstat, …).
Wichtig zu wissen:
Durch den Wechsel des Network Namespaces, sind anderen Namespaces davon unberührt geblieben und z.B. Prozess-IDs bei Tools wie netstat können nicht korrekt angezeigt werden, oder Fehlermeldungen auftreten… Man hat eben nur die Netzwerkumgebung gewechselt …
Zugriff auf Namespace
- Container ID ermitteln (ID steht ganz vorne)
docker ps | grep <NAME>
container_id="xxxxxxxxxxx"
- Process ID des Containers ermitteln
pid=$(docker inspect -f '{{.State.Pid}}' ${container_id})
- Namespace-Verknüpfung anlegen
mkdir -p /var/run/netns/
ln -sfT /proc/$pid/ns/net /var/run/netns/${container_id}
- Verfügbarkeit prüfen
ip netns | grep ${container_id}
- Zugriff auf den Namespace
ip netns exec ${container_id} ip a
Möchte man eine Shell im Namespace starten geht das auch:
ip netns exec ${container_id} bash
Man kann durch beenden des Befehls (Schließen der Shell) wieder in den Host Namespace wechseln, entweder mit “STRG + D” oder dem Befehl exit
!