Docker Compose中app服务连接rsyslog日志容器I/O超时问题排查求助
问题根因&修复方案
1. 变量语法误用导致主机名解析错误
你在syslog-address中填写的${syslog-ng}属于Shell参数扩展语法:${VAR-default}的规则是当VAR变量未定义时,返回default作为默认值。由于你没有定义过syslog环境变量,该表达式最终返回值为ng,和报错信息里的lookup ng完全对应,直接导致域名解析失败。
2. Docker日志驱动的网络限制
Docker的日志驱动运行在宿主机的Docker Daemon进程中,默认无法解析Docker Compose内部网桥的服务名,直接写服务名syslog-ngDaemon无法识别对应服务。
3. 配置项不匹配&缺失
application服务的depends_on字段填的是logging,但你的syslog服务名为syslog-ng,依赖配置完全不生效syslog-ng服务没有暴露514端口,外部进程/Daemon无法访问
修复步骤
第一步:修改docker-compose.yml配置
调整后的配置参考如下:
# docker-compose.yml version: '3.9' services: # Svc 1 application: build: context: ./app dockerfile: Dockerfile container_name: gopkg logging: driver: syslog options: # 本地测试用宿主机地址+映射端口,后续接入Traefik时替换为Traefik的UDP负载入口地址即可 syslog-address: "udp://127.0.0.1:514" tag: gopkg depends_on: - syslog-ng # Svc 2 syslog-ng: build: context: ./syslog dockerfile: Dockerfile container_name: syslog-ng # 暴露UDP 514端口给Docker Daemon访问 ports: - "514:514/udp"
第二步:验证效果
重新执行docker-compose up -d启动服务,进入syslog-ng容器查看/var/log/messages,即可看到application服务发送的日志。
第三步:后续水平扩容适配
待你部署多实例rsyslog+Traefik负载时,仅需要把syslog-address中的地址替换为Traefik负责承接syslog流量的UDP入口地址即可,无需修改应用和rsyslog的内部配置。
内容的提问来源于stack exchange,提问作者aRustyDev
相关产品推荐
相关产品推荐

