我最近一直在使用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。希望这能帮助其他人解决这个问题!

其他回答

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

listen_addresses = 'localhost,172.17.0.1'

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

另一种解决方案是服务卷,您可以定义一个服务卷,并将主机的PostgreSQL Data目录挂载在该卷中。查看给定的合成文件以获得详细信息。

version: '2'
services:
  db:   
    image: postgres:9.6.1
    volumes:
      - "/var/lib/postgresql/data:/var/lib/postgresql/data" 
    ports:
      - "5432:5432"

通过这样做,另一个PostgreSQL服务将运行在容器下,但使用与主机PostgreSQL服务使用的相同的数据目录。

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

172.17.0.1  localhost

到 /etc/hosts

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

你可以在docker运行命令时通过——network=host来访问容器内的localhost。

Ex:

docker run --network=host docker-image-name:latest

如果你想传递环境变量与localhost使用——env-file参数来访问容器内的环境变量。

Ex:

docker run --network=host --env-file .env-file-name docker-image-name:latest

注意:在docker镜像名称之前传递参数,否则参数将无效。(我面对过这个问题,所以要小心!)

简单的解决方案

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