我最近一直在使用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


当前回答

简单的解决方案

只需在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

其他回答

博士TL;

Use 172.17.0.0/16 as IP address range, not 172.17.0.0/32. Don't use localhost to connect to the PostgreSQL database on your host, but the host's IP instead. To keep the container portable, start the container with the --add-host=database:<host-ip> flag and use database as hostname for connecting to PostgreSQL. Make sure PostgreSQL is configured to listen for connections on all IP addresses, not just on localhost. Look for the setting listen_addresses in PostgreSQL's configuration file, typically found in /etc/postgresql/9.3/main/postgresql.conf (credits to @DazmoNorton).

长版本

172.17.0.0/32不是一个IP地址范围,而是一个地址(即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 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

对于docker-compose,您可以尝试只添加

network_mode: "host"

例子:

version: '2'
services:
  feedx:
    build: web
    ports:
    - "127.0.0.1:8000:8000"
    network_mode: "host"

https://docs.docker.com/compose/compose-file/#network_mode

这里发布的解决方案对我不起作用。因此,我张贴这个答案来帮助那些面临类似问题的人。

注意:此解决方案也适用于Windows 10,请检查下面的评论。

操作系统:Ubuntu 18 PostgreSQL: 9.5(在Ubuntu上托管) Docker:服务器应用程序(连接到PostgreSQL)

我正在使用docker-compose。Yml构建应用程序。

步骤1:请添加host.docker.internal:<docker0 IP>

version: '3'
services:
  bank-server:
    ...
    depends_on:
      ....
    restart: on-failure
    ports:
      - 9090:9090
    extra_hosts:
      - "host.docker.internal:172.17.0.1"

要找到docker的IP,即172.17.0.1(在我的情况下),你可以使用:

$> ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

OR

$> ip a
1: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

step2:在postgresql.conf中修改listen_addresses为listen_addresses = '*'

步骤3:在pg_hba.conf中添加这一行

host    all             all             0.0.0.0/0               md5

步骤4:现在重新启动postgresql服务使用,sudo service postgresql restart

步骤5:请使用host.docker.internal主机名从服务器应用程序连接数据库。 例:jdbc: postgresql: / / host.docker.internal: 5432 / bankDB。是否

享受! !

以防万一,上述解决方案并不适用于任何人。使用以下语句从docker连接到主机postgres(在mac上):

psql --host docker.for.mac.host.internal -U postgres