Выбор ответа Junior Docker для разработчика спрашивают часто обновлено

localhost внутри контейнера

Вопрос

В Compose есть сервисы api и db (PostgreSQL). API подключается к postgres://app:app@localhost:5432/app и получает «connection refused». Почему?

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

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

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

Коротко

Правильный ответ: localhost в контейнере api это сам api; нужен хост db. У каждого контейнера своё сетевое пространство имён, и localhost указывает на него самого.

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

  1. localhost в контейнере api это сам api; нужен хост dbправильный ответ
  2. PostgreSQL в Docker слушает другой порт, 15432
  3. Нужно добавить network_mode: bridge обоим сервисам
  4. Compose не создаёт сеть между сервисами без networks

Разбор

У каждого контейнера своё сетевое пространство имён, и localhost указывает на него самого. Compose создаёт общую сеть, где сервисы доступны по именам: postgres://app:app@db:5432/app.

  • Порт PostgreSQL по умолчанию тот же, 5432.
  • bridge это и так тип сети по умолчанию.
  • Compose как раз создаёт сеть проекта автоматически.

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

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