近视的豆浆 · PostgreSQL - ...· 2 周前 · |
近视的剪刀 · PostgreSQL和Oracle的sql差 ...· 3 天前 · |
力能扛鼎的作业本 · SQL 如何对表进行创建、更新和删除操作 ...· 2 天前 · |
帅气的甘蔗 · swing表格JTalble添加数据(数据类 ...· 4 月前 · |
爽快的松鼠 · Python之函数进阶 - 云游道士 - 博客园· 1 年前 · |
想出家的水煮鱼 · java - ...· 1 年前 · |
高大的豌豆 · 当设置nullable ...· 1 年前 · |
我最近一直在使用Docker和QGIS,并按照
本教程
..。
虽然我无法连接到包含所有GIS数据的localhost postgres数据库,但一切工作正常。我认为这是因为我的postgres数据库未配置为接受远程连接,并且一直在编辑postgres conf文件以允许使用中的说明进行远程连接
本文
..。
当我尝试连接到在Docker中运行QGIS的数据库时,仍然收到错误消息:无法连接到服务器:
postgres服务器正在运行,我编辑了我的
pg
_
hba.conf
文件以允许来自IP地址范围(172.17.0.0/32)的连接。我之前使用以下命令查询过docker容器的IP地址
尽管IP地址发生了变化,但到目前为止,它始终在172.17.0.x范围内
你知道为什么我不能连接到这个数据库吗?我想可能是非常简单的事情!
我正在运行Ubuntu 14.04;Postgres 9.3
TL;DR
使用
作为IP地址范围,不是
..。
不要使用
连接到主机上的PostgreSQL数据库,而不是主机的IP。若要保持容器的可移植性,请使用
标记和使用
作为连接到PostgreSQL的主机名。
确保将PostgreSQL配置为侦听所有IP地址上的连接,而不是仅侦听
..。查找设置
在PostgreSQL的配置文件中,通常位于
(致谢@DazmoNorton)。
长版本
不是
范围
多个IP地址,而不是单个地址(名称
)。任何Docker容器都不会分配该地址,因为它是Docker网桥的网络地址(
)接口。
当Docker启动时,它将创建一个新的网桥网络接口,当调用
$ ip a
3: docker0: 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
如您所见,在我的例子中,
接口具有IP地址
使用网络掩码
(或
)。这意味着网络地址是
..。
IP地址是随机分配的,但不需要任何其他配置,它将始终位于
网络。对于每个Docker容器,将从该范围中分配一个随机地址。
这意味着,如果要从所有可能的容器授予对数据库的访问权限,请使用
..。
Docker for Mac解决方案
17.06起
感谢@Birchlabs的评论,现在它变得更容易了
仅限Mac的特殊DNS名称可用
docker run -e DB_PORT=5432 -e DB_HOST=docker.for.mac.host.internal
从17.12.0-cd-mac46开始,
应该使用,而不是
..。请参见
发行说明
有关详细信息,请参阅。
旧版本
@helmbert的回答很好地解释了这个问题。但是Docker for Mac
不暴露网桥网络
,所以我不得不使用这个技巧来解决这个限制:
$ sudo ifconfig lo0 alias 10.200.10.1/24
打开
然后添加这一行:
host all all 10.200.10.1/24 trust
打开
和编辑更改
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的答案基本相同,但使用的IP地址附加到
而不是
网络接口。
在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
这里
用作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
在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:
这里
用作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数据库。
这里发布的解决方案对我不起作用。因此,我发布这个答案是为了帮助那些面临类似问题的人。
操作系统:
Ubuntu 18
PostgreSQL:
9.5 (托管在Ubuntu上)
Docker:
服务器应用程序
(连接到PostgreSQL)
我正在使用docker-compose.yml构建应用程序。
步骤1:
请添加
version: '3'
services:
bank-server:
depends_on:
restart: on-failure
ports:
- 9090:9090
extra_hosts:
爽快的松鼠 · Python之函数进阶 - 云游道士 - 博客园 1 年前 |