You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot容器无法连接Postgres:域名解析失败求助

容器化Spring Boot无法解析Postgres域名的问题排查

问题描述

原本正常运行的Spring Boot应用,可连接Docker部署的Postgres数据库。将该应用迁移至另一Docker容器后,原Postgres容器未做任何改动,但应用抛出连接拒绝异常。本地运行的应用仍能正常连接,容器化后却失败,报错信息如下:

org.postgresql.util.PSQLException: Connection to MYDOMAIN:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections

应用配置文件application.properties中的数据库连接地址:

spring.datasource.url=jdbc:postgresql://MYDOMAIN:5432/

更新:将MYDOMAIN替换为Postgres容器所在主机的公网IP后,连接恢复正常,但不清楚域名解析失败的原因。

原因分析与解决方案

1. Docker容器DNS配置异常

Docker容器默认继承宿主机的DNS配置,但如果容器启动时DNS设置被覆盖或未正确加载,会导致域名解析失败。

  • 检查容器的DNS配置:执行docker exec -it <spring-boot-container-id> cat /etc/resolv.conf,对比宿主机的/etc/resolv.conf,确认DNS服务器地址是否一致。
  • 启动容器时手动指定可靠DNS:
    docker run --dns 8.8.8.8 --dns 8.8.4.4 <your-spring-boot-image>
    

2. 域名解析的环境差异

本地应用使用宿主机的DNS解析,可能MYDOMAIN在宿主机hosts文件中有内网IP映射,或者本地DNS服务商能正常解析该域名,但Docker容器的DNS无法解析。

  • 检查宿主机/etc/hosts:如果存在MYDOMAIN的映射记录,启动Spring Boot容器时手动添加映射:
    docker run --add-host MYDOMAIN:<postgres-host-public-ip> <your-spring-boot-image>
    
  • 在容器内执行nslookup MYDOMAIN,查看解析结果是否为公网IP。如果解析出内网IP,而容器无法访问该内网网段,就会导致连接失败。

3. 网络模式与访问权限限制

如果Spring Boot容器使用bridge等非host网络模式,可能无法直接访问Postgres所在主机的内网IP(尤其是跨主机部署场景)。

  • 查看容器网络模式:docker inspect <spring-boot-container-id> | grep NetworkMode
  • 若Postgres和Spring Boot容器在同一主机,可将两者加入同一Docker网络,直接使用Postgres容器名作为连接地址,避免域名解析问题:
    spring.datasource.url=jdbc:postgresql://postgres-container-name:5432/
    

4. 防火墙/安全组的隐性限制

虽然公网IP能连接,但域名解析后的IP可能触发了防火墙或安全组的规则,导致容器无法访问。

  • 确认域名解析后的IP范围,检查Postgres所在主机的防火墙是否允许容器所在网段访问5432端口。

内容的提问来源于stack exchange,提问作者Krishnan V S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:05:39