允许 docker 容器连接到本地/主机 postgres 数据库

新手上路,请多包涵

我最近一直在玩 Docker 和 QGIS,并按照 本教程 中的说明安装了一个容器。

一切都很好,尽管我无法连接到包含我所有 GIS 数据的本地主机 postgres 数据库。我认为这是因为我的 postgres 数据库未配置为接受远程连接,并且一直在编辑 postgres conf 文件以允许使用 本文 中的说明进行远程连接。

当我尝试连接到在 Docker 中运行 QGIS 的数据库时仍然收到错误消息:无法连接到服务器: 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) 的连接。我之前使用 docker ps 查询了 docker 容器的 IP 地址,虽然 IP 地址发生了变化,但到目前为止它一直在 172.17.0.x 范围内

任何想法为什么我无法连接到这个数据库?我想可能是非常简单的事情!

我正在运行 Ubuntu 14.04; Postgres 9.3

原文由 marty_c 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

TL;博士

  1. 使用 172.17.0.0/16 作为 IP 地址范围,而不是 172.17.0.0/32
  2. 不要使用 localhost 连接到主机上的 PostgreSQL 数据库,而是使用主机的 IP。为了保持容器的可移植性,使用 --add-host=database:<host-ip> 标志启动容器,并使用 database 作为连接 PostgreSQL 的主机名。
  3. 确保将 PostgreSQL 配置为侦听所有 IP 地址上的连接,而不仅仅是 localhost 上的连接。在 PostgreSQL 的配置文件中查找设置 listen_addresses ,通常在 /etc/postgresql/9.3/main/postgresql.conf 中找到(归功于@DazmoNorton)。

长版

172.17.0.0/32 不是 IP 地址 _范围_,而是单个地址(即 172.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

As you can see, in my case, the docker0 interface has the IP address 172.17.42.1 with a netmask of /16 (or 255.255.0.0 ) .这意味着网络地址是 172.17.0.0/16

IP地址是随机分配的,但没有任何额外的配置,它会一直在 172.17.0.0/16 网络中。对于每个 Docker 容器,将分配该范围内的随机地址。

这意味着,如果您想授予所有可能的容器对数据库的访问权限,请使用 172.17.0.0/16

原文由 helmbert 发布,翻译遵循 CC BY-SA 4.0 许可协议

简单的解决方案

最新版本的 docker (18.03) 提供了内置的端口转发解决方案。在您的 docker 容器中,只需将 db 主机设置为 host.docker.internal 。这将被转发到运行 docker 容器的主机。

这方面的文档在这里: https ://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host

原文由 Chris 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题