首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >允许docker容器连接到本地/主机postgres数据库

允许docker容器连接到本地/主机postgres数据库
EN

Stack Overflow用户
提问于 2015-07-06 22:57:42
回答 10查看 206.9K关注 0票数 200

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2015-07-06 23:05:50

TL;DR

使用

作为IP地址范围,不是

..。

不要使用

连接到主机上的PostgreSQL数据库,而不是主机的IP。若要保持容器的可移植性,请使用

标记和使用

作为连接到PostgreSQL的主机名。

确保将PostgreSQL配置为侦听所有IP地址上的连接,而不是仅侦听

..。查找设置

在PostgreSQL的配置文件中,通常位于

(致谢@DazmoNorton)。

长版本

不是

范围

多个IP地址,而不是单个地址(名称

)。任何Docker容器都不会分配该地址,因为它是Docker网桥的网络地址(

)接口。

当Docker启动时,它将创建一个新的网桥网络接口,当调用

代码语言:javascript
复制
$ 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容器,将从该范围中分配一个随机地址。

这意味着,如果要从所有可能的容器授予对数据库的访问权限,请使用

..。

票数 207
EN

Stack Overflow用户

发布于 2017-01-10 13:57:27

Docker for Mac解决方案

17.06起

感谢@Birchlabs的评论,现在它变得更容易了

仅限Mac的特殊DNS名称可用

代码语言:javascript
复制
docker run -e DB_PORT=5432 -e DB_HOST=docker.for.mac.host.internal

从17.12.0-cd-mac46开始,

应该使用,而不是

..。请参见

发行说明

有关详细信息,请参阅。

旧版本

@helmbert的回答很好地解释了这个问题。但是Docker for Mac

不暴露网桥网络

,所以我不得不使用这个技巧来解决这个限制:

代码语言:javascript
复制
$ sudo ifconfig lo0 alias 10.200.10.1/24

打开

然后添加这一行:

代码语言:javascript
复制
host    all             all             10.200.10.1/24            trust

打开

和编辑更改

代码语言:javascript
复制
listen_addresses = '*'

重新加载服务并启动容器:

代码语言:javascript
复制
$ 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地址附加到

而不是

网络接口。

票数 66
EN

Stack Overflow用户

发布于 2019-03-21 05:33:16

简单的解决方案

只需添加

..。仅此而已!

这样,容器将使用主机的网络,因此

将指向主机(默认情况下,它们指向容器)。示例:

代码语言:javascript
复制
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
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31249112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档