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

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 修改于2018-06-26
  • 该问题已被编辑
  • 提问者: Stack Overflow用户
  • 提问时间: 2015-07-06 22:57

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

浏览 184 关注 0 得票数 200
  • 得票数为Stack Overflow原文数据
原文

10 个回答

修改于2020-10-27
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2015-07-06 23:05
得票数 207

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容器,将从该范围中分配一个随机地址。

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

..。

评论 0
0
修改于2018-01-11
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2017-01-10 13:57
得票数 66

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地址附加到

而不是

网络接口。

修改于2017-03-02
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2017-03-02 15:02
得票数 0

我的设置需要做的另一件事是添加

172.17.0.1  localhost

这样Docker就会指向

作为DB主机名,并且不依赖于不断变化的外部ip来查找DB。希望这篇文章能帮助其他人解决这个问题!

回答于2017-03-02
得票数 -3

另一种解决方案是服务卷,您可以定义一个服务卷并在该卷中装载主机的PostgreSQL数据目录。有关详细信息,请查看给定的撰写文件。

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

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

修改于2019-03-24
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2018-05-23 15:06
得票数 2

在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数据库。

原文
回答于2019-03-21
得票数 33

简单的解决方案

只需添加

..。仅此而已!

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

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

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
原文
回答于2019-05-27
得票数 4

对于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

_

模式

原文
回答于2019-09-20
得票数 6

要设置允许Postgresql连接的简单设置,请执行以下操作

来自

我在postgresql.conf中使用的本地主机的停靠容器:

listen_addresses = '*'

并添加了此pg

_

hba.conf:

host    all             all             172.17.0.0/16           password

然后重新启动。我的客户

来自

docker容器(位于172.17.0.2)然后可以使用host:password、database、username和password连接到在我的本地主机上运行的Postgresql。

评论 0
0
修改于2021-05-02
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2020-05-11 12:06
得票数 13

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

操作系统:

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: