我最近一直在玩 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 许可协议
TL;博士
172.17.0.0/16
作为 IP 地址范围,而不是172.17.0.0/32
。localhost
连接到主机上的 PostgreSQL 数据库,而是使用主机的 IP。为了保持容器的可移植性,使用--add-host=database:<host-ip>
标志启动容器,并使用database
作为连接 PostgreSQL 的主机名。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
时轻松看到:As you can see, in my case, the
docker0
interface has the IP address172.17.42.1
with a netmask of/16
(or255.255.0.0
) .这意味着网络地址是172.17.0.0/16
。IP地址是随机分配的,但没有任何额外的配置,它会一直在
172.17.0.0/16
网络中。对于每个 Docker 容器,将分配该范围内的随机地址。这意味着,如果您想授予所有可能的容器对数据库的访问权限,请使用
172.17.0.0/16
。