#postgresql #docker #docker-compose
#postgresql #докер #docker-compose
Вопрос:
У меня возникли некоторые проблемы с настройкой базы данных PostgreSQL в контейнере Docker. Моя главная проблема в том, что я хочу получить к ней прямой доступ со своего хоста.
Моя конфигурация контейнера выглядит следующим образом:
version: '3'
services:
db:
image: postgres:10.4
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
- ./var/docker/db/pg_hba.conf:/var/lib/postgresql/data/pg_hba.conf
volumes:
pgdata:
Мой pg_hba.conf
файл является файлом по умолчанию, с двумя дополнительными добавленными строками:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
########### LINE ADDED ###########
host all all 0.0.0.0/0 md5
host all all 127.0.0.1/32 trust
# IPv6 local connections:
########### LINE ADDED ###########
host all all ::/0 md5
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
Когда я пытаюсь подключиться к своему контейнеру, я сталкиваюсь со следующей ошибкой:
psql --host=127.0.0.1
psql: could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 5432?
Сначала я проверил, что порты правильно перенаправлены в моем контейнере Docker:
docker ps
IMAGE COMMAND STATUS PORTS NAMES
postgres:10.4 "docker-entrypoint.s…" Up 6 seconds 0.0.0.0:5432->5432/tcp db_1
Затем я проверил, что PSQL работает правильно, выполнив в контейнере следующее:
netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.11:42293 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp6 0 0 :::5432 :::* LISTEN -
Из того, что я понимаю:
- Сервер прослушивает все запросы, сделанные на порт 5432, со всех хостов.
- Контейнер перенаправляет весь трафик с хост-порта 5432 на контейнерный порт 5432,
- PSQL запрашивает пароль для всех нелокальных хостов (две строки, которые я добавил
pg_hba.conf
)
Чего мне не хватает? Есть ли что-нибудь еще, что я могу проверить для отладки моей проблемы?
Комментарии:
1. Можете ли вы получить TCP-соединение с telnet? Запустите
telnet localhost 5432
и посмотрите, подключается ли он.2. Похоже, я могу: пытаюсь 127.0.0.1… Подключен к localhost. Escape-символ — ‘^]’.
3. Хорошо, это странный случай… Это не проблема с сетью, так как вы можете установить TCP-соединение. Может быть, есть другое приложение, прослушивающее этот порт? Запустите
ss -tulpen | grep 5432
и посмотрите, что есть в строкеusers:(("dockerd"
.4. У меня есть «*: 5432», прослушивающий TCP, с *: * одноранговым узлом. Пока не уверен, что понимаю процесс: «ino:959086 sk: 1c v6only:0 <->». Это нормально?
5. Вам нужно запустить его с
sudo
помощью, извините, забыл упомянуть, что
Ответ №1:
Хорошо… Это один из самых неприятных моментов для разработчиков… После дальнейшего изучения этого с @toydarian (огромное спасибо за ваше время!), Я, наконец, заметил, что это связано с псевдонимом, который я установил давным-давно:
псевдоним psql=»docker run -ti —rm postgres: 10.4 psql»
Это объясняет, почему это не сработало. Давайте посмотрим на светлую сторону: я много узнал о конфигурации PSQL! 🙂
Комментарии:
1. Ого! Это все объясняет … : D Рад, что вы это поняли! 🙂