Anzeigen und Verwalten von Netzwerkverbindungen, die von einem Docker-Container hergestellt werden.
Bei der Arbeit mit einem Docker-Container müssen wir uns oft die Netzwerkverbindungen ansehen, die der Container für die anfängliche Fehlersuche oder -behebung verwendet. Vielleicht möchten Sie sehen, welche IP-Adresse einen Port abhört oder wie viele Verbindungen derzeit im Container aktiv sind.
Da es sich bei Docker um eine isolierte Umgebung handelt, erhalten Sie mit netstat auf einem Server keine Informationen über die Netzwerkverbindungen des Containers. Stattdessen müssen Sie sich entweder in den Container begeben, um netstat auszuführen, oder es aus der Ferne starten.
Schauen wir uns beide Möglichkeiten an…
# 1. In den Docker-Container eindringen, um netstat auszuführen
Als ersten Schritt suchen Sie die Container-ID des Containers, den Sie untersuchen möchten.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ce7cfb9be37 nginx "/docker-entrypoint...." vor 2 Minuten Up 2 Minuten 0.0.0.0:80->80/tcp web-server
4ab8551671d7 nginx "/docker-entrypoint...." vor 6 Minuten Up 6 Minuten 80/tcp vigilant_ganguly
$
Hier ist der Container mit der ID 0ce7cfb9be37
derjenige, dem ich auf den Grund gehen möchte. Um eine Shell-Sitzung (Bash) dieses Containers zu erhalten, verwenden Sie:
$ docker exec -it 0ce7cfb9be37 bash
Dies sollte Sie zu einer Bash-Eingabeaufforderung innerhalb des Containers führen.
root@0ce7cfb9be37:/#
Sie können das Paket netstat
installieren, um nach bestehenden Netzwerkverbindungen zu suchen. Standardmäßig sind diese Dienstprogramme innerhalb des Containers möglicherweise nicht verfügbar.
Um sie zu installieren, verwenden Sie daher:
apt update apt install net-tools
Jetzt können wir den Befehl netstat wie gewohnt verwenden.
# netstat -an
Ausgabe:
Aktive Internetverbindungen (Server und bestehende) Proto Recv-Q Send-Q Lokale Adresse Fremde Adresse Zustand tcp 0 0.0.0.0:80 0.0.0.0:* LISTEN tcp 0 0 172.17.0.3:80 223.233.99.46:64429 FIN_WAIT2 tcp 0 0 172.17.0.3:80 223.233.99.46:4811 ESTABLISHED tcp 0 0 172.17.0.3:80 223.233.99.46:64430 FIN_WAIT2 tcp 0 0 172.17.0.3:80 223.233.99.46:4810 ESTABLISHED tcp6 0 0 :::80 :::* LISTEN Aktive UNIX-Domain-Sockets (Server und eingerichtet) Proto RefCnt Flags Type State I-Node Path unix 3 [ ] STREAM CONNECTED 35748 unix 3 [ ] STREAM CONNECTED 35749
Wie Sie aus der obigen Ausgabe ersehen können, werden bestehende Verbindungen mit ihren Quell- und Zieladressen aufgelistet. Um Prozesse zu sehen, die auf Ports lauschen, können Sie Folgendes verwenden:
# netstat -tulnp
Ausgabe:
Aktive Internetverbindungen (nur Server)
Proto Recv-Q Send-Q Lokale Adresse Fremde Adresse Status PID/Programmname
tcp 0 0.0.0.0:80 0.0.0.0:* LISTEN 1/nginx: master pro
tcp6 0 0 :::80 :::* LISTEN 1/nginx: master pro
# 2. Führen Sie netstat aus, ohne in den Container zu gehen
Als Erstes müssen wir die Container-ID mit dem Befehl docker ps
ermitteln.
[root@relicflare-shared-services ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5db9a01d4a8 postgres:13.1-alpine "docker-entrypoint.s..." vor 9 Tagen Up 9 Tage 0.0.0.0:5432->5432/tcp relicflare_server_postgres
[root@relicflare-shared-services ~]#
Führen Sie dann den folgenden Docker-Befehl aus, um alle eingerichteten Verbindungen für den Container zu ermitteln.
docker exec e5db9a01d4a8 netstat |grep ESTABLISHED
Das Ergebnis sieht dann wie folgt aus.
[root@relicflare-shared-services ~]# docker exec e5db9a01d4a8 netstat | grep ESTABLISHED
tcp 0 0 e5db9a01d4a8:postgresql 161.35.XXX.XXX:49128 ESTABLISHED
udp 0 0 localhost:48818 localhost:48818 ESTABLISHED
[root@relicflare-shared-services ~]#
Die Idee ist also, den Befehl netstat zusammen mit dem Befehl docker exec
auszuführen.
Schlussfolgerung
Da Sie nun die erforderlichen Verbindungsdetails haben, können Sie mit der Fehlersuche fortfahren, indem Sie sich die Docker- und Prozessprotokolle genauer ansehen.