Curl 在 dind 上下文中具有错误的 DNS 解析

Curl 在 dind 上下文中具有错误的 DNS 解析

我正在运行一个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

相关内容