Ik wil netstat uitvoeren in een draaiende docker-container om open TCP-sockets en hun statussen te zien. Maar op sommige van mijn docker-containers is netstat niet beschikbaar. Is er een manier om open sockets te krijgen (en hun statussen, en met welke IP-adressen ze zijn verbonden, indien aanwezig) zonder netstat te gebruiken, via een docker-API? (BTW, mijn container gebruikt docker-proxy – dat wil zeggen, niet direct overbrugd)
Ik denk dat ik rechtstreeks naar het /proc-bestandssysteem zou kunnen kijken, maar op dat moment kan ik net zo goed cp netstat in de container plaatsen en het uitvoeren. Ik vroeg me af of er een faciliteit was die havenarbeider hiervoor zou kunnen bieden.
Antwoord 1, autoriteit 100%
U kunt de opdracht nsenter
gebruiken om een opdracht op uw host uit te voeren binnen de netwerknaamruimte van de Docker-container. Haal gewoon de PID van uw Docker-container op:
docker inspect -f '{{.State.Pid}}' container_name_or_id
Bijvoorbeeld op mijn systeem:
$ docker inspect -f '{{.State.Pid}}' c70b53d98466
15652
En als je eenmaal de PID hebt, gebruik die dan als argument voor de doeloptie (-t
) van nsenter
. Om bijvoorbeeld netstat
uit te voeren binnen de naamruimte van het containernetwerk:
$ sudo nsenter -t 15652 -n netstat
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
Merk op dat dit werkte, ook al heeft de container geen netstat
geïnstalleerd:
$ docker exec -it c70b53d98466 netstat
rpc error: code = 13 desc = invalid header field value "oci runtime error: exec failed: container_linux.go:247: starting container process caused \"exec: \\\"netstat\\\": executable file not found in $PATH\"\n"
(nsenter
maakt deel uit van het util-linux
pakket)
Antwoord 2, autoriteit 24%
De twee commando’s van @larsks antwoord samengevoegd tot one-liner – het is niet nodig om de PID(‘s) te kopiëren en plakken (vervang gewoon container_name_or_id
):
sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n netstat
Antwoord 3
Als je het pakket iproute2
hebt geïnstalleerd, kun je
sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n ss
of
sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n ss -ltu
Het toont TCP
en UDP
Antwoord 4
Als je ze allemaal wilt (alle containers), probeer dit dan.
$ for i in `docker ps -q` ; do sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' $i) -n netstat ; done
Antwoord 5
Ik heb de andere oplossingen geprobeerd en het werkte niet voor mij door mijn collega gaf me deze oplossing. Ik dacht dat ik het hier zou vermelden voor anderen zoals ik en voor mij om later naar te verwijzen lol.
docker exec -it [containernaam] bash
grep -v “rem_address” /proc/net/tcp
Antwoord 6
server:docker-container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80acfa804b59 admirito/gsad:10 "docker-entrypoint.s…" 18 minutes ago Up 10 minutes 80/tcp gvmcontainers_gsad_1