Разрешить контейнер Docker для подключения к локальной/хост базы данных Postgres
Я недавно играл с Docker и QGIS и установил контейнер, следуя инструкциям в в этом уроке.
все работает отлично, хотя я не могу подключиться к базе данных localhost postgres, которая содержит все мои данные ГИС. Я полагаю, это связано с тем, что моя база данных postgres не настроена для приема удаленных подключений и редактировала файлы Postgres conf, чтобы разрешить удаленные подключения с помощью инструкций в в этой статье.
Я все еще получаю сообщение об ошибке при попытке подключиться к моей базе данных под управлением 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
6 ответов:
TL; DR
- использовать
172.17.0.0/16как диапазон IP-адресов, а не172.17.0.0/32.- не используйте
localhostдля подключения к базе данных PostgreSQL на вашем Хосте, но вместо этого IP-адрес хоста. Чтобы контейнер оставался портативным, запустите его с помощью--add-host=database:<host-ip>флаг и использоватьdatabaseкак имя хоста для подключения к PostgreSQL.- убедитесь, что PostreSQL настроен для прослушивания соединений на всех IP-адресах, а не только на
localhost. Обратите внимание на параметрlisten_addressesin Файл конфигурации PostgreSQL, как правило, находится в/etc/postgresql/9.3/main/postgresql.conf(кредиты @DazmoNorton).текст
172.17.0.0/32- это не ряд IP-адресов, но один адрес (namly172.17.0.0). Ни один контейнер Docker никогда не получит этот адрес, потому что это сетевой адрес моста Docker (docker0интерфейс).при запуске Docker он создаст новый сетевой интерфейс моста, который вы можете легко увидеть, когда звоню
ip a:$ ip a ... 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 valid_lft forever preferred_lft foreverкак вы можете видеть, в моем случае,
docker0интерфейс имеет IP-адрес172.17.42.1С маской/16(или255.255.0.0). Это означает, что сетевой адрес172.17.0.0/16.IP-адрес присваивается случайным образом, но без каких-либо дополнительных настроек, он всегда будет в
172.17.0.0/16сеть. Для каждого контейнера Docker будет назначен случайный адрес из этого диапазона.это означает, если вы хотите предоставить доступ из всех возможных контейнеров к вашей базе данных, используйте
172.17.0.0/16.
Docker для Mac solution
17.06 и далее
благодаря комментарию @Birchlabs, теперь это намного проще с этим специальное DNS-имя только для Mac доступно:
docker run -e DB_PORT=5432 -e DB_HOST=docker.for.mac.host.internalот 17.12.0-cd-mac46,
docker.for.mac.host.internalвместоdocker.for.mac.localhost. Смотрите версии для сведения.старая версия
ответ@helmbert хорошо объясняет проблему. Но Докер для Mac не подвергайте Мостовая сеть, поэтому мне пришлось сделать этот трюк, чтобы обойти ограничение:
$ sudo ifconfig lo0 alias 10.200.10.1/24открыть
/usr/local/var/postgres/pg_hba.confи добавить эту строку:host all all 10.200.10.1/24 trustоткрыть
/usr/local/var/postgres/postgresql.confредактировать и изменятьlisten_addresses:listen_addresses = '*'перезагрузите сервис и запустите свой контейнер:
$ PGDATA=/usr/local/var/postgres pg_ctl reload $ docker run -e DB_PORT=5432 -e DB_HOST=10.200.10.1 my_appто, что делает этот обходной путь, в основном совпадает с ответом @helmbert, но использует IP-адрес, который прикреплен к
lo0вместоdocker0сетевой интерфейс.
простое решение для mac:
самая новая версия docker (18.03) предлагает встроенное решение для переадресации портов. Внутри вашего контейнера docker просто установите хост db в
host.docker.internal. Это будет перенаправлено на хост, на котором работает контейнер docker.документация для этого здесь: https://docs.docker.com/docker-for-mac/networking/#per-container-ip-addressing-is-not-possible
еще одна вещь, необходимая для моей установки, - это добавить
172.17.0.1 localhostдо
/etc/hostsТак что докер будет указывать
172.17.0.1как имя хоста БД, и не полагаться на изменение внешнего ip, чтобы найти БД. Надеюсь, это поможет кому-то еще с этой проблемой!
В Ubuntu:
сначала вы должны проверить, что порт базы данных Docker доступен в вашей системе, выполнив команду -
sudo iptables -L -nпример вывода:
Chain DOCKER (1 references) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:3306 ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:22здесь
3306используется в качестве порта базы данных Docker на 172.17.0.2 IP, если этот порт недоступен выполните следующую команду -sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPTтеперь вы можете легко получить доступ к базе данных Docker из вашей локальной системы, выполнив следующие действия конфигурация
host: 172.17.0.2 adapter: mysql database: DATABASE_NAME port: 3307 username: DATABASE_USER password: DATABASE_PASSWORD encoding: utf8В CentOS:
сначала вы должны проверить, что порт базы данных Docker доступен в вашем брандмауэре, выполнив команду -
sudo firewall-cmd --list-allпример вывода:
target: default icmp-block-inversion: no interfaces: eno79841677 sources: services: dhcpv6-client ssh **ports: 3307/tcp** protocols: masquerade: no forward-ports: sourceports: icmp-blocks: rich rules:здесь
3307используется в качестве порта базы данных Docker на 172.17.0.2 IP, если этот порт недоступен выполните следующую команду -sudo firewall-cmd --zone=public --add-port=3307/tcp sudo firewall-cmd --reloadтеперь вы можете легко получить доступ к базе Docker из вашей локальной системы с помощью выше конфигурация.
другое решение-это сервисный том, вы можете определить сервисный том и смонтировать каталог данных PostgreSQL хоста в этом томе. Проверьте данный файл compose для получения дополнительной информации.
version: '2' services: db: image: postgres:9.6.1 volumes: - "/var/lib/postgresql/data:/var/lib/postgresql/data" ports: - "5432:5432"при этом другая служба PostgreSQL будет работать в контейнере, но использует тот же каталог данных, который использует Служба PostgreSQL.