Conceptos 01 - Inspección y diagnóstico de redes
Cuando la conectividad entre servicios falla, Docker ofrece herramientas que permiten diagnosticar el problema de manera sistemática. Recorra cada sección para ver los comandos y procedimientos.
Concepto 1 de 5
Comandos de inspección de redes
Herramientas para listar redes, inspeccionar su configuración y verificar el estado de los servicios.
Inspección de redes y servicios 4 comandos
Lista todas las redes disponibles en Docker.
docker network lsNETWORK ID NAME DRIVER SCOPEa1b2c3d4e5f6 mi-proyecto_default bridge localf7a8b9c0d1e2 mi-proyecto_backend bridge local
Muestra detalles de una red: contenedores conectados, subnet y gateway.
docker network inspect mi-proyecto_backend"Containers": {"abc123": { "Name": "mi-proyecto-db-1", "IPv4": "172.20.0.2/16" },"def456": { "Name": "mi-proyecto-api-1", "IPv4": "172.20.0.3/16" }}
Lista los servicios del proyecto, sus puertos y estado.
Muestra los logs de un servicio. Útil para identificar errores de conexión.
Concepto 2 de 5
Verificar resolución DNS desde un contenedor
Confirmar que un servicio puede resolver el nombre de otro servicio dentro de la red de Compose.
Tres formas de resolver un nombre 3 comandos
Opción 1: getent (si disponible en la imagen).
docker compose exec web getent hosts db172.20.0.2 db
Opción 2: Python (disponible en muchas imágenes).
docker compose exec web python -c \"import socket; print(socket.gethostbyname('db'))"172.20.0.2
Opción 3: nslookup (requiere bind-tools o dnsutils).
docker compose exec web nslookup dbSi la resolución falla, las causas más probables son las siguientes.
- Los servicios no comparten una red.
- El nombre del servicio está mal escrito.
- El contenedor de destino no se encuentra en ejecución.
Concepto 3 de 5
Verificar si un puerto está abierto desde un contenedor
Confirmar que el servicio de destino acepta conexiones en el puerto esperado.
$ docker compose exec web python -c "import sockets = socket.socket()s.settimeout(3)try: s.connect(('db', 5432)) print('Conexión exitosa')except Exception as e: print(f'Error: {e}')finally: s.close()"Conexión exitosaCambia el estado del servicio db y observa qué capa falla en cada caso: la resolución del nombre o la conexión al puerto.
1Resolución DNS
docker compose exec web getent hosts db 172.20.0.2 db
2Conexión TCP a
db:5432docker compose exec web python -c "…s.connect(('db', 5432))…" Error: [Errno 111] Connection refused
El nombre resuelve, pero nadie acepta conexiones en el puerto 5432 todavía: el motor sigue iniciando o no escucha en ese puerto.
Concepto 4 de 5
Inspeccionar la IP de un contenedor
Obtener la dirección IP asignada a un contenedor dentro de la red de Docker.
$ docker inspect mi-proyecto-db-1 \ --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'172.20.0.2Recrea el contenedor db varias veces y compara las dos cadenas de conexión.
mi-proyecto-db-1IP actual172.18.0.3Recreaciones0docker compose up -d --force-recreate db- Con IP fija
postgresql://user:pass@172.18.0.3:5432/mydbConecta: la IP coincide con la de db. - Con nombre de servicio
postgresql://user:pass@db:5432/mydbConecta: db resuelve a 172.18.0.3.
Las direcciones que aparecen al recrear son ilustrativas. Docker puede asignar otra IP cada vez; lo que no garantiza es que se conserve.
Concepto 5 de 5
Flujo de diagnóstico resumido
Secuencia sistemática para diagnosticar problemas de conectividad entre servicios.
- ¿Están ambos contenedores en ejecución?
docker compose pspara verificar estado. - ¿Comparten la misma red?
docker network inspect <red>para confirmar que ambos están conectados. - ¿El nombre del servicio resuelve correctamente?
docker compose exec <origen> getent hosts <destino> - ¿El puerto del servicio destino está abierto? Prueba de conexión TCP con Python desde el contenedor origen.
- ¿Los logs muestran algún error específico?
docker compose logs <servicio>para revisar errores de conexión o inicialización.
Elige una falla y ejecuta las verificaciones en orden. La primera que no se supera señala la causa.
1¿Están ambos contenedores en ejecución?
docker compose ps2¿Comparten la misma red?
docker network inspect mi-proyecto_backend3¿El nombre del servicio resuelve correctamente?
docker compose exec web getent hosts db4¿El puerto del servicio destino está abierto?
docker compose exec web python -c "…s.connect(('db', 5432))…"5¿Los logs muestran algún error específico?
docker compose logs web
Pulsa el botón para ejecutar la primera verificación.
Autoevaluación
Comprueba lo que aprendiste
Cuatro preguntas rápidas para verificar las ideas clave de la lectura. Cada respuesta incluye una explicación.
0/4 respuestas correctas