我正在运行一个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
然而,当谈到 curl 时:
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 版本造成的。
从 v7.85 开始,curl 是总是将本地主机解析为 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
这个docker compose:
services:
backend:
image: backend:latest
container_name: backend.localhost
keycloak:
image: keycloak:latest
container_name: keycloak.localhost
后端容器将能够使用任何能够正确读取 /etc/resolv.conf 的工具来解析 keycloak.localhost(您可以通过运行来检查该工具是否打开 /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 解析器的程序。对于使用 libcurl 的程序,我开始将 TLD 附加.myfolder_default
到所有 URL。
顺便说一下,我使用的是 debian,curl 版本 7.88.1,nsswitch 配置如下:
# /etc/nsswitch.conf
hosts: files dns
networks: files