2016-03-15 119 views
1

我在Docker容器中設置了Elixir/Phoenix應用程序,併爲Postgresql服務器設置了單獨的容器。當我公開5432端口時,我只能連接到Postgresql服務器。但我不希望港口公開,因爲這是非常不安全的。 Postgresql服務器應該只能從phoenix容器訪問。Docker:如何在不暴露端口的情況下連接到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節點上的結果:不知何故Postgres的容器被阻止從我的鳳容器的所有連接

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 

。任何線索如何解決這個問題?

+0

你如何運行容器。如果你用'--link'運行,它應該可以工作。你也應該延遲應用程序容器幾秒鐘,因爲postgres可能需要時間啓動。 –

+0

Postgres運行很長時間。我正在通過docker雲網絡界面部署/運行,但我正在將phoenix容器中的postgres服務鏈接起來。 –

+0

限制來自主機外部的流量是防火牆的工作。在我的情況下,我使用Ubuntu的本地解決方案:ufw。 –

回答

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 

編輯:只刪除該規則是一個壞主意。

相關問題