Ответ вслух Middle Сети и тома спрашивают часто обновлено

Контейнер не видит базу

Вопрос

Приложение в контейнере падает с connection refused при подключении к PostgreSQL, который тоже в контейнере. Как будешь искать причину?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Сначала разделяю: ошибка имени или ошибка подключения. connection refused значит, что имя резолвится и хост доступен, но на порту никто не слушает. Проверяю, жива ли база: docker ps, docker logs db.

Что должно прозвучать в ответе

  • Проверить, что оба контейнера в одной пользовательской сети: `docker network inspect`, `docker inspect`

  • Хост в строке подключения: имя сервиса, а не `localhost` и не старый IP

  • База запущена и готова: `docker ps`, `docker logs db`, healthcheck; приложение не стартовало раньше базы

  • База слушает `0.0.0.0` внутри контейнера и порт тот, что ожидаем

  • Проверка изнутри: `docker exec api getent hosts db`, `nc -zv db 5432`

  • Если refused по IP: контейнер пересоздан, IP сменился, нужно ходить по имени

Что могут спросить следом

  • Чем refused отличается от could not translate host name?
  • Как в compose дождаться готовности базы?
  • Зачем база публикует порт наружу, если приложение в той же сети?

Разбор

Сначала разделяю: ошибка имени или ошибка подключения. connection refused значит, что имя резолвится и хост доступен, но на порту никто не слушает. Проверяю, жива ли база: docker ps, docker logs db. Частая причина: приложение стартовало раньше, чем база начала принимать соединения, поэтому нужен healthcheck и повторы подключения. Потом смотрю строку подключения: в контейнере localhost это сам контейнер, хост должен быть именем сервиса базы. Проверяю, что оба в одной пользовательской сети: docker network inspect app-net. Проверяю изнутри: docker exec api getent hosts db и nc -zv db 5432, если утилиты есть, или временный контейнер с netshoot в той же сети. Если в конфиге прописан IP, а контейнер базы пересоздали, адрес мог смениться. И смотрю, на каком адресе и порту слушает сама база: listen_addresses должен разрешать не только localhost.

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

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