无法从Docker容器中连接到Postgres

时间:2020-02-22 18:25:54

标签: postgresql docker docker-compose apache-superset

我有一堆Docker容器(实际上是Apache Superset系统)。我使用docker-compose运行它们,就像这样:

$ docker-compose run

docker-compose.yml文件可以从官方的Apache Superset存储库中获取。问题是-我无法创建与运行dockerized Apache Superset的同一主机上运行的Postgresql数据库的新数据库连接。我可以从任何喜欢的地方连接到Postgresql。在主机上,我可以使用127.0.0.1地址和192.X.X.X地址从Python连接到它。但是Apache Superset容器无法建立与此Postgres实例的连接-我尝试了127.0.0.1和192.X.X.X-它们都无法正常工作。

当我进入超集Docker容器外壳时,我可以检查所有相关的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

因此,似乎我的超集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

因此,如果我没有记错的话,可以使用此IP地址-172.18.0.1来访问运行Postgres的主机地址。我用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

但是仍然无法使用此IP地址连接到Postgres。可能需要配置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。

这是我在Python shell的超集容器中尝试过的方法:

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()

我尝试了所有可能的IP: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?

其中X.X.X.X是192.168.234.137、127.0.0.1和172.18.0.1之一

2 个答案:

答案 0 :(得分:1)

在docker-compose.yml中放在任何图像配置指令之前:

networks:
    <network_name>:
        driver: bridge

然后将networks: <network_name>指令放在要在该网络上运行的任何映像中,如下所示:

superset-worker:
    networks: 
        - <network_name> 
    build: *superset-build

答案 1 :(得分:1)

在您的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'