我在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容器阻止了我的凤凰容器的所有连接。有任何线索如何解决这个问题?
答案 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
修改:删除规则是一个坏主意。