
我正在運行一個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
我注意到捲曲不能很好地解決問題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 是總是將 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
後端容器將能夠使用任何正確讀取 /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 的程序,我開始將.myfolder_default
TLD 附加到所有 URL。
根據記錄,我使用的是 debian、curl 版本 7.88.1 和以下 nsswitch 設定:
# /etc/nsswitch.conf
hosts: files dns
networks: files