Docker: 如何在不暴露端口的情况下连接到 Postgresql 容器
Docker: How to connect to Postgresql container without exposing port
我在 docker 容器中设置了一个 Elixir / Phoenix 应用程序,并为 Postgresql 服务器设置了一个单独的容器。我只有暴露5432端口才能连接到Postgresql服务器。但我不希望端口为 public 因为这很不安全。 Postgresql 服务器应该只能从 phoenix 容器访问。
但如果我不公开端口,我只会在 phoenix 容器中收到 "Connection refused" 错误。
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 容器以某种方式阻止了来自我的 phoenix 容器的所有连接。知道如何解决这个问题吗?
我找到了解决方案:问题出在 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
编辑: 只删除规则不是个好主意。
我在 docker 容器中设置了一个 Elixir / Phoenix 应用程序,并为 Postgresql 服务器设置了一个单独的容器。我只有暴露5432端口才能连接到Postgresql服务器。但我不希望端口为 public 因为这很不安全。 Postgresql 服务器应该只能从 phoenix 容器访问。
但如果我不公开端口,我只会在 phoenix 容器中收到 "Connection refused" 错误。
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 容器以某种方式阻止了来自我的 phoenix 容器的所有连接。知道如何解决这个问题吗?
我找到了解决方案:问题出在 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
编辑: 只删除规则不是个好主意。