Подтвердить что ты не робот

Контейнер Docker для Postgres 9.1, не отображающий порт 5432 для размещения

Я пытаюсь использовать контейнер Docker для запуска сервера PostgreSQL и подключаюсь к нему с моей главной машины.

Моя конфигурация:

  • Хост-компьютер: Mac OS X 10.10.5
  • Докер 1.10.1

Я сделал это:

Шаг 1: создайте том для постоянных данных postgres

docker volume create --name postgres_data

Шаг 2: запустите экземпляр postgres

UPDATE. Как было предложено в комментариях, я задал сопоставление портов при запуске контейнера

docker run --name my_postgres_container -e POSTGRES_PASSWORD=my_password -v postgres_data:/var/lib/postgresql/data -p 5432:5432 -d postgres:9.1

Шаг 3: подключитесь к экземпляру Docker, выполнив следующее:

docker run -it --link my_postgres_container:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

Но я хочу подключиться к этому экземпляру, просто:

psql -h localhost -p 5432 -U postgres

Как если бы я установил Postgres локально на моем хост-компьютере.

Проблема: порт 5432 не отображается. Поэтому я не могу связаться с ним:

sudo lsof -i -P | grep -i "listen" → нет порта 5432 открыть

ОБНОВЛЕНИЕ 2: Еще незнакомец. Я также сделал это:

Остановить докер. Затем запустите обычный экземпляр PostgreSQL 9.4.4 на моем хост-компьютере (здесь не задействован докер), только postgres работает на моем хосте Mac OS X, прослушивая порт 5432). Все нормально:

sudo lsof -i -P | grep -i "postgres"

postgres  14100          jorge    6u  IPv4 0x780274158cebef01      0t0  TCP localhost:5432 (LISTEN)

Я могу подключиться к моему локальному экземпляру postgres без каких-либо проблем (посмотрите вывод команды: это postgres, скомпилированный для Mac OS X, мой хост):

psql -h localhost -U postgres -c "select version()"
                                                                version
---------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.4.4 on x86_64-apple-darwin14.3.0, compiled by Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn), 64-bit
(1 row)

Теперь самое интересное. Я снова запускаю экземпляр Docker, , в то время как экземпляр Host PostgreSQL запущен.

Это начинается! (и это не должно). Я могу даже подключиться с помощью запуска докеров...

docker run -it --link my_postgres_instance:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

Если я запустил select version(), , он показывает postgres, запущенный внутри моего экземпляра docker, в то же время postgres запускается на моем хосте из докера, используя тот же самый порт 5432. (Посмотрите на выход, постгр, скомпилированный для Debian, OS внутри postgres: контейнер 9.1)

postgres=# select version();
                                            version
------------------------------------------------------------------------------------------------
 PostgreSQL 9.1.20 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit
(1 row)

Почему?

Имеет ли смысл? Моя конечная цель - запустить приложение Django в другом контейнере Docker и подключиться к моему экземпляру Postgres. Как я мог это сделать?

4b9b3361

Ответ 1

Это 2018 год и у меня просто была похожая проблема. Решение для меня, казалось, было с заказом реквизита к докеру. например, это привело к тому, что порт не был открыт;

docker run -d --name posttest postgres:alpine -e POSTGRES_PASSWORD=fred -p 5432:5432

в то время как это работало хорошо (изображение выставило порт 5432 как ожидалось);

docker run --name posttest -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:alpine

Ответ 2

Запустите образ postgre с правильным отображением портов с помощью -p <host_port>:<container_port>:

docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1

Ответ 3

Ваш хост-докер - это виртуальная машина, у которой есть собственные IP-адреса. Вы можете определить этот IP-адрес, введя следующую команду:

docker-machine ip

Ответ будет похож на 192.168.99.100

Когда вы сопоставили порты с помощью переключателя -p 5432: 5432, вы сможете подключиться к postgres с помощью любого инструмента с вашего компьютера-разработчика, используя указанный IP-адрес.

Ответ 4

У меня была похожая проблема. Моя проблема была просто 0.0.0.0 не сопоставления с localhost, поэтому мне просто нужно было добавить в PSQL

psql --host=0.0.0.0

Это предполагает

docker port <container name>

выходы

5432/tcp -> 0.0.0.0:5432

Ответ 5

Я смог подключиться, используя IP-адрес контейнера или IP-адрес хоста, кроме localhost (127.0.0.1).

Чтобы получить идентификатор контейнера, запустите

docker ps

Найти нужный идентификатор контейнера и запустить

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id>

Порт должен быть открыт.

Вот пример docker-compose.yml, который запускает два контейнера postgres и adminer, который является инструментом управления базой данных, который вы можете использовать для подключения к postgres:

version: '3'
services:
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
  postgres:
    image: postgres:11.4-alpine
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres