
Я управляю docker:20.10.7-dind
контейнером.
В этом случае я запускаю приложение с несколькими контейнерами.
Один контейнер — это back
контейнер. Другой — это keycloak
контейнер.
Я подключаюсь к back
контейнеру и имею:
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
Однако, когда дело доходит до завивки:
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
Я заметил, что curl плохо решает проблему, keycloak.localhost
но не могу понять, почему?
Обратите внимание, что если я помогу curl разрешить проблему, то все будет работать как по маслу:
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
...
Я был бы признателен любой подсказке, которая поможет мне это понять.
Ваше здоровье
решение1
Хорошо, я наконец понял.
Это связано с версией curl/libcurl.
Начиная с версии 7.85, curlвсегдаразрешение localhost в 127.0.0.1.
Видеть :
https://curl.se/changes.html#7_85_0
https://github.com/curl/curl/issues/9192
Я понизил версию curl, и теперь все работает нормально.
решение2
Другой способ заставить это работать — добавить сетевое имя docker-compose в качестве последнего TLD поверх настроенного сетевого имени. Например, это keycloak.localhost
не удастся, но keycloak.localhost.myfolder_default
будет разрешено.
Подробнее:
При такой структуре папок:
myfolder
└── docker-compose.yml
И эта докерная композиция:
services:
backend:
image: backend:latest
container_name: backend.localhost
keycloak:
image: keycloak:latest
container_name: keycloak.localhost
Контейнер бэкэнда сможет разрешить keycloak.localhost с помощью любых инструментов, которые правильно читают /etc/resolv.conf (вы можете проверить, открывает ли инструмент файл /etc/resolv.conf, запустив его с помощью strace
). Любой из этих инструментов будет работать:
wget http://keycloak.localhost:8443
getent hosts keycloak.localhost
nslookup keycloak.localhost
nc keycloak.localhost 8443 -v
Но в моем случае netcat
проявилась проблема:
# nc keycloak.localhost 8443 -v
DNS fwd/rev mismatch: keycloak.localhost != keycloak.localhost.myfolder_default
keycloak.localhost [10.201.1.4] 8443 (?) open
Использование FQND наконец-то заработало правильно с libcurl:
curl http://keycloak.localhost.myfolder_default:8443
Я смог оставить имена своих контейнеров как есть, потому что они прекрасно разрешаются для 90% программ, которые уважают /etc/resolv.conf и используют libc resolver. Для программ, использующих libcurl, я начал добавлять TLD .myfolder_default
ко всем URL.
Для справки: я использовал Debian, Curl версии 7.88.1 со следующими настройками nsswitch:
# /etc/nsswitch.conf
hosts: files dns
networks: files