0

我创建了 docker postgres 实例

docker run -d \
  --name test_db \
  -v data:/var/lib/postgresql/data \
  -e "POSTGRES_PASSWORD=abcdefghij" \
  -e "POSTGRES_USER=testuser" \
  -p 5432:5432 \
  postgres

我可以使用公共服务器 ip 从其他主机正确连接到该数据库,例如。

 psql -U testuser -h 111.111.111.111 -d testuser   // in reality I use proper IP

但是如果我想在运行容器的同一主机上执行此操作,则无法连接(它只是挂起)。

我的 pg_hba.conf(容器内)

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust    
host    all             all             0.0.0.0/0               md5

在 postgresql.conf 里面有一行:

listen_addresses = '*'

iptables 的相关行:

$ iptables -L | grep sql
ACCEPT     tcp  --  anywhere             172.19.0.2           tcp dpt:postgresql

此外,如果我使用 172.19.0.2 地址,它可以在本地工作,但如果我使用公共服务器 IP,它就会挂起。我不知道为什么会这样。我的应用程序分布在许多主机中,包括一个带有 DB 的主机,并且我不想根据位置使用其他地址。有人可以帮忙吗?

4

1 回答 1

0

问题很可能不是 Docker,从您所描述的情况来看,是您的(公司)网络的配置,该网络将数据包路由到 111.111.111.111 到默认网关。我怀疑公共 ip 111.111.111.111 是您在 NAT 后面的 IP。

简而言之,111.111.111.111 不会映射到 127.0.0.1,因为绑定是在您计算机之外的某个地方进行的。

你会想做这样的事情iptables 将所有请求重定向到 localhost

于 2016-10-20T14:02:44.373 回答