
컨테이너를 운영하고 있습니다 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
그러나 컬의 경우 :
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
만 이유를 알 수 없습니까?
해결을 위해 컬링을 도우면 매력처럼 작동합니다.
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
좋아, 드디어 알아냈어.
이것은 컬/libcurl 버전 때문입니다.
v7.85부터 컬은언제나localhost를 127.0.0.1로 확인합니다.
보다 :
https://curl.se/changes.html#7_85_0
https://github.com/curl/curl/issues/9192
컬을 다운그레이드했는데 이제 내 작업이 제대로 작동합니다.
답변2
이를 작동시키는 또 다른 방법은 구성된 네트워크 이름 위에 마지막 TLD로 docker-compose 네트워크 이름을 추가하는 것입니다. 예를 들어 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
/etc/resolv.conf를 존중하고 libc 해석기를 사용하는 프로그램의 90%가 제대로 해석되기 때문에 컨테이너 이름을 그대로 둘 수 있었습니다. libcurl을 사용하는 프로그램의 경우 .myfolder_default
모든 URL에 TLD를 추가하기 시작했습니다 .
나는 데비안을 사용하고 있었는데 다음 nsswitch 구성과 함께 컬 버전 7.88.1을 사용했습니다.
# /etc/nsswitch.conf
hosts: files dns
networks: files