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

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

I'm still getting an error message when I try and connect to my database running QGIS in Docker: could not connect to server: Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433? The postgres server is running, and I've edited my pg_hba.conf file to allow connections from a range of IP addresses (172.17.0.0/32). I had previously queried the IP address of the docker container using docker ps and although the IP address changes, it has so far always been in the range 172.17.0.x

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

我运行的是Ubuntu 14.04;Postgres 9.3


当前回答

我的设置还需要添加一个东西

172.17.0.1  localhost

到 /etc/hosts

这样Docker就会指向172.17.0.1作为数据库主机名,而不是依赖于改变外部ip来找到DB。希望这能帮助其他人解决这个问题!

其他回答

简单的解决方案

只需在docker run中添加——network=host。这是所有!

这样容器将使用主机的网络,因此localhost和127.0.0.1将指向主机(默认情况下它们指向容器)。例子:

docker run -d --network=host \
  -e "DB_DBNAME=your_db" \
  -e "DB_PORT=5432" \
  -e "DB_USER=your_db_user" \
  -e "DB_PASS=your_db_password" \
  -e "DB_HOST=127.0.0.1" \
  --name foobar foo/bar

我的设置还需要添加一个东西

172.17.0.1  localhost

到 /etc/hosts

这样Docker就会指向172.17.0.1作为数据库主机名,而不是依赖于改变外部ip来找到DB。希望这能帮助其他人解决这个问题!

3步解决方案

1. 更新docker-compose文件

首先,由于数据库是本地的,我们需要通过向容器服务添加以下配置来将主机网络绑定到容器

services:
    ...
    my-web-app:
        ...
        extra_hosts:
          -  "host.docker.internal:host-gateway"
        ...
    ...

2. 更新/etc/postgresql/12/main/pg_hba.conf

如果这个目录下不存在这个文件,使用find / -name 'pg_hba.conf'来找到它。

在注释标签# IPv4本地连接下添加以下一行:

host    all             all             172.17.0.1/16           md5

3.更新/etc/postgresql/12/main/postgresql.conf

如果这个目录下不存在这个文件,使用find / -name 'postgresql.conf'找到它。

找到下面的行(这行可能有注释)

#listen_addresses = 'localhost'

并将其更改为以下一行,以便能够从localhost和172.17.0.1连接到postgres

listen_addresses = 'localhost,172.17.0.1'

您还可以将其更改为如下所示,但不建议在生产环境中这样做,因为它将向世界公开数据库(意味着任何IP地址都可以连接到数据库)

listen_addresses = '*'

最后别忘了:

使用sudo systemctl Restart postgresql重新启动postgress服务 将连接字符串host更新为host.docker.internal

您可以添加多个监听地址,以提高安全性。

listen_addresses = 'localhost,172.17.0.1'

添加listen_addresses = '*'不是一个好的选择,这是非常危险的,并且会将你的postgresql数据库暴露在蛮荒的西部。

为了建立一个简单的Postgresql连接,从docker容器到我的本地主机,我在Postgresql .conf中使用了这个:

listen_addresses = '*'

并添加了这个pg_hba.conf:

host    all             all             172.17.0.0/16           password

然后重新启动。我的客户端从docker容器(在172.17.0.2)可以连接到Postgresql运行在我的本地主机使用host:密码,数据库,用户名和密码。