我已经在主机上运行了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"