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

时间:2016-03-15 14:07:03

标签: postgresql docker phoenix-framework docker-cloud

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

但是,如果我不暴露端口,我只会得到一个"连接被拒绝"凤凰容器中的错误。

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容器阻止了我的凤凰容器的所有连接。有任何线索如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

我找到了解决方案:问题是iptables设置。除非另有定义,否则我有一条规则要删除所有转发:

-A FORWARD -j REJECT

此规则位于过滤器链中的错误位置。正确的方法是在docker创建的规则之后将它放在过滤器链的最末端。所以如果你遇到同样的问题,这对我有用:

摆脱规则

$ sudo iptables -D FORWARD -j REJECT

再次添加它以将其移动到集合

的末尾
$ sudo iptables -A FORWARD -j REJECT

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

$ sudo iptables -v -L FORWARD

On Debian this is how you can make sure the rules still apply when restarting the server

如果您满意,请将新规则保存到主iptables文件中:

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

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

$ 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

修改:删除规则是一个坏主意。