Docker:如何在不暴露端口的情况下连接到Postgresql容器

我在docker容器中设置了Elixir / Phoenix应用程序,为Postgresql服务器设置了单独的容器。 当我公开5432端口时,我只能连接到Postgresql服务器。 但我不希望港口公开,因为这是相当不安全的。 Postgresql服务器应该只能从phoenix容器访问。

但是,如果我不暴露端口,我只是在凤凰容器中出现“连接被拒绝”的错误。

app-phoenix-1 | 2016-03-15T11:41:32.701295542Z ** (Mix) The database for App.Repo couldn't be created, reason given: psql: could not connect to server: Connection refused app-phoenix-1 | 2016-03-15T11:41:32.701369511Z Is the server running on host "POSTGRES" (10.7.0.7) and accepting app-phoenix-1 | 2016-03-15T11:41:32.701395350Z TCP/IP connections on port 5432? 

我链接的服务,并没有得到,为什么它不工作。 Postgresql已经启动并正在运行。

Postgres容器的日志文件中没有任何内容。

这是我的节点上的docker ps的结果:

 8204a82ca192 myrepo/app "elixir --erl '-smp d" 37 seconds ago Up Less than a second 0.0.0.0:80->4000/tcp app-phoenix-1.585afb94 7a4dded80c36 postgres:latest "/docker-entrypoint.s" 2 hours ago Up 10 minutes 5432/tcp postgres-1.aed0697d 

不知怎的,Postgres容器阻塞了我的凤凰容器的所有连接。 任何线索如何解决这个问题?

我find了解决办法:问题是iptables设置。 除非另有定义,我有一个规则在那里放弃所有的转发:

 -A FORWARD -j REJECT 

这条规则在过滤链中处于错误的位置。 正确的方法是把它放在filter链的最后,在docker创build的规则之后。 所以,如果你有同样的问题,这对我有用:

摆脱规则

 $ sudo iptables -D FORWARD -j REJECT 

再次添加它将其移动到集合的末尾

 $ sudo iptables -A FORWARD -j REJECT 

确保他们是在正确的顺序。 所以拒绝所有其他规则应该是最后的。

 $ sudo iptables -v -L FORWARD 

在Debian上,您可以在重新启动服务器时确保规则仍然适用 :

一旦你快乐,把新的规则保存到主iptables文件:

 $ iptables-save > /etc/iptables.up.rules 

为了确保iptables规则在重启时启动,我们将创build一个新文件:

 $ editor /etc/network/if-pre-up.d/iptables 

将这些行添加到它:

 #!/bin/sh /sbin/iptables-restore < /etc/iptables.up.rules 

该文件需要是可执行的,所以更改权限:

 $ sudo chmod +x /etc/network/if-pre-up.d/iptables 

编辑:只是删除规则是一个坏主意。