允许 docker 容器连接到本地/主机 postgres 数据库 [英] Allow docker container to connect to a local/host postgres database

查看:66
本文介绍了允许 docker 容器连接到本地/主机 postgres 数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我最近一直在玩 Docker 和 QGIS,并按照 本教程.

I've recently been playing around with Docker and QGIS and have installed a container following the instructions in this tutorial.

一切都很好,但我无法连接到包含我所有 GIS 数据的本地主机 postgres 数据库.我认为这是因为我的 postgres 数据库未配置为接受远程连接,并且一直在编辑 postgres conf 文件以允许使用 这篇文章.

Everything works great, although I am unable to connect to a localhost postgres database that contains all my GIS data. I figure this is because my postgres database is not configured to accept remote connections and have been editing the postgres conf files to allow remote connections using the instructions in this article.

当我尝试连接到在 Docker 中运行 QGIS 的数据库时,我仍然收到一条错误消息:无法连接到服务器:<代码>连接被拒绝服务器是否在主机localhost"(::1) 上运行和接受 TCP/IP 连接到端口 5433?postgres 服务器正在运行,我编辑了我的 pg_hba.conf 文件以允许来自一系列 IP 地址 (172.17.0.0/32) 的连接.之前我用docker ps查询过docker容器的IP地址,虽然IP地址变了,但一直在172.17.0.x范围内

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

为什么我无法连接到这个数据库的任何想法?可能是我想象的非常简单的东西!

Any ideas why I can't connect to this database? Probably something very simple I imagine!

我正在运行 Ubuntu 14.04;Postgres 9.3

I'm running Ubuntu 14.04; Postgres 9.3

推荐答案

TL;DR

  1. 使用 172.17.0.0/16 作为 IP 地址范围,而不是 172.17.0.0/32.
  2. 不要使用 localhost 连接到主机上的 PostgreSQL 数据库,而是使用主机的 IP.为了保持容器的可移植性,请使用 --add-host=database:<host-ip> 标志启动容器,并使用 database 作为连接到 PostgreSQL 的主机名.
  3. 确保将 PostgreSQL 配置为侦听所有 IP 地址上的连接,而不仅仅是 localhost.在 PostgreSQL 的配置文件中查找设置 listen_addresses,通常可以在 /etc/postgresql/9.3/main/postgresql.conf 中找到(归功于 @DazmoNorton).
  1. Use 172.17.0.0/16 as IP address range, not 172.17.0.0/32.
  2. 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.
  3. 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) 接口的网络地址.

Long version

172.17.0.0/32 is not a range of IP addresses, but a single address (namly 172.17.0.0). No Docker container will ever get that address assigned, because it's the network address of the Docker bridge (docker0) interface.

Docker 启动时会创建一个新的桥接网络接口,在调用ip a时很容易看到:

When Docker starts, it will create a new bridge network interface, that you can easily see when calling 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.

As you can see, in my case, the docker0 interface has the IP address 172.17.42.1 with a netmask of /16 (or 255.255.0.0). This means that the network address is 172.17.0.0/16.

IP 地址是随机分配的,但无需任何额外配置,它将始终位于 172.17.0.0/16 网络中.对于每个 Docker 容器,将从该范围内随机分配一个地址.

The IP address is randomly assigned, but without any additional configuration, it will always be in the 172.17.0.0/16 network. For each Docker container, a random address from that range will be assigned.

这意味着,如果您想从所有可能的容器中授予对数据库的访问权限,请使用 172.17.0.0/16.

This means, if you want to grant access from all possible containers to your database, use 172.17.0.0/16.

这篇关于允许 docker 容器连接到本地/主机 postgres 数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆