Выбор ответа Junior Сети и тома спрашивают часто обновлено
Порт опубликован, а соединение сбрасывается
Вопрос
Контейнер запущен с -p 8080:3000. curl localhost:8080 на хосте получает Connection reset by peer, хотя приложение работает. В логе: listening on 127.0.0.1:3000. В чём причина?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Приложение слушает только loopback контейнера, а трафик приходит на eth0. У контейнера свой network namespace и свой loopback.
Варианты ответа
- Приложение слушает только loopback контейнера, а трафик приходит на
eth0правильный ответ - Порт 3000 зарезервирован Docker под служебный API и перехватывается демоном
- Нужно добавить
EXPOSE 3000, без него Docker не пробрасывает трафик внутрь - Перепутан порядок аргументов: правильно
-p 3000:8080, сначала порт контейнера
Разбор
У контейнера свой network namespace и свой loopback. Docker доставляет трафик на адрес контейнера в bridge-сети, а сокет на 127.0.0.1 его не принимает. Нужно слушать 0.0.0.0 (или ::). EXPOSE ничего не открывает, а порядок -p хост:контейнер указан верно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.