Недавно я играл с Docker и QGIS и установил контейнер, следуя инструкциям в этом руководстве .
Все отлично работает, хотя я не могу подключиться к локальной базе данных postgres, которая содержит все мои ГИС-данные. Я полагаю, это потому, что моя база данных postgres не настроена на прием удаленных подключений и редактирует файлы conf postgres для разрешения удаленных подключений, используя инструкции в этой статьи .
Я все еще получаю сообщение об ошибке, когда пытаюсь подключиться к своей базе данных, работающей с QGIS в Docker: не могу подключиться к серверу: Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
сервер postgres работает, и я отредактировал свой файл pg_hba.conf, чтобы разрешить подключения из диапазона IP-адреса (172.17.0.0/32). Ранее я запрашивал IP-адрес контейнера Docker, используя его, docker ps
и хотя IP-адрес изменяется, он до сих пор всегда находился в диапазоне 172.17.0.x
Есть идеи, почему я не могу подключиться к этой базе данных? Наверное, что-то очень простое я представляю!
Я использую Ubuntu 14.04; Postgres 9,3
источник
pg_hba.conf
адрес на предложенный вами, но все равно получаю то же сообщение об ошибке подключения после остановки и перезапуска службы postgres. Я добавил строку под своими соединениями ipv4 - где-то еще я должен добавить адрес, который вы предлагаете? Или в моем приложении QGIS, работающем в Docker, мне нужно изменить информацию о соединении postgres? Например, если я подключаюсь из контейнера докера, хост все еще является «локальным»?localhost
это не хост-система внутри вашего контейнера Docker. Попробуйте подключиться к общедоступному IP-адресу хост-системы. Чтобы сохранить контейнер переносимым, вы также можете запустить контейнер с--add-host=database:<host-ip>
и просто использовать вdatabase
качестве имени хоста для подключения к вашему хосту PostgreSQL из контейнера Docker./etc/postgresql/9.3/main/postgresql.conf
и добавитьeth0
IP-адрес моего сервера вlisten_addresses
. По умолчаниюlisten_addresses
postgres имеет привязкуlocalhost
только к.host-ip
- это IP-адрес виртуальной машины или контейнера Docker ?Решение Docker для Mac
17.06 года
Благодаря комментарию @Birchlabs, теперь это специальное DNS-имя доступно только для Mac :
Начиная с 17.12.0-cd-mac46,
docker.for.mac.host.internal
следует использовать вместоdocker.for.mac.localhost
. См. Примечание к выпуску для деталей.Старая версия
Ответ @ helmbert хорошо объясняет проблему. Но Docker для Mac не предоставляет мостовую сеть , поэтому мне пришлось сделать этот трюк, чтобы обойти ограничение:
Откройте
/usr/local/var/postgres/pg_hba.conf
и добавьте эту строку:Открыть
/usr/local/var/postgres/postgresql.conf
и редактировать измененияlisten_addresses
:Перезагрузите сервис и запустите свой контейнер:
Этот обходной путь в основном совпадает с ответом @ helmbert, но
lo0
вместоdocker0
сетевого интерфейса используется IP-адрес, к которому он привязан .источник
docker.for.mac.localhost
. это IP вашего хост-компьютера. ищите его запись в базе данных хоста контейнера следующим образом:docker run alpine /bin/sh -c 'getent hosts docker.for.mac.localhost'
host.docker.internal
с 18.03, другие опции все еще доступны, но устарели ( Источник ).Простое решение для Mac:
Новейшая версия Docker (18.03) предлагает встроенное решение для переадресации портов. Внутри вашего docker-контейнера просто установите для хоста db значение
host.docker.internal
. Это будет перенаправлено на хост, на котором работает контейнер докеров.Документация для этого здесь: https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host
источник
host.docker.internal
ограничивается только Маков?Простое решение
Просто добавь
--network=host
вdocker run
. Вот и все!Таким образом, контейнер будет использовать сеть хоста, поэтому
localhost
и127.0.0.1
будет указывать на хост (по умолчанию они указывают на контейнер). Пример:источник
В Ubuntu:
Сначала вы должны убедиться, что порт базы данных Docker доступен в вашей системе, выполнив следующую команду:
Образец ВЫХОДА:
Здесь
3306
используется как порт базы данных Docker на 172.17.0.2 IP, если этот порт недоступен, выполните следующую команду -Теперь вы можете легко получить доступ к базе данных Docker из вашей локальной системы, следуя конфигурации
В CentOS:
Сначала вы должны проверить, доступен ли порт базы данных Docker в вашем брандмауэре, выполнив следующую команду -
Образец ВЫХОДА:
Здесь
3307
используется как порт базы данных Docker на 172.17.0.2 IP, если этот порт недоступен, выполните следующую команду -На сервере Вы можете добавить порт навсегда
Теперь вы можете легко получить доступ к базе данных Docker из вашей локальной системы с помощью вышеуказанной конфигурации.
источник
Размещенное здесь решение не работает для меня. Поэтому я публикую этот ответ, чтобы помочь кому-то, сталкивающемуся с подобной проблемой.
ОС: Ubuntu 18
PostgreSQL: 9.5 (Размещено на Ubuntu)
Docker: Серверное приложение (которое подключается к PostgreSQL)
Я использую docker-compose.yml для сборки приложения.
ШАГ 1: Пожалуйста, добавьте
host.docker.internal:<docker0 IP>
Чтобы найти IP-адрес докера,
i.e. 172.17.0.1 (in my case)
вы можете использовать:ИЛИ
ШАГ 2. В postgresql.conf измените адрес прослушивания на
listen_addresses = '*'
ШАГ 3: В pg_hba.conf добавьте эту строку
ШАГ 4: Теперь перезапустите сервис postgresql, используя
sudo service postgresql restart
ШАГ 5: Пожалуйста, используйте
host.docker.internal
имя хоста для подключения базы данных из серверного приложения.Пример:
jdbc:postgresql://host.docker.internal:5432/bankDB
Наслаждаться!!
источник
для docker-compose вы можете попробовать просто добавить
пример :
https://docs.docker.com/compose/compose-file/#network_mode
источник
Чтобы настроить что-то простое, позволяющее соединение Postgresql из контейнера Docker с моим локальным хостом, я использовал это в postgresql.conf:
И добавил этот pg_hba.conf:
Затем выполните перезагрузку. Мой клиент из контейнера Docker (который был на 172.17.0.2) мог затем подключиться к Postgresql, работающему на моем локальном хосте, используя host: пароль, базу данных, имя пользователя и пароль.
источник
Еще одна вещь, необходимая для моей настройки, было добавить
в
/etc/hosts
так что Docker будет указывать в
172.17.0.1
качестве имени хоста БД, а не полагаться на изменение внешнего ip для поиска БД. Надеюсь, что это поможет кому-то еще в этом вопросе!источник
database
хост--add-host=database:172.17.0.1
при запуске контейнера. Затем укажите ваше приложение на этот хост. Это позволяет избежать жесткого кодирования IP-адреса внутри контейнера.--add-host=database:172.17.0.1
предпочтительноДругое решение - это сервисный том. Вы можете определить сервисный том и смонтировать каталог данных PostgreSQL на этом томе. Проверьте данный составной файл для деталей.
При этом другая служба PostgreSQL будет работать в контейнере, но будет использовать тот же каталог данных, который использует служба PostgreSQL.
источник