psql на WSL2 не может найти localhost для подключения. (localhost находится в /etc/hosts)

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

ОБНОВЛЕНИЕ

Я уже достиг своей цели: выполнил операцию изнутри экземпляра pg и использовал команду docker cp для того, чтобы вывести дамп из контейнера.

Тем не менее, мне интересно узнать ответ на вопрос о сети:

Я установил postgres в WSL2, чтобы получить доступ к инструментам клиента postgres для выполнения pg_dump из экземпляра pg в docker (docker, работающий в WSL2), в облачный экземпляр pg. Я запускаю команду psql из своего терминала WSL2/ubuntu.

Я не могу подключиться к экземпляру docker, даже используя просто psql.
Я пробовал psql -h 127.0.0.1 -U <имя_пользователя> и psql -h localhost -U <имя_пользователя>
и оба выдали ошибку:

psql: ошибка: не удалось перевести имя хоста "127.0.0.1" в адрес: имя или служба не известны
psql: ошибка: не удалось перевести имя хоста "localhost" в адрес: имя или служба не известны

Тем не менее, /etc/hosts в WSL ubuntu содержит 127.0.0.1 localhost и pgAdmin (который, как я полагаю, строго говоря, работает в самой Windows) может подключаться, используя имя хоста localhost.

Тогда я подумал, поскольку экземпляр pg на самом деле работает в docker, в WSL, я также попробую ip хоста docker, используя команду, которую я нашел: docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <имяСервисаЗдесь>
Но я получил ту же ошибку, несмотря на то, что другое веб-приложение docker, которое подключается к базе данных, может это сделать из браузера с этим же ip docker. Честно говоря, все службы находятся в одной и той же docker-сети, но тем не менее.

Совершенно не понимаю, почему я не могу подключиться извне docker.

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

Проблема подключения к PostgreSQL в WSL2

Введение

Ситуация, когда вы не можете подключиться к экземпляру PostgreSQL, работающему в Docker из WSL2 (Windows Subsystem for Linux 2), может быть сбивающей с толку. Обратите внимание, что WSL2 и Docker работают в рамках изолированных сетей, что требует понимания сетевой конфигурации. В этой статье мы разберем причины вашей проблемы и предложим практические решения.

Описание проблемы

Вы упомянули, что при попытке подключения к PostgreSQL через psql с использованием команд:

psql -h 127.0.0.1 -U <username>

или

psql -h localhost -U <username>

вы получаете ошибку:

psql: error: could not translate host name "127.0.0.1" to address: Name or service not known
psql: error: could not translate host name "localhost" to address: Name or service not known

Возможные причины проблемы

  1. Сетевая изоляция WSL2: WSL2 создает виртуальную машину, которая имеет свои собственные сетевые настройки. Это означает, что localhost внутри этой среды может не соответствовать localhost в Windows или Docker.

  2. Конфигурация Docker: Когда PostgreSQL запускается в контейнере Docker, он может быть доступен на определенном IP-адресе, который не совпадает с адресами в WSL2.

  3. Настройки файла hosts: Хотя вы указали, что localhost настроен в /etc/hosts, это может не влиять на работу сети в WSL2.

  4. Проблемы с DNS: Ошибка "could not translate host name" может также свидетельствовать о проблемах с разрешением DNS внутри WSL2.

Как исправить проблему

Шаг 1: Проверка IP-адреса контейнера

Используйте команду для получения IP-адреса запущенного контейнера PostgreSQL:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <название_сервиса>

Попробуйте подключиться к этому IP-адресу вместо localhost или 127.0.0.1.

Шаг 2: Проверка сетевой связи

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

ping <IP-адрес_контейнера>

или

curl <IP-адрес_контейнера>:<порт>

Это позволит определить, доступен ли контейнер из WSL2.

Шаг 3: Изменение настроек конфигурации Docker

Если вы используете Docker Desktop на Windows, проверьте настройки Resources > Network на наличие опции "Expose daemon on tcp://localhost:2375 without TLS". Это может помочь связать Docker с WSL2.

Шаг 4: Использование Docker Network

Если все службы работают в одной сетевой подсети Docker, вы можете использовать имя службы Docker для подключения. Например:

psql -h <имя_сервиса> -U <username>

Шаг 5: Перезагрузка WSL2 и Docker

Если ни одно из вышеперечисленных решений не сработало, попробуйте перезагрузить WSL2 и Docker Desktop:

wsl --shutdown

После этого перезапустите Docker Desktop.

Заключение

Проблемы с подключением к PostgreSQL через psql в WSL2 требуют внимания к специфике сетевой конфигурации Docker и WSL2. Надеюсь, что предложенные вами шаги помогут вам разобраться с текущими трудностями. Если возникнут дополнительные вопросы, всегда можно обратиться к сообществу пользователей Docker и WSL для получения помощи.

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

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