远程VPS上Docker容器启动失败如何解决?Spring Boot连PostgreSQL报错
问题排查结论
java.net.NoRouteToHostException错误本质是VPS上的容器无法和目标PostgreSQL服务器postgresql.j5321585.myjino.ru:5432建立网络连接,本地运行正常说明应用配置本身没有问题,问题出在VPS侧的网络层面,可能的原因如下:
- VPS本身的出口网络限制
多数VPS厂商会默认封禁5432端口的对外出口流量,也可能是VPS自带的安全组/防火墙规则禁止了到外部5432端口的请求。可先在VPS宿主机执行telnet postgresql.j5321585.myjino.ru 5432或者nc -zv postgresql.j5321585.myjino.ru 5432验证宿主机本身能否连通该数据库端口,如果宿主机都连不通,先联系VPS厂商解除端口限制,或者开放本地防火墙的出口规则。 - Docker容器的网络配置问题
如果宿主机能连通数据库端口,但容器内连不通,大概率是Docker的DNS或者网络转发规则异常:- 先进入容器验证网络:执行
docker run --rm tg-bot ping postgresql.j5321585.myjino.ru看是否能正常解析域名,如果解析失败,给Docker配置公共DNS比如114.114.114.114或者8.8.8.8即可。 - 如果域名能解析但端口连不上,检查VPS上的iptables规则有没有禁止Docker网桥的流量转发,执行
sysctl net.ipv4.ip_forward看返回值是不是1,如果是0则需要开启IP转发:执行sysctl -w net.ipv4.ip_forward=1,再将配置写入/etc/sysctl.conf实现永久生效。
- 先进入容器验证网络:执行
- 数据库侧的访问白名单限制
你的PostgreSQL服务商可能只允许你本地IP访问,没有将VPS的公网IP加入数据库的访问白名单,可登录数据库后台将VPS公网IP添加到允许访问的列表中验证。 - 域名解析污染
部分地区的VPS可能存在域名解析污染的情况,导致postgresql.j5321585.myjino.ru解析到了错误的IP,你可以在VPS上执行nslookup postgresql.j5321585.myjino.ru,和本地电脑上解析出来的IP做对比,如果结果不一致,修改VPS的DNS服务器地址,或者直接在application.yml里把域名替换成数据库的公网IP地址测试即可。
内容的提问来源于stack exchange,提问作者Каляшов Григорий
相关产品推荐
相关产品推荐

