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

问题描述

TL;博士

  1. 用作172.17.0.0/16IP 地址范围,而不是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 地址 范围 ,而是单个地址(namly 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

如您所见,在我的例子中,docker0接口的 IP 地址172.17.42.1带有/16(或255.255.0.0)的网络掩码。这意味着网络地址是172.17.0.0/16

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

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

解决方法

我最近一直在玩 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 容器docker ps的 IP 地址,虽然 IP 地址发生了变化,但到目前为止它一直在
172.17.0.x 范围内

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

我正在运行 Ubuntu 14.04;Postgres 9.3