我有一个容器堆栈(由 指定docker-compose.yml
)。该堆栈需要一个 PostgreSQL 数据库,但我使用的是本地运行的本机实例,而不是将其作为堆栈的一部分(例如,为了使备份更容易,并节省资源)。PostgreSQL 实例设置为绑定并侦听172.17.0.1
,即可从 docker 容器内访问主机的 IP。
但是,在系统启动期间,PostgreSQL 不会绑定到该地址,因此容器随后无法初始化。如果我随后重新启动 PostgreSQL,我可以看到它已绑定(通过ss
),并且容器初始化正常。每次启动时都可以 100% 重现此情况。
我认为这是因为接口尚不存在,所以没有东西可以绑定。有没有办法“保留”网络(或接口),以便即使在 docker 尚未初始化时也可以绑定它?
(我也尝试After=docker.service
在 PostgreSQL 的 systemd 服务文件中指定,但没有成功 - 我认为这是因为虽然 docker 已经初始化,但容器堆栈尚未初始化,因此网络也尚未创建。据我所知,在 systemd 中指定“等到 docker 容器启动”是不可能的。)
答案1
我一直在处理同样的问题。我找到了一个解决方案,但你可能不喜欢它。如果你listen_addresses
在 Postgresql 中设置为'*'
,那么它将绑定到0.0.0.0
地址,该地址将接收来自所有接口的流量。我已经确认这在几台服务器上都可以正常工作。
是的,让您的数据库服务器绑定到面向公众的地址是一种罪过。不过,您应该已经让 UFW 阻止外部流量,并严格配置pg_hba
仅允许从 Docker 子网连接到适当的数据库,再加上postgres
超级用户帐户仅使用本地 unix 身份验证,所有其他帐户使用强密码,所以我认为它足够安全。至少它是有效的,而且我还没有找到任何其他方法让它工作。