web-dev-qa-db-fra.com

Docker: un moyen de lister les sockets ouverts dans un conteneur docker actif?

Je voudrais exécuter netstat dans un conteneur de menu fixe en cours d'exécution pour voir les sockets open TCP et leurs statuts. Toutefois, sur certains de mes conteneurs de menu fixe, netstat n'est pas disponible. Est-il possible de s'ouvrir sockets (et leurs statuts et les adresses IP auxquelles ils sont connectés, le cas échéant) sans utiliser netstat, via une API de menu fixe (BTW, mon conteneur utilise docker-proxy - c’est-à-dire, pas directement ponté)

Je suppose que je pourrais regarder le système de fichiers/proc directement, mais à ce moment-là, je pourrais aussi bien docker cp netstat dans le conteneur et l'exécuter. Je me demandais si docker pouvait prévoir cela.

35
AdvilUser

Vous pouvez utiliser la commande nsenter pour exécuter une commande sur votre hôte à l'intérieur de l'espace de noms réseau du conteneur Docker. Obtenez simplement le PID de votre conteneur Docker:

docker inspect -f '{{.State.Pid}}' container_name_or_id

Par exemple, sur mon système:

$ docker inspect -f '{{.State.Pid}}' c70b53d98466
15652

Et une fois que vous avez le PID, utilisez-le comme argument de la cible (-t) option de nsenter. Par exemple, pour exécuter netstat à l'intérieur de l'espace de noms réseau du conteneur:

$ 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     

Notez que cela a fonctionné même si le conteneur n'a pas installé netstat:

$ 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 fait partie de la util-linux paquet)

82
larsks

Les deux commandes de @larsks répondent à une seule ligne - inutile de copier-coller le ou les PID (il suffit de remplacer container_name_or_id):

Sudo nsenter -t $(docker inspect -f '{{.State.Pid}}' container_name_or_id) -n netstat

8
mikatuo

serveur: conteneur docker 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
0
Anony