我最近一直在使用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
在Ubuntu中:
首先,您必须检查Docker数据库端口是否在您的系统中可用,执行命令-
sudo iptables -L -n
样例输出:
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:3306
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:22
此处以“3306”作为172.17.0.2 IP地址的“Docker数据库端口”,如果没有此端口执行以下命令-
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
现在,您可以通过以下配置从本地系统轻松访问Docker数据库
host: 172.17.0.2
adapter: mysql
database: DATABASE_NAME
port: 3307
username: DATABASE_USER
password: DATABASE_PASSWORD
encoding: utf8
In CentOS:
首先,您必须检查Docker数据库端口是否在您的防火墙中可用
sudo firewall-cmd --list-all
样例输出:
target: default
icmp-block-inversion: no
interfaces: eno79841677
sources:
services: dhcpv6-client ssh
**ports: 3307/tcp**
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
此处以“3307”作为172.17.0.2 IP地址的“Docker数据库端口”,如果没有此端口执行以下命令-
sudo firewall-cmd --zone=public --add-port=3307/tcp
在服务器端,可以永久添加端口
sudo firewall-cmd --permanent --add-port=3307/tcp
sudo firewall-cmd --reload
现在,您可以通过上述配置轻松地从本地系统访问Docker数据库。
Mac解决方案的Docker
17.06以后
多亏了@Birchlabs的评论,现在有了这个特殊的mac专用DNS名称就简单多了:
docker run -e DB_PORT=5432 -e DB_HOST=docker.for.mac.host.internal
从17.12.0-cd-mac46开始,应该使用docker.for.mac.host.internal而不是docker.for.mac.localhost。详见发行说明。
旧版本
@helmbert的回答很好地解释了这个问题。但是Mac的Docker不暴露网桥网络,所以我不得不做这个技巧来解决这个限制:
$ sudo ifconfig lo0 alias 10.200.10.1/24
打开/usr/local/var/postgres/pg_hba.conf,添加如下一行:
host all all 10.200.10.1/24 trust
打开/usr/local/var/ postgresql.conf,编辑change listen_addresses:
listen_addresses = '*'
重新加载服务并启动容器:
$ PGDATA=/usr/local/var/postgres pg_ctl reload
$ docker run -e DB_PORT=5432 -e DB_HOST=10.200.10.1 my_app
这个解决方案所做的基本上与@helmbert的答案相同,但使用一个附加到lo0的IP地址,而不是docker0网络接口。