Docker Compose部署SonarQube无法连接PostgreSQL数据库求助
问题排查与解决方案
核心问题定位
两个异常都指向容器网络的DNS解析出问题了——这就是PostgreSQL容器没法更新软件、SonarQube连不上数据库的根源。
具体排查和修复步骤
1. 检查Docker Compose的网络配置
- 看看你的compose文件里有没有手动给自定义网络指定DNS服务器,如果填了不可用的地址(比如写错的公共DNS),就会导致解析失败。
- 比如这种错误配置要改掉:
networks: sonar-net: ipam: config: - subnet: 172.20.0.0/16 dns: 8.8.8.8 # 要是这个地址连不上就会出问题 - 修复:要么删掉自定义DNS那行,让Docker自动用宿主机的DNS;要么换成靠谱的公共DNS,比如
114.114.114.114。
2. 测试容器间的DNS解析
进SonarQube容器,ping一下PostgreSQL的容器名(比如你compose里设的postgres):
docker exec -it 你的sonarqube容器名 ping postgres
如果ping不通,说明同一网络里的DNS解析失效了,试试重启Docker服务:
- Linux:
systemctl restart docker - Windows/macOS:直接在Docker Desktop里重启应用
- 顺便看看宿主机本身DNS正常不,宿主机ping个外网域名(比如
baidu.com),要是宿主机DNS都坏了,容器肯定也跟着出问题。
3. 确认PostgreSQL的监听设置
虽然PostgreSQL容器本地能操作,但可能只监听了localhost,导致其他容器连不上:
- 进PostgreSQL容器,查
postgresql.conf里的listen_addresses:docker exec -it 你的postgres容器名 cat /var/lib/postgresql/data/postgresql.conf | grep listen_addresses - 如果显示是
localhost,得改成*。最快的办法是在compose里给PostgreSQL加个环境变量POSTGRES_HOST_AUTH_METHOD=trust(测试用,生产环境记得用密码认证),同时确保SonarQube配置的数据库名、用户名、密码和PostgreSQL的完全一致。
4. 检查宿主机的防火墙/iptables
宿主机的防火墙可能拦了容器间的通信,或者iptables规则乱了:
- 先临时关掉防火墙试试:Linux下
systemctl stop firewalld,看SonarQube能不能正常启动。 - 要是关掉后好了,要么给Docker网络加放行规则,要么重置iptables:
iptables -F iptables -X systemctl restart docker
5. 换个靠谱的PostgreSQL镜像
有些旧的PostgreSQL镜像可能网络配置有坑,试试官方的13-alpine版本,轻量还不容易出问题:
services: postgres: image: postgres:13-alpine # 其他配置不变 ...
总结
先搞定DNS解析的问题,因为两个异常都和网络请求有关。先解决PostgreSQL容器的DNS错误(比如重启Docker、调整网络DNS),再验证SonarQube能不能连上PostgreSQL,基本就能解决Socket超时的问题了。
内容的提问来源于stack exchange,提问作者dssof
相关产品推荐
相关产品推荐

