
Ich betreibe einen docker:20.10.7-dind
Container.
Darin führe ich eine App mit mehreren Containern aus.
Ein Container ist ein back
Container. Ein anderer ist ein keycloak
Container.
Ich verbinde mich mit dem back
Container und habe:
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
Wenn es jedoch um Locken geht:
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
Mir ist aufgefallen, dass sich die Locken nicht gut auflösen, keycloak.localhost
aber ich kann nicht herausfinden, warum?
Beachten Sie, dass es wie am Schnürchen klappt, wenn ich curl bei der Lösung helfe:
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
...
Ich wäre für jeden Hinweis dankbar, der mir beim Verständnis hilft.
Prost
Antwort1
OK, ich habe es endlich herausgefunden.
Es liegt an der curl/libcurl-Version.
Seit v7.85 ist curlstetsAuflösung von localhost in 127.0.0.1.
Sehen :
https://curl.se/changes.html#7_85_0
https://github.com/curl/curl/issues/9192
Ich habe Curl heruntergestuft und mein Zeug funktioniert jetzt einwandfrei.
Antwort2
Eine andere Möglichkeit, dies zum Laufen zu bringen, besteht darin, den Docker-Compose-Netzwerknamen als letztes TLD an den konfigurierten Netzwerknamen anzuhängen. Dies schlägt beispielsweise keycloak.localhost
fehl, wird aber keycloak.localhost.myfolder_default
aufgelöst.
Um es genauer zu erläutern:
Mit dieser Ordnerstruktur:
myfolder
└── docker-compose.yml
Und dieses Docker-Composer:
services:
backend:
image: backend:latest
container_name: backend.localhost
keycloak:
image: keycloak:latest
container_name: keycloak.localhost
Der Backend-Container kann keycloak.localhost mit allen Tools auflösen, die /etc/resolv.conf richtig lesen (Sie können überprüfen, ob das Tool die Datei /etc/resolv.conf öffnet, indem Sie es mit ausführen strace
). Jedes dieser Tools funktioniert:
wget http://keycloak.localhost:8443
getent hosts keycloak.localhost
nslookup keycloak.localhost
nc keycloak.localhost 8443 -v
Aber in meinem Fall netcat
zeigte sich das Problem:
# nc keycloak.localhost 8443 -v
DNS fwd/rev mismatch: keycloak.localhost != keycloak.localhost.myfolder_default
keycloak.localhost [10.201.1.4] 8443 (?) open
Die Verwendung des FQND funktionierte mit libcurl endlich korrekt:
curl http://keycloak.localhost.myfolder_default:8443
Ich konnte die Namen meiner Container so lassen, wie sie sind, da sie für 90 % der Programme, die /etc/resolv.conf respektieren und den libc-Resolver verwenden, problemlos aufgelöst werden. Für Programme, die libcurl verwenden, habe ich begonnen, die .myfolder_default
TLD an alle URLs anzuhängen.
Fürs Protokoll: Ich habe Debian, Curl Version 7.88.1 mit folgenden NSswitch-Konfigurationen verwendet:
# /etc/nsswitch.conf
hosts: files dns
networks: files