我如何给docker容器访问主机上运行的postgresql ?



我已经在主机上运行了postgresql,现在我想从主机上运行的docker容器连接到它。

在我的docker-compose。我有

extra_hosts:
- "host.docker.internal:host-gateway"

在容器上设置,并且在容器内我能够ping host.docker.internal成功,但是当连接到postgres运行的端口host.docker.internal:5432时,它被拒绝了。可能是因为postgres配置为只监听127.0.0.1:5432。

如何配置postgres以允许如上所述的连接?我不太确定docker是如何配置网络的,例如,如果我修改postgres以允许配置docker的子网,我不确定docker是否会在某个时候改变这个网络子网(例如,如果我重新创建docker-compose容器)。

我不想在允许0.0.0.0下完全打开它。


当我尝试连接时查看tshark输出,我看到:

95 26.891536270 192.168.32.2 → 172.17.0.1   TCP 76 46440 → 5432 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2274078019 TSecr=0 WS=128
96 26.891557842 192.168.32.2 → 172.17.0.1   TCP 76 [TCP Out-Of-Order] [TCP Port numbers reused] 46440 → 5432 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2274078019 TSecr=0 WS=128
97 26.891577870   172.17.0.1 → 192.168.32.2 TCP 56 5432 → 46440 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
98 26.891581727   172.17.0.1 → 192.168.32.2 TCP 56 5432 → 46440 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0

所以192.168.32.2似乎在另一个桥接网络下,docker自动配置。

设置容器使用默认的bridge网络:

services:
api: 
network_mode: bridge

获取默认的bridge网络网关和子网:

gateway=$(sudo docker network inspect bridge | jq -r '.[] .IPAM.Config[].Gateway')
subnet=$(sudo docker network inspect bridge | jq -r '.[] .IPAM.Config[].Subnet')

postgresql.conf中更改侦听地址以包含docker桥网关:

# change this
# listen_addresses = 'localhost'               # what IP address(es) to listen on;
# to:
listen_addresses = 'localhost,172.17.0.1'               # what IP address(es) to listen on;

添加子网到pg_hba.conf:

sudo bash -c "echo 'host    all             all             ${subnet}            trustscram-sha-256' >> /etc/postgresql/14/main/pg_hba.conf"

相关内容

  • 没有找到相关文章

最新更新