
コンテナを実行しています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