Невозможно подключиться к Postgres изнутри Docker контейнера - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть куча Docker контейнеров (на самом деле это Apache Superset system). Я запускаю их, используя docker -compose, например так:

$ docker-compose run

Файл docker -compose.yml можно взять из официального Apache Superset repo. Проблема в том, что я не могу создать новое соединение с базой данных для своей базы данных Postgresql, работающей на том же хосте, где работает dockerized Apache Superset. Я могу подключиться к Postgresql откуда угодно. На хост-компьютере я могу подключиться к нему с Python, используя как адрес 127.0.0.1, так и адрес 192.XXX. Но Apache Контейнер Superset не может установить sh соединение с этими Postgres экземплярами - я пробовал оба 127.0.0.1 и 192.XXX - и они оба не работают.

Когда я вхожу в суперсет * Контейнер 1050 *, я могу проверить все соответствующие IP-адреса:

superset@2cf0e6dde567:/app$ ip addr show eth0
48: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:06 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.6/16 brd 172.18.255.255 scope global eth0
   valid_lft forever preferred_lft forever

Итак, похоже, что мой контейнер superset Docker имеет адрес 172.18.0.6. Я также проверяю это:

superset@2cf0e6dde567:/app$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.18.0.1      0.0.0.0         UG    0      0        0 eth0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

Итак, если я не ошибаюсь, мой адрес хоста, на котором работает Postgres, может быть достигнут по этому IP-адресу - 172.18.0.1. Я проверяю это с помощью ping и вижу, что все в порядке:

$ ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.103 ms
64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=0.063 ms

Но все равно я не могу подключиться к Postgres, используя этот IP-адрес. Наверное, мне нужно самому настроить Postgresql, но я не знаю как. Мой pg_hba.conf выглядит так:

local   all             all                                     peer
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 ident
host    all             all             0.0.0.0/0               md5

А мой postgresql .conf содержит:

listen_addresses = '*'

Возможно, я все еще что-то упускаю. Как я могу это исправить?

PS.

Это то, что я пробовал в контейнере superset в Python оболочке:

import psycopg2
import sqlalchemy as db

#engine = db.create_engine('postgresql://postgres:postgres@192.168.234.137:5433/test')
#engine = db.create_engine('postgresql://postgres:postgres@127.0.0.1:5433/test')
engine = db.create_engine('postgresql://postgres:postgres@172.18.0.1:5433/test')
cnx = engine.connect()

Я попробовал все возможные ips: 192.168 .234.137 (ip хост-машины), 127.0.0.1 и 172.18.0.1. Ни один из них не работает. Я просто получаю сообщение об ошибке от Python:

No route to host
    Is the server running on host "X.X.X.X" and accepting
    TCP/IP connections on port 5433?

, где XXXX - один из 192.168.234.137, 127.0.0.1 и 172.18.0.1

Ответы [ 2 ]

1 голос
/ 19 марта 2020

В вашем docker -compose.yml добавьте поле «extra_hosts», например:

version: "3.7"
  services:
    backend:
      build: .
      ports:
        - 8080:8080
      extra_hosts:
        - "pghost:172.18.0.1"

, и в своем коде вы должны использовать «pghost» для подключения вашего postgresql сервера следующим образом:

engine = db.create_engine('postgresql://postgres:postgres@pghost:5433/test'
1 голос
/ 22 февраля 2020

в docker -compose.yml ставить перед любой инструкцией по настройке образа:

networks:
    <network_name>:
        driver: bridge

, затем помещать networks: <network_name> инструкцию в любой образ, который вы хотите запустить в этой сети, например:

superset-worker:
    networks: 
        - <network_name> 
    build: *superset-build
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...