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

Docker服务名称解析故障求助:Prometheus无法访问Exporter

Docker Stack中Prometheus无法通过服务名访问Node Exporter的DNS解析问题

问题背景

原本通过以下Docker Compose文件定义的Stack服务可正常运行,Prometheus能通过服务名exporter访问Node Exporter,但近期该功能失效,怀疑是组件更新导致,已确认是DNS解析问题(容器IP可正常访问,服务名解析失败)。

version: "3.7"
services:
  exporter:
    image: prom/node-exporter:latest
    volumes:
      - /sys:/host/sys:ro
      - /:/rootfs:ro
      - /proc:/host/proc:ro
    deploy:
      mode: global
    networks:
      - monitoring

  prometheus:
    image: prom/prometheus:latest
    volumes:
      - /var/apps/monitoring/prometheus-data:/prometheus:rw
      - /var/apps/monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
    deploy:
      mode: replicated
      replicas: 1
    networks:
      - monitoring

networks:
  monitoring:
    external: true
    
volumes:
  prometheus-data:

已完成的排查操作

  • 执行docker network inspect monitoring确认外部网络monitoring中包含两个服务的容器,结果显示容器均已加入该网络;
  • 进入Prometheus容器执行nslookup exporter及nslookup monitoring_exporter均返回NXDOMAIN错误;
  • 使用wget -O - http://monitoring_exporter:9100/metrics提示地址错误,但直接使用Exporter容器IP访问http://<容器IP>:9100/metrics可正常获取指标。

排查思路与解决方案

1. 修正全局服务的DNS访问规则

Docker Swarm中,全局模式(global mode)的服务没有虚拟IP(VIP),直接使用服务名exporter无法解析,必须使用tasks.<服务名>格式来获取所有实例的IP列表:

  • 在Prometheus容器内执行nslookup tasks.exporter,若能正常返回所有Exporter容器的IP,说明是服务名使用格式错误。

2. 更新Prometheus的抓取配置

修改/var/apps/monitoring/prometheus.yml中的scrape配置,改用动态DNS服务发现适配全局服务:

  • 错误配置(静态服务名):
    scrape_configs:
      - job_name: 'node_exporter'
        static_configs:
          - targets: ['exporter:9100']
    
  • 正确配置(动态DNS发现):
    scrape_configs:
      - job_name: 'node_exporter'
        dns_sd_configs:
          - names: ['tasks.exporter']
            type: 'A'
            port: 9100
    
    配置完成后重启Prometheus服务:docker service update --force <你的prometheus服务名>

3. 检查Docker Swarm网络的兼容性

执行docker network inspect monitoring查看Scope字段:

  • 若字段值为local,说明该网络不是Swarm管理的overlay网络,Swarm服务发现无法在其上正常工作。需重新创建Swarm范围的外部网络:
    docker network rm monitoring
    docker network create --driver overlay --attachable monitoring
    
    之后重新部署Stack服务。

4. 验证容器内的DNS配置

进入Prometheus容器执行cat /etc/resolv.conf,确认nameserver指向Docker内置DNS(通常为127.0.0.11):

  • 若指向外部DNS服务器,会导致Swarm内部服务名无法解析,可通过重新部署服务强制刷新DNS配置。

5. 刷新Swarm服务的网络缓存

强制重启Prometheus服务,刷新其网络配置和DNS缓存:

docker service update --force <你的prometheus服务名>

内容的提问来源于stack exchange,提问作者JSchirrmacher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:36:27