Подключение к PSQL dockerized DB с хоста

#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 Рад, что вы это поняли! 🙂