簡體   English   中英

無法從 Docker 容器內部連接到 Postgres

[英]Unable to connect to Postgres from inside Docker container

我有一堆 Docker 容器(實際上是Apache Superset系統)。 我使用 docker-compose 運行它們,如下所示:

$ docker-compose run

docker-compose.yml文件可以從官方 Apache Superset 倉庫中獲取。 問題是 - 我無法創建新的數據庫連接到我的 Postgresql 數據庫,該數據庫運行在運行 dockerized Apache Superset 的同一主機上。 我可以從任何我喜歡的地方連接到 Postgresql。 在主機上,我可以使用 127.0.0.1 地址和 192.XXX 地址從 Python 連接到它。 但是 Apache Superset 容器無法建立與此 Postgres 實例的連接 - 我嘗試了 127.0.0.1 和 192.XXX - 但它們都無法正常工作。

當我進入超集 Docker 容器 shell 時,我可以查看所有相關的 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

所以,如果我沒記錯的話,我的運行 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

但是我仍然無法使用這個 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 = '*'

可能,我仍然缺少一些東西。 我該如何解決?

附言。

這是我在 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()

我嘗試了所有可能的 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 之一

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

networks:
    <network_name>:
        driver: bridge

然后將networks: .network_name>指令放在任何你想在 this.network 上運行它的圖像中,如下所示:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM