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

Linux主机自定义Docker网络中Prometheus容器无法抓取暴露的Docker指标问题

解决Linux环境下Prometheus同时抓取自定义网络容器与主机Docker指标的问题

我之前也碰到过一模一样的问题,这本质是Linux Docker的网络隔离机制导致的——自定义桥接网络和主机网络之间默认有防火墙/iptables规则阻隔,虽然你配置了host.docker.internal指向主机网关,但容器还是没法突破这个限制。下面给你几个可行的解决方案,按推荐程度排序:

方案1:使用Docker Exporter容器(最佳实践)

这是最稳妥的方式,完全避免跨网络访问的问题,还符合Prometheus监控的最佳实践:

  1. 在你的docker-compose.yml中添加一个Docker Exporter容器,把它加入自定义的test-network:
docker-exporter:
  image: prometheus/docker-exporter:latest
  container_name: docker_exporter_test
  restart: unless-stopped
  command: ["--host=unix:///var/run/docker.sock"]
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro  # 只读挂载Docker套接字,保证安全
  networks:
    - test-network
  1. 修改Prometheus配置文件prometheus.yml中的docker_metrics任务,直接指向同一网络里的Exporter容器:
- job_name: 'docker_metrics'
  static_configs:
    - targets: ['docker-exporter:9323']  # Docker Exporter默认端口是9323
  1. 重启Prometheus和新添加的Exporter容器,这样Prometheus就能在同一个自定义网络里抓取Docker指标,同时也能正常抓取其他服务的metrics了。

这种方式不用暴露主机端口,安全性更高,也不会受网络隔离规则影响。

方案2:调整主机防火墙/iptables规则,允许自定义网络访问主机9933端口

如果你不想新增容器,可以通过开放防火墙规则让自定义网络的容器访问主机端口:

  1. 先查出自定义网络test-network的子网范围:
docker network inspect test-network | grep Subnet

输出大概是"Subnet": "172.20.0.0/16"这样的格式。

  1. 根据子网添加规则(Ubuntu常用ufw或iptables,二选一即可):
  • 用iptables:
sudo iptables -A INPUT -p tcp -s 172.20.0.0/16 --dport 9933 -j ACCEPT
# 可选:保存规则,防止重启后失效
sudo iptables-save > /etc/iptables/rules.v4
  • 用ufw:
sudo ufw allow from 172.20.0.0/16 to any port 9933
  1. 重启Prometheus容器后,就能正常抓取host.docker.internal:9933的指标了。

方案3:让Prometheus容器加入多个网络

Docker允许容器同时连接多个网络,你可以让Prometheus既在自定义test-network,又连接到默认的bridge网络,这样它既能访问自定义网络的容器,又能通过默认网桥访问主机:

修改docker-compose.yml中Prometheus的networks部分:

prometheus:
  container_name: prom_test
  image: prom/prometheus:v2.30.3
  restart: unless-stopped
  command: "--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus --storage.tsdb.retention.time=45d"
  ports:
    - 9090:9090
  volumes:
    - ./data/prometheus:/prometheus
    - ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro
  extra_hosts:
    host.docker.internal: host-gateway
  networks:
    - test-network
    - bridge  # 添加默认网桥网络

之后同样需要确保防火墙允许默认网桥子网访问主机9933端口,这个方案比前两个稍复杂,推荐优先用方案1或2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:07:42