Docker容器运行一段时间后无法连接远程数据库问题排查求助
Docker容器连接数据库超时(初期正常,后期失败)的排查思路
可能原因及对应检查项
1. 网络防火墙/会话超时限制
- 数据库主机侧:检查
firewalld或iptables规则,确认是否存在动态阻断策略(比如基于连接数、请求频率的限制),或者会话超时后未正确放行新连接。执行命令:# firewalld规则检查 firewall-cmd --list-all firewall-cmd --list-rich-rules # iptables规则检查 iptables -L -n -v - 容器宿主机侧:同理检查宿主机的防火墙规则,是否有针对容器网络出口的限制。
- 中间网络设备:查看路由器、交换机的TCP会话超时配置,部分设备会自动清理长时间空闲的会话,导致后续新连接无法建立。
2. 数据库连接资源耗尽
- 查看数据库的最大连接数配置,确认是否达到上限:
# MySQL示例 mysql -u root -p -e "show variables like 'max_connections';" # PostgreSQL示例 psql -U postgres -c "show max_connections;" - 查看数据库当前连接数,对比最大值:
# MySQL示例 mysql -u root -p -e "show status like 'Threads_connected';" # PostgreSQL示例 psql -U postgres -c "select count(*) from pg_stat_activity;" - 检查数据库日志,搜索是否有
too many connections、connection refused等报错信息,定位连接堆积的原因。
3. 容器/宿主机网络栈异常
- 容器内部:
- 对比正常和异常时的路由表:
route -n,确认到10.0.3.11的路由是否存在。 - 检查TCP连接状态,看是否有大量
TIME_WAIT/CLOSE_WAIT连接占用资源:ss -tulnp | grep -E '(TIME-WAIT|CLOSE-WAIT)'
- 对比正常和异常时的路由表:
- 宿主机侧:
- 查看网络统计错误:
ss -s,确认是否有TCP连接超时、拒绝的异常计数。 - 检查内核网络参数,确认是否存在配置不合理导致连接无法建立:
sysctl net.ipv4.tcp_fin_timeout sysctl net.ipv4.tcp_tw_reuse sysctl net.ipv4.ip_local_port_range
- 查看网络统计错误:
- 尝试重启容器,若重启后连接恢复,大概率是容器内部网络栈出现异常(比如内核参数冲突、资源泄漏)。
4. 连接池配置问题
- 检查应用的连接池配置,是否存在未正确释放连接的情况(比如连接泄漏),导致数据库端连接堆积,最终无法接受新连接。
- 确认连接池的最大连接数是否超过数据库的
max_connections限制,或者连接超时、回收机制配置不合理。
5. 中间代理/负载均衡故障
如果容器与数据库之间存在代理或负载均衡设备:
- 检查设备的健康检查日志,是否因数据库节点状态异常被剔除。
- 查看代理的连接日志,是否有连接中断、超时的记录。
内容的提问来源于stack exchange,提问作者cppcoder
相关产品推荐
相关产品推荐

