
Estoy ejecutando un docker:20.10.7-dind
contenedor.
En este estoy ejecutando una aplicación de contenedores múltiples.
Un contenedor es un back
contenedor. Otro es un keycloak
contenedor.
Me conecto en el back
contenedor y tengo:
back$ cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0
back$ cat /etc/nsswitch.conf
hosts: files dns
back$ nslookup keycloak.localhost
Server: 127.0.0.11
Address: 127.0.0.11#53
Non-authoritative answer:
Name: keycloak.localhost
Address: 172.20.0.10
back$ host keycloak.localhost
keycloak.localhost has address 172.20.0.10
back$ nc keycloak.localhost 443 -vvv
keycloak.localhost (172.20.0.10:443) open
Sin embargo, cuando se trata de rizos:
back$ curl https://keycloak.localhost -v
* Trying 127.0.0.1:443...
* connect to 127.0.0.1 port 443 failed: Connection refused
* Trying [::1]:443...
* Immediate connect fail for ::1: Address not available
* Failed to connect to keycloak.localhost port 443 after 0 ms: Couldn't connect to server
* Closing connection 0
curl: (7) Failed to connect to keycloak.localhost port 443 after 0 ms: Couldn't connect to server
Noto que curl resuelve mal keycloak.localhost
pero no puedo entender por qué.
Tenga en cuenta que si ayudo a curl a resolver, funciona de maravilla:
back$ curl https://keycloak.localhost -v --resolve keycloak.localhost:443:172.20.0.10
* Added keycloak.localhost:443:172.20.0.10 to DNS cache
* Hostname keycloak.localhost was found in DNS cache
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 172.20.0.10:443...
* Connected to keycloak.localhost (172.20.0.10) port 443 (#0)
> GET / HTTP/2
> Host: keycloak.localhost
> user-agent: curl/8.0.1
> accept: */*
>
< HTTP/2 200
...
Agradecería cualquier pista que me ayude a entender esto.
Salud
Respuesta1
Ok, finalmente lo descubrí.
Se debe a la versión curl/libcurl.
Desde v7.85, curl essiempreresolviendo localhost a 127.0.0.1.
Ver :
https://curl.se/changes.html#7_85_0
https://github.com/curl/curl/issues/9192
Bajé la versión de curl y mis cosas funcionan bien ahora.
Respuesta2
Otra forma de hacer que esto funcione es agregar el nombre de la red docker-compose como último TLD encima del nombre de la red configurada, por ejemplo, keycloak.localhost
falla pero keycloak.localhost.myfolder_default
se resuelve.
Elaborar:
Con esta estructura de carpetas:
myfolder
└── docker-compose.yml
Y esta ventana acoplable compone:
services:
backend:
image: backend:latest
container_name: backend.localhost
keycloak:
image: keycloak:latest
container_name: keycloak.localhost
El contenedor backend podrá resolver keycloak.localhost utilizando cualquier herramienta que lea /etc/resolv.conf correctamente (puede comprobar si la herramienta abre el archivo /etc/resolv.conf ejecutándolo con strace
). Cualquiera de estas herramientas funcionará:
wget http://keycloak.localhost:8443
getent hosts keycloak.localhost
nslookup keycloak.localhost
nc keycloak.localhost 8443 -v
Pero en mi caso netcat
mostró el problema:
# nc keycloak.localhost 8443 -v
DNS fwd/rev mismatch: keycloak.localhost != keycloak.localhost.myfolder_default
keycloak.localhost [10.201.1.4] 8443 (?) open
El uso de FQND finalmente funcionó correctamente con libcurl:
curl http://keycloak.localhost.myfolder_default:8443
Pude dejar los nombres de mis contenedores como están porque se resuelven bien para el 90% de los programas que respetan /etc/resolv.conf y usan libc resolutor. Para los programas que usan libcurl comencé a agregar el .myfolder_default
TLD a todas las URL.
Para que conste, estaba usando Debian, curl versión 7.88.1 con las siguientes configuraciones de nsswitch:
# /etc/nsswitch.conf
hosts: files dns
networks: files