Linux主机自定义Docker网络中Prometheus容器无法抓取暴露的Docker指标问题
解决Linux环境下Prometheus同时抓取自定义网络容器与主机Docker指标的问题
我之前也碰到过一模一样的问题,这本质是Linux Docker的网络隔离机制导致的——自定义桥接网络和主机网络之间默认有防火墙/iptables规则阻隔,虽然你配置了host.docker.internal指向主机网关,但容器还是没法突破这个限制。下面给你几个可行的解决方案,按推荐程度排序:
方案1:使用Docker Exporter容器(最佳实践)
这是最稳妥的方式,完全避免跨网络访问的问题,还符合Prometheus监控的最佳实践:
- 在你的
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
- 修改Prometheus配置文件
prometheus.yml中的docker_metrics任务,直接指向同一网络里的Exporter容器:
- job_name: 'docker_metrics' static_configs: - targets: ['docker-exporter:9323'] # Docker Exporter默认端口是9323
- 重启Prometheus和新添加的Exporter容器,这样Prometheus就能在同一个自定义网络里抓取Docker指标,同时也能正常抓取其他服务的metrics了。
这种方式不用暴露主机端口,安全性更高,也不会受网络隔离规则影响。
方案2:调整主机防火墙/iptables规则,允许自定义网络访问主机9933端口
如果你不想新增容器,可以通过开放防火墙规则让自定义网络的容器访问主机端口:
- 先查出自定义网络
test-network的子网范围:
docker network inspect test-network | grep Subnet
输出大概是"Subnet": "172.20.0.0/16"这样的格式。
- 根据子网添加规则(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
- 重启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
相关产品推荐
相关产品推荐

