Выбор ответа Junior Сети и тома спрашивают часто обновлено

Порт опубликован, а соединение сбрасывается

Вопрос

Контейнер запущен с -p 8080:3000. curl localhost:8080 на хосте получает Connection reset by peer, хотя приложение работает. В логе: listening on 127.0.0.1:3000. В чём причина?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Приложение слушает только loopback контейнера, а трафик приходит на eth0. У контейнера свой network namespace и свой loopback.

Варианты ответа

  1. Приложение слушает только loopback контейнера, а трафик приходит на eth0правильный ответ
  2. Порт 3000 зарезервирован Docker под служебный API и перехватывается демоном
  3. Нужно добавить EXPOSE 3000, без него Docker не пробрасывает трафик внутрь
  4. Перепутан порядок аргументов: правильно -p 3000:8080, сначала порт контейнера

Разбор

У контейнера свой network namespace и свой loopback. Docker доставляет трафик на адрес контейнера в bridge-сети, а сокет на 127.0.0.1 его не принимает. Нужно слушать 0.0.0.0 (или ::). EXPOSE ничего не открывает, а порядок -p хост:контейнер указан верно.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.