Docker环境下Logstash无法连接ElasticSearch:连接被拒绝
你遇到的Logstash无法连接Elasticsearch的问题,根源是配置拼写错误、容器网络访问路径错误和配置文件加载路径错误,另外还有服务启动时序的小问题,下面一步步帮你解决:
1. 修复Logstash输出插件的拼写错误
你的logstash.conf里输出插件名称拼错了:elasitcsearch → 正确的是elasticsearch,这个错误会直接导致Logstash无法加载正确的输出插件,进而引发连接问题。
修改后的logstash.conf:
input { kafka { # 注意:如果Kafka运行在宿主机,需替换为宿主机IP而非localhost;如果Kafka是容器,用对应服务名 bootstrap_servers => "你的Kafka地址:9092" topics => ["topic"] } } output { elasticsearch { # 这里修正拼写错误 hosts => ["http://elasticsearch:9200"] # 用docker-compose服务名访问ES容器 index => "topic" workers => 1 } # 新增stdout输出方便调试 stdout { codec => rubydebug } }
2. 修正Logstash的配置文件加载路径
你的docker-compose.yml中,已经把本地./logstash_pipeline/挂载到了容器内的/usr/share/logstash/pipeline目录,Logstash默认会自动加载这个目录下的.conf文件,但你用command指定了一个宿主机的绝对路径(容器内不存在这个路径),导致Logstash找不到配置文件,这也是日志里No config files found in path错误的原因。
修改docker-compose.yml中logstash的相关配置:
logstash: image: logstash:8.6.0 container_name: logstash #restart: always volumes: - type: bind source: ./logstash_pipeline/ # 确保你的logstash.conf放在这个本地目录下 target: /usr/share/logstash/pipeline read_only: true # 删掉下面这行错误的自定义command,让Logstash自动加载pipeline目录 # command: logstash -f /home/ettore/Documenti/Portfolio/ELK/logstash/logstash.conf depends_on: - elasticsearch ports: - '9600:9600' environment: xpack.monitoring.enabled: true # 建议加上JVM参数限制内存,避免资源占用过高 LS_JAVA_OPTS: "-Xmx256m -Xms256m" networks: - elk
3. 解决容器间网络访问问题
Logstash容器内的localhost指向容器自身,而非宿主机或ES容器,必须用docker-compose中定义的服务名elasticsearch来访问ES(因为它们在同一个elk网络下,Docker会自动解析服务名到对应容器的IP)。
这一点我们已经在logstash.conf的output部分修正,参考了Kibana的正确配置逻辑。
4. 处理Elasticsearch启动延迟问题
depends_on只会等待ES容器启动,不会等待ES服务完全就绪(ES启动需要加载插件、初始化集群,这个过程需要几秒)。可以先单独启动ES,等服务就绪后再启动其他组件:
验证ES是否就绪的方法:在宿主机执行curl http://localhost:9200,如果返回类似下面的JSON,说明ES已经就绪:
{ "name" : "elasticsearch", "cluster_name" : "elf-kafka-cluster", "cluster_uuid" : "...", "version" : { "number" : "8.6.0", ... }, "tagline" : "You Know, for Search" }
验证修复步骤
- 把修正后的
logstash.conf放到本地的./logstash_pipeline/目录下 - 停止所有容器:
docker-compose down - 启动ES容器,等待10秒左右确保就绪:
docker-compose up -d elasticsearch - 启动Kibana和Logstash:
docker-compose up -d kibana logstash - 查看Logstash日志:
docker logs -f logstash,如果没有连接拒绝的错误,且能看到Successfully started Logstash API endpoint和日志输出,说明配置正常。
内容的提问来源于stack exchange,提问作者ETisREAL

