Docker环境下Logstash无法连接PostgreSQL数据库的解决方法
解决Docker环境下Logstash无法连接PostgreSQL的问题
问题核心梳理
错误提示Connection to localhost:5432 refused,但你的logstash.conf里配置的连接端口是2022,这里有两个致命问题:
- Docker容器内的
localhost指的是容器自身,不是宿主机,直接用它访问外部数据库必然失败 - 错误里的连接端口和配置端口不匹配,要么是配置没生效,要么是PostgreSQL实际监听的是默认端口5432
分步解决办法
1. 替换Docker容器内的localhost地址
这是Docker环境下跨服务连接的核心坑,按场景调整:
- 如果PostgreSQL跑在宿主机:换成宿主机的局域网IP(比如
192.168.3.10)或者Docker网关IP(默认通常是172.17.0.1) - 如果PostgreSQL是Docker容器:直接用容器名称或者Docker Compose里的服务名(比如你的Elasticsearch用了
elasticsearch:9200,同理写postgres:5432)
2. 统一数据库端口配置
先确认PostgreSQL实际监听的端口:
- 查看PostgreSQL的
postgresql.conf文件,找到port参数,默认是5432,如果你确实改了2022,要确保配置已经重启生效 - 修正
logstash.conf里的jdbc_connection_string,确保端口和数据库实际端口一致,比如:jdbc_connection_string => "jdbc:postgresql://192.168.3.10:5432/testdb"
3. 开放PostgreSQL的外部连接权限
PostgreSQL默认只允许本地连接,需要修改配置:
- 编辑
pg_hba.conf,添加允许Logstash所在网段的规则,比如Docker网桥网段:host testdb postgres 172.17.0.0/16 scram-sha-256 - 重启PostgreSQL服务,让配置生效
4. 验证Logstash配置是否加载
检查logstash.yml里的path.config是/usr/share/logstash/pipeline,要确保你的logstash.conf确实放在这个目录下,并且容器启动时正确挂载了本地配置目录到容器内的这个路径
5. 测试容器到数据库的网络连通性
进入Logstash容器,手动测试网络:
# 进入容器 docker exec -it 你的logstash容器名 bash # ping测试IP连通性 ping 192.168.3.10 # telnet测试端口是否开放 telnet 192.168.3.10 5432
如果不通,检查宿主机防火墙是否开放了5432端口,或者Docker网络是否有隔离限制
内容的提问来源于stack exchange,提问作者zxcccc
相关产品推荐
相关产品推荐

