1

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

但是,如果我不公开端口,我只会在 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 容器以某种方式阻止了来自我的凤凰容器的所有连接。任何线索如何解决这个问题?

4

1 回答 1

2

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

-A FORWARD -j REJECT

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

摆脱规则

$ 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 规则在重新启动时启动,我们将创建一个新文件:

$ 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

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

于 2016-03-15T20:11:03.393 回答