
我有一個容器堆疊(由 a 指定docker-compose.yml
)。該堆疊需要一個 PostgreSQL 資料庫,但我使用本地運行的本機實例,而不是讓它成為堆疊的一部分(以使備份更容易,並節省資源)。 PostgreSQL 實例設定為綁定並偵聽172.17.0.1
,該 IP 是可從 docker 容器內存取主機的 IP。
但是,在系統啟動期間,PostgreSQL 不會綁定到該位址,因此容器隨後無法初始化。如果我之後重新啟動 PostgreSQL,我可以看到它已綁定(通過ss
),並且容器初始化良好。這在每次啟動時都是 100% 可重現的。
我認為這是因為介面還不存在,所以沒有什麼可以綁定的。有沒有辦法「持久化」網路(或介面),以便即使 docker 尚未初始化也可以將其綁定?
(我也嘗試After=docker.service
在 PostgreSQL 的 systemd 服務檔案中指定,但沒有成功 - 我認為這是因為雖然 docker 已經初始化,但容器堆疊尚未初始化,因此網路也尚未建立。指定「據我所知,等到docker 容器啟動「在systemd 中是不可能的。)
答案1
我一直在處理同樣的問題。我找到了一個解決方案,但你可能不喜歡它。如果您listen_addresses
在 Postgresql 中設定為'*'
,那麼它將綁定到該0.0.0.0
位址,該位址將從所有介面接收流量。我已經確認這可以在多台伺服器上正常工作。
是的,讓您的資料庫伺服器綁定到您的面向公眾的地址是一種罪。不過,您應該已經讓 UFW 阻止外部流量,加上嚴格配置,pg_hba
只允許從 Docker 子網連接到適當的資料庫,加上postgres
超級用戶帳戶的本地unix 身份驗證和所有其他帳戶的強密碼,所以我認為它夠安全。至少它有效,而且我還沒有找到任何其他方法來讓它發揮作用。