Al trabajar con Docker, es común encontrarse con diversos desafíos, especialmente cuando se trata de la descarga de imágenes. Uno de los errores más frustrantes es el que indica fallos de conexión, como error pulling image configuration: download failed after attempts=6: dial tcp 108.160.170.26:443: connect: connection refused. Curiosamente, en estos escenarios, comandos como docker search hello-world pueden funcionar sin problemas, lo que complica el diagnóstico.
Análisis Inicial y Diagnóstico de la Red
El mensaje de error, que sugiere un problema de "timeout" o "conexión rechazada", apunta directamente a inconvenientes de red. Una serie de verificaciones iniciales son cruciales para descartar causas comunes:
1. Verificación del Cortafuegos (Firewall)
Asegurarse de que el cortafuegos no esté bloqueando las conexiones salientes de Docker. El estado puede comprobasre con:
systemctl status firewalld
Si el servicio está activo y no es necesario, se puede detener temporalmente con:
systemctl stop firewalld
2. Configuración de Red Local
Confirmar la conectividad básica del sistema:
- Ping a sí mismo: Verificar la interfaz de red local (ej.
ping 127.0.0.1). - Ping a la máquina host (si es una VM): Asegurar la comunicación entre el sistema operativo invitado y el anfitrión.
- Ping a un sitio externo: Comprobar la conectividad a Internet (ej.
ping www.google.com).
Si todas estas pruebas son exitosas, la conectividad básica de la red del sistema operativo es funcional.
3. Configuración de IP y DNS
Revisar la configuración de red y DNS del sistema. Archivos clave incluyen:
/etc/sysconfig/network-scripts/ifcfg-ens33(o la interfaz correspondiente): Verificar que el método de arranque sea estático (BOOTPROTO=static) y que los servidores DNS estén correctamente configurados./etc/hosts: Asegurarse de que no haya entradas incorrectas que puedan interferir con la resolución de nombres de dominio.
A pesar de que estas verificaciones a menudo resultan positivas, el problema de descarga de Docker puede persistir, lo que sugiere una causa más específica.
Optimización de la Configuración de Docker
1. Configuración de Repositorios Espejo (Registry Mirrors)
Una causa frecuente de fallos de descarga, especialmente en ciertas regiones geográficas, es la latencia o el bloqueo a los repositorios oficiales de Docker Hub. La solución común es configurar espejos de registro. Esto se hace creando o modificando el archivo /etc/docker/daemon.json.
{
"registry-mirrors": [
"https://x9r52uz5.mirror.aliyuncs.com"
]
}
Después de modificar daemon.json, es esencial recargar la configuración del demonio de systemd y reiniciar el servicio Docker:
systemctl daemon-reload
systemctl restart docker
Para verificar si el cambio fue aplicado, se puede usar docker info y buscar la sección "Registry Mirrors" al final de la salida.
2. Ajuste de Parámetros de Descarga Concurrente
En ocasiones, el problema puede estar relacionado con los límites de concurrencia en las descargas. Se pueden ajustar estos parámetros en el mismo archivo daemon.json:
{
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"default-shm-size": "1G",
"debug": true,
"experimental": false,
"registry-mirrors": [
"https://x9r52uz5.mirror.aliyuncs.com"
]
}
Recuerde reiniciar Docker después de cualquier modificación en daemon.json.
Diagnóstico Avanzado de DNS
1. Modificación de /etc/resolv.conf
Aunque se haya configurado el DNS en la interfaz de red, el archivo /etc/resolv.conf es el que realmente usa el sistema para la resolución de nombres. Se pueden añadir servidores DNS públicos y confiables:
# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 1.1.1.1
Si se utiliza NetworkManager, es posible que los cambios manuales sean sobrescritos. En entornos donde esto es un problema, se deben configurar los DNS a través de NetworkManager o configurar una política para proteger resolv.conf.
2. Uso de dig para Identificar IPs Óptimas
Para obtener direcciones IP específicas para registry-1.docker.io que podrían funcionar mejor, se puede utilizar dig. Primero, instálelo si no está presente:
yum install bind-utils
Luego, consulte el dominio usando un servidor DNS específico:
dig @8.8.8.8 registry-1.docker.io
Las direcciones IP obtenidas se pueden añadir al archivo /etc/hosts. Después de esto, es crucial reiniciar la red y el servicio Docker:
systemctl restart network
systemctl restart docker
Solución Definitiva: Experimentar con Múltiples Repositorios Espejo
Después de agotar las opciones de diagnóstico de red y configuración básica de Docker, la solución más eficaz a menudo reside en la experimentación con diferentes repositorios espejo. Aunque se haya intentado con uno o dos, la variabilidad de la red y la disponibilidad de los espejos pueden hacer que una combinación específica sea la clave. La frustración es común en este punto, pero la persistencia es fundamental.
Finalmente, la solución al problema de conexión se encontró al configurar una lista más extensa y diversa de repositorios espejo en /etc/docker/daemon.json. Esta estrategia permite que Docker intente con varias fuentes hasta encontrar una que funcione correctamente.
El siguiente ejemplo muestra una configuración que ha demostrado ser efectiva, incorporando múltiples opciones de mirrors:
{
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"default-shm-size": "1G",
"debug": true,
"experimental": false,
"registry-mirrors": [
"https://dockerhub.icu",
"https://docker.chenby.cn",
"https://docker.1panel.live",
"https://docker.awsl9527.cn",
"https://docker.anyhub.us.kg",
"https://dhub.kubesre.xyz",
"https://x9r52uz5.mirror.aliyuncs.com"
]
}
Recuerde siempre ejecutar systemctl daemon-reload y systemctl restart docker después de modificar daemon.json.