Мой контейнер Docker предоставляет HTTP-интерфейс для порта 8500, который сопоставлен с портом хоста 8500. Он не поддерживает IPv6. Это по-прежнему означает, что я должен иметь доступ к нему на локальном хосте: 8500. IPv6 предпочтительнее, поэтому я получаю запрос к [:: 1]: 8500. Этот застревает, он никогда не возвращается.
Воспроизводя это с помощью curl, эта команда застревает:
curl -g -6 "http://[::1]:8500"
Опция curl --verbose ничего не показывает, равно как и --ascii-trace. В то же время запрос к локальному хосту IPv4 завершается успешно:
curl http://127.0.0.1:8500
давая мне ожидаемый HTML. Если я запускаю HTTP-сервер IPv4 по шлейфу, используя
python -m SimpleHTTPServer 4001
тогда я получаю много HTML для локального хоста IPv4
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. (ip6tables -v -L ничего не дает)
У меня вопрос: почему запрос застревает и что делает?
tcp6 0 0 :::8500 :::* LISTEN 1648/docker
завораживающе. Почему? И почему это блокирует?
/proc/sys/net/ipv6/conf/all/disable_ipv6
выдает 0, поэтому IPv6 должен быть включен.