8.1 Pasos principales para diagnosticar problemas de red
Los problemas de red en Docker pueden aparecer por varias razones, incluyendo una configuración incorrecta de redes, problemas con el DNS, conflictos de direcciones IP y otros más. En esta lección vamos a revisar los métodos principales para diagnosticar y resolver problemas de red en Docker.
Si tienes problemas de red, deberías seguir estos pasos:
- Verifica el estado de los contenedores y las redes
- Usa herramientas de red dentro de los contenedores
- Revisa la configuración de Docker y los archivos de red
- Consulta los registros del sistema de Docker
- Utiliza comandos de red de Docker
8.2 Verificación del estado de contenedores y redes
El primer paso para diagnosticar problemas de red es verificar el estado de los contenedores y redes.
Verificación del estado de los contenedores
Primero, vamos a listar todos los contenedores en ejecución. Para esto usamos el comando docker ps
:
docker ps
Si los contenedores no están en ejecución, esto podría indicar problemas con Docker mismo o con la configuración de los contenedores.
Verificación de las redes
El comando docker network ls
lista todas las redes creadas en Docker:
docker network ls
Asegúrate de que la red necesaria existe y que los contenedores están conectados a ella.
8.3 Uso de utilidades de red dentro de contenedores
Las utilidades de red, como ping
, curl
, netcat
(o nc
), y nslookup
, pueden ayudarte a diagnosticar problemas dentro de contenedores. Cada una de estas utilidades realiza una tarea específica:
ping
— utilidad para verificar la accesibilidad de hosts remotos en la red enviándoles solicitudes ICMP.curl
— herramienta para transferir datos a través de varios protocolos, a menudo utilizada para verificar la accesibilidad de servicios web.netcat (nc)
— herramienta universal para trabajar con conexiones de red, permite crear conexiones TCP/UDP y diagnosticar la disponibilidad de puertos.nslookup
— utilidad para buscar información sobre registros DNS, por ejemplo, para verificar la resolución de nombres de contenedores.
Ejemplo de uso de ping
Conéctate al contenedor y verifica la conexión con otro contenedor o servicio usando la utilidad ping
para enviar solicitudes ICMP:
docker exec -it <container_name> ping <target_container_name_or_ip>
Ejemplo de uso de curl
Verifica la accesibilidad de un servicio web dentro del contenedor con la utilidad curl
:
docker exec -it <container_name> curl http://<target_service>
Ejemplo de uso de nslookup
Usa nslookup
para verificar la resolución de nombres DNS de contenedores, lo que es útil para diagnosticar problemas con servicios de red:
docker exec -it <container_name> nslookup <target_container_name>
Ejemplo de uso de nc host port
La utilidad nc
se utiliza para depurar y diagnosticar conexiones de red. Con el comando nc host port
puedes establecer una conexión con un host y puerto específicos, verificando la disponibilidad del puerto en el host de destino:
docker exec -it <container_name> nc -zv 192.168.1.1 22
8.4 Verificación de la configuración de Docker y archivos de red
Configuraciones incorrectas de Docker y archivos de red pueden causar problemas de red.
Verificación del archivo docker-compose.yml
Asegúrate de que el archivo docker-compose.yml
esté configurado correctamente, y que todas las redes, servicios y puertos estén indicados de manera adecuada.
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- webnet
db:
image: postgres:latest
ports:
- "5432:5432"
networks:
- webnet
networks:
webnet:
driver: bridge
Verificación del archivo /etc/docker/daemon.json
Revisa la configuración de Docker Daemon
si esta ha sido modificada:
{
"dns": ["8.8.8.8", "8.8.4.4"],
"fixed-cidr": "192.168.1.0/24"
}
8.5 Revisión de los registros del sistema Docker
Los registros del sistema Docker pueden contener información útil sobre errores y problemas de red.
Revisando los registros de Docker
Usa el comando journalctl
para revisar los registros de Docker en sistemas con systemd
:
journalctl -u docker.service
Revisando los logs de los contenedores
Los logs de los contenedores también pueden ayudar a diagnosticar problemas de red:
docker logs <container_name>
8.6: Uso de comandos de red en Docker
Docker ofrece comandos para diagnosticar y gestionar redes, como docker network inspect
y docker network connect
.
Comando docker network inspect
Este comando permite obtener información detallada sobre la red, incluyendo los contenedores conectados y ajustes de IPAM.
docker network inspect <network_name>
Ejemplo del output del comando docker network inspect
[
{
"Name": "webnet",
"Id": "e5e5e1b1a3e5",
"Created": "2021-01-01T00:00:00.000000000Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Containers": {
"container_id": {
"Name": "web",
"EndpointID": "6c52f8c75c1e",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
Comando docker network connect
Si un contenedor no está conectado correctamente a la red, puedes conectarlo manualmente:
docker network connect <network_name> <container_name>
8.7 Ejemplos de diagnóstico y solución de problemas
Ejemplo 1: Problemas con la conversión de nombres de dominio DNS
a IP
Si los contenedores no pueden convertir los nombres hosts de otros contenedores, revisa la configuración del DNS
:
Revisar la configuración del DNS
en docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:latest
dns:
- 8.8.8.8
Revisar DNS
dentro del contenedor:
docker exec -it <container_name> cat /etc/resolv.conf
Ejemplo 2: Problemas con el acceso a servicios
Si los contenedores no pueden acceder a los servicios en otros hosts:
Revisar los puertos publicados:
docker ps
Revisar las reglas del firewall:
Asegúrate de que las reglas del firewall no bloquean los puertos necesarios.
Ejemplo 3: Conflicto de direcciones IP
Si tienes un conflicto de direcciones IP entre los contenedores o con el host:
Revisar la subred de la red:
docker network inspect <network_name>
Cambiar la subred:
docker network create --subnet=192.168.2.0/24 my_network
GO TO FULL VERSION