Контейнер 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. Как я мог это сделать?
Ответы
Ответ 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