Một container docker của tôi hiển thị giao diện HTTP trên cổng 8500, được ánh xạ tới cổng máy chủ 8500. Nó không được bật IPv6. Điều này vẫn có nghĩa, tôi sẽ có thể truy cập nó tại localhost: 8500. IPv6 được ưa thích, vì vậy tôi kết thúc với một yêu cầu tới [:: 1]: 8500. Cái này bị kẹt, nó không bao giờ trở lại.
Tái tạo điều này với curl, lệnh này bị kẹt:
curl -g -6 "http://[::1]:8500"
Tùy chọn --verbose của curl cho thấy không có gì, cũng không --ascii-dấu vết. Đồng thời, một yêu cầu tới localhost của IPv4 thành công:
curl http://127.0.0.1:8500
cho tôi HTML mong đợi. Nếu tôi chạy máy chủ HTTP IPv4 trên loopback, sử dụng
python -m SimpleHTTPServer 4001
sau đó tôi nhận được rất nhiều HTML cho localhost của IPv4
curl http://127.1:4001
và lỗi kết nối thích hợp cho IPv6:
curl -g -6 "http://[::1]:4001"
curl: (7) Failed to connect to ::1 port 4001: Connection refused
Những điều cần lưu ý: Docker 1.7.1. IPv6 không được kích hoạt cho bộ chứa, do đó không có quy tắc iptable IPv6. (ip6tables -v -L không cho gì cả)
Câu hỏi của tôi là: Tại sao yêu cầu bị mắc kẹt, và làm gì?
tcp6 0 0 :::8500 :::* LISTEN 1648/docker
Hấp dẫn. Tại sao? Và tại sao nó lại chặn?
/proc/sys/net/ipv6/conf/all/disable_ipv6
mang lại 0, vì vậy IPv6 phải được bật.