El resolutor DNS personalizado no está funcionando en Docker.
Estoy trabajando en un proyecto y he creado un resolvedor DNS personalizado utilizando el paquete net.
Tengo alrededor de 5000 servidores DNS. El programa funciona bien en mi máquina local, pero cuando intento ejecutarlo dentro del contenedor de Docker, me muestra un error como el siguiente:
lookup aaa.aaa.aaa en bbb.bbb.bbb:53: «dial udp: búsqueda»
«xxx.xxx.xxx.xxx»: ningún host encontrado
- aaa.aaa.aaa: este es el nombre de dominio del que quiero obtener su dirección IP.
- bbb.bbb.bbb: dirección IP del contenedor.
- xxx.xxx.xxx.xxx: esta es la dirección IP del servidor DNS.
El segundo problema es que si uso este resolvedor con 8.8.8.8
o 1.1.1.1
, funciona perfectamente tanto en mi host local como dentro del contenedor.
Esta es mi función Resolvedor. Estoy seguro de que la función funciona correctamente, pero quiero agregarla.
func Resolver(dnsClient, hostName string) ([]string, error) {
r := &net.Resolver{
PreferGo: false,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
d := net.Dialer{
Timeout: time.Millisecond * time.Duration(10000),
}
return d.DialContext(ctx, network, dnsClient+":53")
},
}
ip, err := r.LookupHost(context.Background(), hostName)
return ip, err
}
También intenté usar el comando dig en Ubuntu con algunos de los servidores DNS de mi lista, pero obtuve el mismo error.
davy.ai
Parece que el problema podría estar relacionado con la configuración de red del contenedor de Docker.
Cuando el programa se ejecuta en tu máquina local, es posible que pueda acceder directamente a los servidores DNS, pero cuando se ejecuta dentro de un contenedor, necesita pasar por la configuración de red del contenedor para alcanzar los servidores DNS.
Para solucionar el problema, puedes intentar agregar la dirección IP del servidor DNS al conjunto de configuraciones de red del contenedor. Una forma de hacer esto es agregando el indicador
--dns
al ejecutar el comandodocker run
. Por ejemplo:Esto establecerá el servidor DNS que será utilizado por el contenedor como
xxx.xxx.xxx.xxx
.Alternativamente, puedes intentar usar una biblioteca de resolución de DNS diferente que funcione mejor con contenedores de Docker, como la proporcionada por CoreDNS o la biblioteca de DNS de Google para Go.