Нет ответа от веб-сервера в Docker-контейнере с хоста
Я использую веб-сервер (загрузочное приложение Java Spring) в контейнере Docker через порт 8080, который подключен к интерфейсу 127.0.0.1 также через порт 8080.
docker ps
показывает, что порт выставлен:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a055dd0dbbfe image "/bin/sh -c 'echo \"T…" 39 minutes ago Up 39 minutes 127.0.0.1:8080->8080/tcp my-app_1
netstat -an
на хосте показывает, что порт на самом деле слушает:
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:35900 127.0.0.1:8080 FIN_WAIT2
tcp 142 0 127.0.0.1:8080 127.0.0.1:35900 CLOSE_WAIT
tcp 0 1 172.18.0.1:36626 172.18.0.3:8080 SYN_SENT
Если я пытаюсь получить доступ к серверу с хоста Docker
wget 127.0.0.1:8080
Я вижу, что соединение установлено, HTTP-запрос отправлен, но ответ не получен. Соединение закрывается одноранговым пользователем через некоторое время. Это поведение отражается в tcpdump
также:
21:01:14.174522 IP localhost.35872 > localhost.http-alt: Flags [S], seq 441189964, win 43690, options [mss 65495,sackOK,TS val 342973 ecr 0,nop,wscale 7], length 0
21:01:14.174546 IP localhost.http-alt > localhost.35872: Flags [S.], seq 3411015394, ack 441189965, win 43690, options [mss 65495,sackOK,TS val 342973 ecr 342973,nop,wscale 7], length 0
21:01:14.174570 IP localhost.35872 > localhost.http-alt: Flags [.], ack 1, win 342, options [nop,nop,TS val 342973 ecr 342973], length 0
21:01:14.176050 IP localhost.35872 > localhost.http-alt: Flags [P.], seq 1:142, ack 1, win 342, options [nop,nop,TS val 342973 ecr 342973], length 141: HTTP: GET / HTTP/1.1
21:01:14.176068 IP localhost.http-alt > localhost.35872: Flags [.], ack 142, win 350, options [nop,nop,TS val 342973 ecr 342973], length 0
21:03:21.418268 IP localhost.http-alt > localhost.35872: Flags [R.], seq 1, ack 142, win 350, options [nop,nop,TS val 374784 ecr 342973], length 0
Веб-сервер в контейнере работает. Сервер Spring Boot слушает все интерфейсы (lo
а также eth0
):
Application 'app' is running! Access URLs:
Local: http://127.0.0.1:8080
External: http://172.18.0.3:8080
и я могу успешно wget
изнутри контейнера:
docker exec <container> wget localhost:8080
:
Connecting to localhost:8080 (127.0.0.1:8080)
index.html 100% |*******************************| 12560 0:00:00 ETA
Версия докера 18.09.2
для клиента и двигателя.
ОС Ubuntu, uname -a
:
Linux srv02 4.4.0-142-generic #168-Ubuntu SMP Wed Jan 16 21:00:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
Понятия не имею, что может быть не так?
1 ответ
Если вы обнаружили проблему, это очевидно. Поставщик настроил фильтр iptables, который отбрасывал все "выходные" пакеты на неизвестные порты, такие как 8080.