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

Docker容器中Rsyslog与Fluentd无法通信问题求助

解决Rsyslog容器无法连接Fluentd容器的问题

我来帮你排查这个Connection refused的问题,结合你的Docker Compose配置和日志,主要有几个常见的原因和对应的解决办法:

1. Depends_on不保证Fluentd服务就绪

你在rsyslog服务里配置了depends_on: ["fluentd"],但Docker的depends_on仅能确保fluentd容器先启动,不会等待Fluentd内部的服务完全就绪并监听端口。这就导致rsyslog启动时,Fluentd可能还在加载配置或初始化,9881端口还没开放,所以出现连接拒绝。

解决方案:用健康检查(Healthcheck)确保服务就绪

修改你的docker-compose.yml,给fluentd添加健康检查规则,让rsyslog等Fluentd服务真正就绪后再启动:

fluentd:
  build: ./fluentd
  volumes:
    - ./fluentd/conf:/fluentd/etc
  ports:
    - "9880:9880"
    - "9880:9880/udp"
    - "9881:9881"
    - "9881:9881/udp"
  networks:
    - demo-network
  healthcheck:
    test: ["CMD", "nc", "-z", "localhost", "9881"] # 检查9881端口是否开放
    interval: 5s # 每5秒检查一次
    timeout: 3s # 超时时间3秒
    retries: 5 # 最多重试5次,仍失败则标记为不健康

rsyslog:
  image: vimagick/rsyslog
  volumes:
    - ./rsyslog/config/rsyslog.conf:/etc/rsyslog.conf
    - ./rsyslog/data:/var/log
  ports:
    - "8514:514"
    - "8514:514/udp"
    - "1601:1601"
  depends_on:
    fluentd:
      condition: service_healthy # 仅当fluentd健康检查通过时才启动
  networks:
    - demo-network
  environment:
    - TX=UTC

2. Fluentd配置未正确监听9881端口

要确认你的Fluentd配置文件(./fluentd/conf/fluent.conf)是否真的在监听9881端口,并且允许外部容器访问:

正确的Fluentd Syslog源配置示例

确保配置里的bind是0.0.0.0(允许所有网卡访问),而不是localhost(仅容器内部可访问),同时指定对应的协议:

# 监听TCP 9881端口
<source>
  @type syslog
  port 9881
  bind 0.0.0.0
  protocol_type tcp
  tag rsyslog.tcp
</source>

# 监听UDP 9881端口(如果需要UDP转发的话)
<source>
  @type syslog
  port 9881
  bind 0.0.0.0
  protocol_type udp
  tag rsyslog.udp
</source>

如果你的Fluentd只配置了TCP,那rsyslog里的UDP转发(@fluentd:9881)会失败;反之同理。可以根据需求调整rsyslog或Fluentd的协议配置。

3. 验证容器间的网络连通性

如果上面两步都没问题,可以手动验证rsyslog容器能否访问fluentd的9881端口:

  1. 先找到rsyslog容器的ID或名称:
docker ps
  1. 进入rsyslog容器,测试连通性:
# 测试主机名解析(应该能返回fluentd容器的IP)
docker exec -it <rsyslog-container-name> ping fluentd

# 测试9881端口是否开放
docker exec -it <rsyslog-container-name> telnet fluentd 9881
  • 如果ping fluentd失败:说明Docker网络有问题,但你的配置里两个服务都在demo-network,这种情况很少见,可以尝试重建网络:docker-compose down && docker-compose up
  • 如果telnet失败:说明Fluentd确实没在9881端口监听,回到步骤2检查Fluentd配置。

4. 检查Rsyslog的转发配置

你的rsyslog.conf里同时配置了UDP和TCP转发:

*.* @fluentd:9881
*.* @@fluentd:9881

这本身没问题,但如果Fluentd只支持其中一种协议,另一种会报错。可以暂时注释掉其中一条,先验证单协议转发是否正常,再逐步扩展。


内容的提问来源于stack exchange,提问作者Ed Software Architect

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 07:57:35