Docker Compose环境下Filebeat无法连接Logstash的故障求助
这个问题我之前踩过一模一样的坑!核心原因是Docker容器里的127.0.0.1指向的是容器自身的localhost,而不是宿主机。你在宿主机上用telnet能通127.0.0.1:5044,但Filebeat容器里访问这个地址其实是在连自己容器的5044端口,自然会被拒绝。
下面给你几个针对性的解决方案,按优先级推荐:
方案一:让两个容器加入同一个Docker网络(最稳定)
因为你用了独立的docker-compose.yml部署,默认情况下两个容器会在各自的默认网络里,互相不能直接访问。我们可以手动创建一个共享网络,让它们加入:
先创建自定义Docker网络:
docker network create elastic-shared-network修改Logstash的
docker-compose.yml,让它加入这个网络:version: '2' services: logstash: # 你的镜像、端口映射、配置挂载等原有配置... networks: - elastic-shared-network networks: elastic-shared-network: external: true修改Filebeat的
docker-compose.yml,同样加入这个网络,并且把输出地址改成Logstash容器的服务名(比如你的Logstash服务名是logstash):version: '2' services: filebeat: image: docker.elastic.co/beats/filebeat:6.2.3 # 你的其他配置... networks: - elastic-shared-network # 同时要确保filebeat.yml里的输出配置是: # output.logstash: # hosts: ["logstash:5044"] networks: elastic-shared-network: external: true
这样两个容器就能通过服务名直接通信,不用依赖宿主机IP,环境迁移也更方便。
方案二:用宿主机IP替代127.0.0.1(适合快速测试)
如果不想调整网络,你需要把Filebeat配置里的127.0.0.1换成宿主机的实际IP地址(比如192.168.1.105),或者Docker提供的特殊域名:
- 对于Docker Desktop(Mac/Windows),可以直接用
host.docker.internal - 对于Linux,需要确保Logstash容器的5044端口已经映射到宿主机,并且用宿主机的局域网IP
修改Filebeat的output.logstash.hosts配置:
output.logstash: hosts: ["host.docker.internal:5044"] # 或者替换成你的宿主机实际IP:5044
同时一定要检查Logstash的输入插件配置,确保它绑定的是0.0.0.0而不是127.0.0.1,否则容器外(包括其他容器)根本访问不了:
input { beats { port => 5044 host => "0.0.0.0" # 必须设置为0.0.0.0,默认可能是这个,但最好确认 } }
最后验证
重启两个容器后,查看Filebeat的日志确认状态:
docker logs <你的filebeat容器名称>
如果不再出现connection refused的报错,就说明连接成功了。
内容的提问来源于stack exchange,提问作者Joey Lee

