问题描述
TL;博士
- 用作
172.17.0.0/16
IP 地址范围,而不是172.17.0.0/32
. - 不要使用
localhost
连接到主机上的 Postgresql 数据库,而是使用主机的 IP。为了保持容器的可移植性,使用--add-host=database:<host-ip>
标志启动容器并database
用作连接到 Postgresql 的主机名。 - 确保将 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