curl は、dind コンテキストで DNS 解決が正しくありません。

curl は、dind コンテキストで DNS 解決が正しくありません。

コンテナを実行していますdocker:20.10.7-dind

これにマルチコンテナ アプリを実行しています。

1 つのコンテナはbackコンテナです。もう 1 つも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はいつもlocalhost を 127.0.0.1 に解決します。

見る :

https://curl.se/changes.html#7_85_0

参考:

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

/etc/resolv.conf を尊重し、libc リゾルバを使用するプログラムの 90% ではコンテナ名が適切に解決されるため、コンテナ名をそのままにしておくことができました。libcurl を使用するプログラムでは、.myfolder_defaultすべての URL に TLD を追加するようになりました。

ちなみに、私は Debian、curl バージョン 7.88.1 を次の nsswitch 構成で使用していました。

# /etc/nsswitch.conf
hosts:          files dns
networks:       files

関連情報