Docker: enige manier om open sockets in een draaiende docker-container te vermelden?

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 nsentergebruiken 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 netstatuit 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 netstatgeï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"

(nsentermaakt deel uit van het util-linuxpakket)


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 iproute2hebt 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 TCPen 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

Other episodes