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

Docker Compose环境下Filebeat无法连接Logstash的故障求助

解决Filebeat容器无法连接独立部署的Logstash容器问题

这个问题我之前踩过一模一样的坑!核心原因是Docker容器里的127.0.0.1指向的是容器自身的localhost,而不是宿主机。你在宿主机上用telnet能通127.0.0.1:5044,但Filebeat容器里访问这个地址其实是在连自己容器的5044端口,自然会被拒绝。

下面给你几个针对性的解决方案,按优先级推荐:

方案一:让两个容器加入同一个Docker网络(最稳定)

因为你用了独立的docker-compose.yml部署,默认情况下两个容器会在各自的默认网络里,互相不能直接访问。我们可以手动创建一个共享网络,让它们加入:

  1. 先创建自定义Docker网络:

    docker network create elastic-shared-network
    
  2. 修改Logstash的docker-compose.yml,让它加入这个网络:

    version: '2'
    services:
      logstash:
        # 你的镜像、端口映射、配置挂载等原有配置...
        networks:
          - elastic-shared-network
    networks:
      elastic-shared-network:
        external: true
    
  3. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:28:17