Вход в приложение Angular из Windows 11 в контейнере Docker, работающем с PostgreSQL, вызывает ошибку SQLSTATE[08006] [7]?

Вопрос или проблема

Как упомянуто в теме письма, когда я пытаюсь войти в angular приложение, используя Laravel на сервере с Windows 11 и docker контейнером, работающим на PostgreSQL, я получаю следующую ошибку: SQLSTATE[08006] [7] не удалось подключиться к серверу по адресу “localhost” (::1), порт 9445: Подключение отклонено?

Если я делаю то же самое в DBeaver, подключение работает как и ожидалось! В чем может быть проблема? Пожалуйста, смотрите скриншоты и код ниже:

вставьте описание изображения здесь

вставьте описание изображения здесь

вставьте описание изображения здесь

Конфигурация Laravel > файл database.php

   'default' => env('DB_CONNECTION', 'pgsql'),
   ...
   'pgsql' => [
           'driver' => 'pgsql',
           'url' => env('DATABASE_URL'),
           'host' => env('DB_HOST', 'localhost'),
           'port' => env('DB_PORT', '9445'),
           'database' => env('DB_DATABASE', 'phone-book'),
           'username' => env('DB_USERNAME', 'dev'),
           'password' => env('DB_PASSWORD', '123456789'),
           'charset' => 'utf8',
           'prefix' => '',
           'prefix_indexes' => true,
           'search_path' => 'public',
           'sslmode' => 'prefer',
       ], 
   ...

Файл .env

    DB_CONNECTION=pgsql
    DB_HOST=localhost
    DB_PORT=9445
    DB_DATABASE=phone-book
    DB_USERNAME=dev
    DB_PASSWORD=123456789

вставьте описание изображения здесь

Ответ или решение

Ошибки при подключении к базе данных могут быть вызваны множеством факторов, и в вашем случае ошибка SQLSTATE[08006] [7] указывает на проблемы с соединением с PostgreSQL, запущенным в Docker-контейнере. Давайте подробнее рассмотрим вашу ситуацию и проанализируем возможные источники проблемы.

1. Логика подключения

Вы используете Laravel с настройками для подключения к PostgreSQL. Ваша конфигурация в файлах database.php и .env указывает на использование localhost и порт 9445. Однако этот адрес может не соответствовать реальному расположению вашего контейнера Docker.

2. Docker и локальные сети

Docker использует свою собственную сеть, и при обращении к localhost в вашем приложении, оно пытается подключиться к базе данных, развернутой на самом хосте (в Windows 11), а не в Docker-контейнере. Из-за этого ваше приложение теряет связь с базой данных и выдает сообщение о том, что соединение отклонено.

3. Исправление конфигурации

Чтобы ваше приложение могло правильно подключаться к базе данных, вам нужно протестировать следующие настройки:

  • Используйте IP-адрес контейнера. Чтобы получить IP-адрес контейнера PostgreSQL, выполните команду:

    docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <имя_контейнера>

    После этого замените DB_HOST=localhost на полученный IP-адрес.

  • Используйте host.docker.internal. Этот специальный адрес позволяет контейнерам Docker обращаться к хосту:

    DB_HOST=host.docker.internal

Это значительно упростит подключение, если вы работаете в режиме разработки.

4. Порт и настройка сети

Проверьте, что PostgreSQL внутри контейнера действительно слушает на порту 9445. Для этого вы можете зайти в контейнер и протестировать доступность порта:

docker exec -it <имя_контейнера> bash
netstat -tuln | grep 9445

Если он не прослушивает этот порт, возможно, вы намеренно не указали его в конфигурации PostgreSQL. Убедитесь, что в вашем docker-compose.yml (или другом конфигурационном файле) указаны правильные настройки.

5. Logging и отладка

Если после всех правок проблема остается нерешенной, включите логирование в Laravel для получения более детальной информации об ошибках подключения. В config/database.php можно изменить уровень ошибки до debug и проверить логи:

'log' => [
    'driver' => env('DB_LOG_DRIVER', 'daily'),
    'level' => 'debug',
],

Это позволит вам получать больше деталей о проблемах с подключением.

6. Сравнение с DBeaver

Разница в том, что DBeaver, скорее всего, правильно настроен для обращения к базе данных внутри Docker, использует правильные параметры подключения и поэтому успешно соединяется. Проверьте, какие параметры подключения используются в DBeaver, и сравните их с настройками вашего Laravel приложения.

Заключение

Ошибки подключения к базе данных зачастую возникают из-за неправильного указания хоста или порта. Путем замены localhost и корректной настройки контейнера, вы можете в значительной степени улучшить доступность вашего приложения. Протестируйте предложенные исправления и убедитесь, что ваше приложение может успешно взаимодействовать с PostgreSQL. Если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...