Вопрос или проблема
Как упомянуто в теме письма, когда я пытаюсь войти в 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. Если возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.