Visualice y gestione las conexiones de red establecidas por un contenedor Docker.

A menudo, mientras trabajamos con un contenedor Docker, necesitamos echar un vistazo a las conexiones de red que está utilizando el contenedor con fines de depuración inicial o de resolución de problemas. Es posible que desee ver qué IP está escuchando en un puerto o cuántas conexiones están activas actualmente en el contenedor.

Dado que un Docker es un entorno aislado, ejecutar netstat en un servidor no le dará las conexiones de red del contenedor. En su lugar, tiene que entrar en un contenedor para ejecutar el netstat o ejecutarlo de forma remota.

Veamos ambas opciones…

# 1. Entrar dentro de un contenedor Docker para ejecutar netstat

Como primer paso, encuentre el ID de contenedor del contenedor que desea solucionar.

$ docker ps
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES
0ce7cfb9be37 nginx "/docker-entrypoint...." hace 2 minutos Arriba 2 minutos 0.0.0.0:80->80/tcp web-server
4ab8551671d7 nginx "/docker-entrypoint...." hace 6 minutos Arriba 6 minutos 80/tcp vigilant_ganguly
$

Aquí el que quiero solucionar es el contenedor con ID 0ce7cfb9be37. Ahora para obtener una sesión shell (bash) de este contenedor, utilice:

$ docker exec -it 0ce7cfb9be37 bash

Esto debería llevarlo a un prompt bash dentro del contenedor.

root@0ce7cfb9be37:/#

Puede instalar el paquete netstat para buscar conexiones de red establecidas. Por defecto, estas utilidades pueden no estar disponibles dentro del contenedor.

Así que para instalarlo, utilice

apt update
apt install net-tools
Ahora, podemos utilizar el comando

netstat como de costumbre.

# netstat -an

Salida:

Conexiones a Internet activas (servidores y establecidas)
Proto Recv-Q Send-Q Dirección local Dirección extranjera Estado
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
Sockets de dominio UNIX activos (servidores y establecidos)
Proto RefCnt Flags Tipo Estado I-Node Path
unix 3 [ ] STREAM CONECTADO 35748
unix 3 [ ] STREAM CONECTADO 35749
Como puede ver en la salida anterior, se enumeran las conexiones establecidas con sus direcciones de origen y destino. Para ver los procesos que escuchan en los puertos, puede utilizar:
# netstat -tulnp

Salida:

Conexiones activas a Internet (sólo servidores)
Proto Recv-Q Send-Q Dirección local Dirección extranjera Estado PID/Nombre de programa
tcp 0 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. Ejecute netstat sin entrar en el contenedor

Lo primero es obtener el ID del contenedor con el comando docker ps.

[root@relicflare-servicios-compartidos ~]# docker ps
CONTENEDOR ID IMAGEN COMANDO CREADO ESTADO PUERTOS NOMBRES
e5db9a01d4a8 postgres:13.1-alpine "docker-entrypoint.s..." 9 días atrás Arriba 9 días 0.0.0.0:5432->5432/tcp relicflare_server_postgres
[root@relicflare-servicios-compartidos ~]#

Y, a continuación, ejecute el comando docker como se indica a continuación para averiguar todas las conexiones establecidas para el contenedor.

docker exec e5db9a01d4a8 netstat |grep ESTABLISHED 

Esto daría como resultado algo como lo siguiente

[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-servicios-compartidos ~]# 

Así que la idea es ejecutar el comando netstat junto con el comando docker exec.

Conclusión

Ahora que dispone de los detalles de conexión necesarios, puede continuar con la resolución de problemas mirando más a fondo los registros de docker y de procesos.