如何从Docker Compose容器访问宿主机上的PostgreSQL数据库?
解决Docker容器连接主机PostgreSQL超时的步骤
检查PostgreSQL监听地址配置
编辑PostgreSQL主配置文件(路径通常为/etc/postgresql/<你的PostgreSQL版本>/main/postgresql.conf),找到listen_addresses参数,修改为:listen_addresses = '*'该配置允许PostgreSQL监听所有网络接口,保存后重启服务:
sudo systemctl restart postgresql修改pg_hba.conf授权Docker网段访问
编辑/etc/postgresql/<你的PostgreSQL版本>/main/pg_hba.conf,添加针对Docker常用网段的访问规则(172.17.0.0/16是Docker默认桥接网段,可根据实际情况调整):host mydb xx 172.17.0.0/16 scram-sha-256 host mydb xx 192.168.0.0/16 scram-sha-256其中
mydb是你的目标数据库名,xx是数据库用户名,认证方式(scram-sha-256)需和PostgreSQL配置一致。保存后重启PostgreSQL服务:sudo systemctl restart postgresql开放主机防火墙5432端口
Ubuntu默认使用ufw防火墙,执行以下命令允许Docker网段访问5432端口:sudo ufw allow from 172.17.0.0/16 to any port 5432 sudo ufw allow from 192.168.0.0/16 to any port 5432 sudo ufw reload若使用iptables,替换为:
sudo iptables -A INPUT -p tcp -s 172.17.0.0/16 --dport 5432 -j ACCEPT sudo iptables -A INPUT -p tcp -s 192.168.0.0/16 --dport 5432 -j ACCEPT sudo iptables-save验证容器内网络连通性
进入.NET Core容器内部,测试与主机的网络连通性:docker exec -it <你的容器名称> /bin/bash # 测试ping主机 ping host.docker.internal # 测试5432端口是否可访问 telnet host.docker.internal 5432如果telnet无法连接,说明网络层面存在阻塞,需回到前面的配置排查。
调整连接字符串参数
若PostgreSQL未配置SSL,在连接字符串中添加SslMode=Disable避免SSL握手超时:Server=host.docker.internal;Port=5432;Database=mydb;User Id=xx;Password=xx;SslMode=Disable;
内容的提问来源于stack exchange,提问作者raklos
相关产品推荐
相关产品推荐

