Docker容器中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端口:
- 先找到rsyslog容器的ID或名称:
docker ps
- 进入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

