重新启动后,Postgres不会监听Docker主机IP地址,直到重新启动Postgres

时间:2018-12-16 04:55:16

标签: postgresql docker

我有一个全新的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容器由于出现“拒绝连接”错误而无法自动启动。

1 个答案:

答案 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

现在一切都按预期工作!