Docker中连接本地PostgreSQL数据库时,出现pgAdmin4连接被拒绝的问题。

11

我正在尝试使用pgAdmin4 Docker容器连接本地Postgres数据库。当我打开http://localhost:5050/并创建新的服务器连接后登录,我收到无法连接到服务器:无法连接到服务器:连接被拒绝错误消息。

这是我的docker-compose.yml文件

version: '3.5'

services:
  pgadmin:
    container_name: pgadmin4
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: db@db.com
      PGADMIN_DEFAULT_PASSWORD: odoo
    volumes:
       - pgadmin:/root/.pgadmin
    ports:
      - "5050:80"
    restart: unless-stopped

volumes:
    pgadmin:

enter image description here

我正在寻找将本地Postgres数据库与pgadmin4 Docker容器连接的解决方案。 我使用的操作系统是Ubuntu 20.04

---- 根据@Veikko的回答更新 -----------

这是我的docker-compose文件代码 https://pastebin.com/VmhZwtaL

以及这是postgresql.conf文件 https://pastebin.com/R7ifFrGR

pg_hba.conf文件 https://pastebin.com/yC2zCfBG


你的数据库在哪里运行,地址是什么?pgadmin不包含数据库进程... - Arik
本地5432端口运行着数据库。我想在pgadmin4中访问我的数据库。 - Jaykumar Patel
你在哪里运行数据库?在托管容器的机器上还是在另一个容器中? - Arik
本地系统上运行的数据库 - Jaykumar Patel
6个回答

5

您可以使用DNS名称host.docker.internal从Docker容器中访问主机。在服务器连接中,将localhost替换为此名称。在pgAdmin中,localhost表示Docker容器本身,而不是主机。


是的,我尝试了,但仍然无法连接。 - Jaykumar Patel
感谢您更新了带有操作系统信息的问题。在Ubuntu/Linux版本的Docker中,host.docker.internal尚未得到支持。这适用于Docker for Mac/Windows 18.03版本及以上。我稍后会发布一个兼容Linux的答案作为单独的回答。 - Veikko
名称无法解析 - 对我来说是一个错误... - Pfinnn

2
您可以使用镜像qoomon/docker-host来访问主机上的服务。像这样将docker-host服务添加到您的docker-compose中:
version: '3.5'

services:
  docker-host:
      image: qoomon/docker-host
      cap_add: [ 'NET_ADMIN', 'NET_RAW' ]
      restart: on-failure
  pgadmin:
    container_name: pgadmin4
    image: dpage/pgadmin4
    environment:
...

在此之后,您应该能够通过主机名 docker-host 访问您的主机 Postgres 服务。请将连接字符串中的 localhost 替换为 docker-host,连接应该可以正常工作。
如果连接出现问题,请确保您没有任何防火墙阻止流量,您已经正确设置了 Docker 网络(请参阅文档),并且您的 postgresql 正在侦听此地址。
Ubuntu/Linux 版本的 Docker 目前不支持 host.docker.internal DNS 名称,该名称将容器指向主机。这是在 Docker for Mac 或 Windows 中链接到主机的最简单方法。我希望我们很快也能在 Linux 上实现这一点。
有关 docker-host 的更多信息可以在 Github 存储库中找到:https://github.com/qoomon/docker-host

嗨@Veikko,谢谢你的回答。我按照你的答案尝试了一下,但是出现了这个错误https://ibb.co/Kqq9X1T。这是我的docker-compose文件代码https://pastebin.com/VmhZwtaL,这里是我分享的postgresql.conf内容https://pastebin.com/R7ifFrGR和pg_hba.conf文件内容https://pastebin.com/yC2zCfBG。 - Jaykumar Patel
屏幕截图中的pgadmin主机名是仅适用于win/mac的dns名称('host.docker.internal')。请在pgadmin字段“主机名/地址”中使用名称“docker-host”。它指的是在docker-compose.yaml中指定的qoomon:docker-host容器的服务名称。 - Veikko
请问在“主机名/地址”字段中应输入什么? - Jaykumar Patel
在主机名/地址中使用“docker-host”。 - Veikko
仍然无法工作,无法连接到服务器:无法连接到服务器:连接被拒绝 服务器是否在主机“docker-host”(172.29.0.2)上运行,并接受端口5432上的TCP/IP连接? - Jaykumar Patel
你能否在没有Docker的情况下从你的主机本地连接到地址为172.29.0.2的pg数据库?你的pg_hba.conf配置似乎只允许本地连接(127.0.0.1)。 - Veikko

1

我之前有一些问题,现在已经找到了解决方案。

只需要输入这个命令。

docker exec <container_name> cat /etc/hosts

然后它会显示这个。
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.3      607b00c25f29

使用 172.18.0.3 作为您的主机名。

希望这能帮到您。


很高兴听到这个消息,不用客气。 - Abu Abdirohman

0
首先运行此命令:sudo netstat -nplt,确保有人正在监听端口5432。 然后调用sudo ip addr来了解主机的IP地址。 然后尝试使用真实IP而不是localhost进行连接。 我在您的ip addr输出中看到:

3:wlp3s0:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link / ether 30:10:b3:e4:39:e2 brd ff:ff:ff:ff:ff:ff inet 192.168.43.190/24 brd 192.168.43.255 scope global dynamic noprefixroute wlp3s0

因此您的真实IP地址是192.168.43.190。

请问我应该在哪里找到真实的IP地址?我已经尝试了两个命令,以下是它们的输出 https://pastebin.com/v91294x0 等待您的回复,谢谢。 - Jaykumar Patel

0

不是这样的。我必须使用Docker pgAdmin4连接本地Postgres数据库。 - Jaykumar Patel
它对我来说有效,我在Ubuntu 20.04上使用它-PostgreSQL-12和PgAdmin4.23(Docker)。 - Thirumal
谢谢您的回复。您能否在这里更新一下您所遵循的步骤。谢谢。 - Jaykumar Patel
我在 https://github.com/M-Thirumal/installation_guide/blob/master/pgadmin4/install_pgadmin4_using_docker.md && https://github.com/M-Thirumal/installation_guide/blob/master/PostgreSQL/Install_PostgresQL_in_Ubuntu.md && https://github.com/M-Thirumal/installation_guide/blob/master/pgadmin4/Reverse_Proxying_with_ngnix.md 上有个人文档。 - Thirumal

0

你可以尝试在你的pg_hba.conf文件中添加

host    all             all             0.0.0.0/0            trust

或者

host    all             all             0.0.0.0/0            md5

测试。

如果这个有效,你应该将0.0.0.0/0的掩码更改为你的docker bright掩码。然后再次检查。顺便说一下,要连接到本地主机,你需要连接到我的docker bright ip,对我来说是172.17.0.1/32

编辑: 第二:postgresql.conf

取消注释并阅读所写内容:

listen_addresses = '*'     # what IP address(es) to listen on;
                    # comma-separated list of addresses;
                    # defaults to 'localhost'; use '*' for all
                    # (change requires restart)

你需要绑定到可以从Docker连接的IP地址,所以在我的情况下应该是172.17.0.1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接