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