내 Docker 컨테이너는 포트 8500에서 HTTP 포트를 노출하며 호스트 포트 8500에 매핑됩니다 . IPv6을 사용할 수 없습니다 . 이것은 여전히 localhost : 8500에서 액세스 할 수 있어야한다는 의미입니다. IPv6이 선호되므로 [:: 1] : 8500에 대한 요청으로 끝납니다. 이것은 갇히고 결코 돌아 오지 않습니다.
curl로 이것을 재현하면이 명령이 중단됩니다.
curl -g -6 "http://[::1]:8500"
curl의 --verbose 옵션은 --ascii-trace도 표시하지 않습니다. 동시에 IPv4의 로컬 호스트에 대한 요청이 성공합니다.
curl http://127.0.0.1:8500
예상 HTML을 제공합니다. 루프백에서 IPv4 HTTP 서버를 실행하는 경우
python -m SimpleHTTPServer 4001
그런 다음 IPv4의 로컬 호스트에 대한 많은 HTML을 얻습니다.
curl http://127.1:4001
IPv6에 대한 올바른 연결 실패 :
curl -g -6 "http://[::1]:4001"
curl: (7) Failed to connect to ::1 port 4001: Connection refused
참고 사항 : Docker 1.7.1. IPv6은되어 있지 따라서 더 IPv6를 먼저, iptable 규칙이없는, 컨테이너를 사용할. (ip6tables -v -L은 아무것도 제공하지 않습니다)
내 질문은 : 왜 요청이 멈추고 무엇을합니까?
1
"netstat -6 -an"의 결과를 보여 주시겠습니까?
—
Rui F Ribeiro
도커는 그 포트에서 듣고있다 :
—
mknecht
tcp6 0 0 :::8500 :::* LISTEN 1648/docker
매혹적인. 왜? 왜 차단 되나요?
수신 및 구성되지 않았거나 sysctl에서 IPv6을 사용하지 않도록 설정 한 것 같습니다. nginx, apache, lighthttp, 문제의 웹 서버를 게시물에 추가 하시겠습니까?
—
Rui F Ribeiro
컨테이너 내부에서 구성을위한 키-값 저장소 인 Consul이 청취 중입니다. 그러나 컨테이너가 IPv6을 지원하지 않는 것은 관련이 없다고 생각합니다. 그 요청은 절대 영사에 도달해서는 안됩니다. 그래도 어떤 레이어에 붙어 있지는 않습니다. 호스트에서
—
mknecht
/proc/sys/net/ipv6/conf/all/disable_ipv6
0을 생성하므로 IPv6을 활성화해야합니다.
별로 의미가 없습니다. 프로그램이 IPv6 소켓에 바인딩되는 한 sysctl 및 최신 커널에서도 IPv6을 비활성화 할 수 있습니다. IPv6을 지원하는 각 데몬을 거치고 IPv6 구성을 비활성화해야하기 때문에 엉덩이가 아프다.
—
Rui F Ribeiro