我有一个全新的Debian 9,带有Docker 18.09(从官方Docker仓库安装)和Postgres 9.6。我已编辑/etc/postgresql/9.6/main/postgresql.conf
来设置listen_addresses
参数:
listen_addresses = '127.0.0.1,172.17.0.1'
进行更改并重新启动Postgres之后,我的Docker容器可以毫无问题地连接到172.17.0.1的Postgres。当我重新启动整个操作系统时,问题就来了,直到我重新启动Postgres本身,Postgres才会侦听172.17.0.1。我已将postgresql.conf
中的地址顺序更改为无效,在show listen_addresses;
中运行psql
,说,它正在侦听我指定的两个端口,但sudo netstat -na
表示它仅在127.0.0.1收听:
$ sudo netstat -na
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
Postgres(systemctl restart postgres
)的重新启动,现在它也在监听172.17.0.1:
$ sudo netstat -na
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
tcp 0 0 172.17.0.1:5432 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
这意味着我在启动时启动的,连接到Postgres的Docker容器由于出现“拒绝连接”错误而无法自动启动。
答案 0 :(得分:1)
经过大量测试后,我意识到这似乎是Docker和Postgres启动的时间问题,我猜想直到Docker本身启动后,才会出现类似Docker接口的东西,或者类似的东西,因此Postgres无法收听,因为它尚不存在。我将/lib/systemd/system/postgresql@.service
(是的,里面有@
)复制到了/etc/systemd/system/
,并在[Unit]
部分中将其设置为仅在 Docker之后启动。开始:
[Unit]
...
After=docker.service
然后将启动Docker容器的自定义单元配置为仅在Postgres之后启动(而不是Docker,因为Postgres直到Docker之后才启动):
[Unit]
...
Wants=postgresql.service
现在一切都按预期工作!