Docker环境下Laravel等微服务连接数据库超时但数据库无报错求助
排查方案
- 优先排查宿主机防火墙/iptables规则问题
大部分该类场景都是宿主机安全规则更新、系统重启等操作清空了Docker自动生成的网桥转发规则,导致容器之间通信时TCP回包被拦截,就会出现可以建立连接、但发送业务请求后无响应超时的现象,而宿主机访问端口映射的数据库服务不受影响。
执行命令systemctl restart docker重启Docker服务,Docker会自动重建iptables转发规则,重启后再启动所有业务容器验证是否恢复。 - 验证PostgreSQL访问权限配置
你的PostgreSQL启动命令仅开启了SQL语句日志,未开启连接日志,所以连接被pg_hba.conf规则拦截时不会产生日志。如果Docker网桥网段发生过变更,原有pg_hba.conf中配置的允许访问网段失效就会导致容器内访问被拒绝。
进入数据库容器,修改pg_hba.conf,添加Docker私有网段访问规则host all all 172.16.0.0/12 md5,执行pg_ctl reload重载配置后重试连接。 - 验证Docker网络连通性
进入业务容器内部,执行ping db验证服务名解析是否正常,执行nc -zv db 5432验证容器到数据库5432端口的连通性;如果改用宿主机IP+5431端口连接失败,进一步证明是容器到宿主机/容器的通信被防火墙拦截。 - 检查MTU配置一致性
如果是云服务器部署,确认Docker网桥的MTU值和宿主机物理网卡的MTU值一致(云服务器默认MTU通常为1450,普通服务器为1500),MTU不一致会导致大包传输时丢包,出现请求超时现象。修改Docker daemon配置统一MTU后重启容器验证。
内容的提问来源于stack exchange,提问作者zywy
相关产品推荐
相关产品推荐

