私のDockerコンテナーは、ポート8500でHTTPインターフェースを公開します。これは、ホストポート8500にマップされます。IPv6対応ではありません。これでも、localhost:8500でアクセスできるはずです。IPv6が優先されるので、[:: 1]:8500へのリクエストが返されます。これは行き詰まり、二度と戻らない。
カールでこれを再現すると、このコマンドは行き詰まります:
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、問題のWebサーバーを投稿に追加しますか?
—
Rui F Ribeiro
コンテナー内では、構成用のKey-ValueストアであるConsulがリッスンしています。しかし、私はそれが関連しているとは思いません。コンテナはIPv6対応ではありません。そのリクエストは領事に届かないはずです。どのレイヤーに行き詰まっているのかわかりませんが。ホストで
—
mknecht
/proc/sys/net/ipv6/conf/all/disable_ipv6
は0になるため、IPv6を有効にする必要があります。
それはあまり意味がありません。sysctlや新しいカーネルでもIPv6を無効にすることができます。プログラムがIPv6ソケットにバインドしている限り、要求は受け入れられます。IPv6をサポートする各デーモンを通過し、IPv6構成を無効にする必要があるため、お尻の痛み。
—
Rui F Ribeiro