如何在Docker Compose中通过PromLens连接Prometheus?
解决PromLens无法连接Docker Compose中Prometheus的问题
问题原因
你遇到的核心问题有两个:
- 域名解析限制:
prometheus是Docker Compose内部网络的服务域名,仅容器之间可识别,但你的浏览器运行在宿主机环境,无法解析该域名。 - 跨域(CORS)限制:即使改用宿主机的
localhost:9090,Prometheus默认也不允许跨域请求,导致浏览器无法正常获取数据。
方案一:开启Prometheus跨域支持(最简方案)
直接修改Prometheus配置开启CORS,然后用宿主机地址连接:
- 创建本地Prometheus配置文件
prometheus.yml:
global: scrape_interval: 15s scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] # 添加跨域配置 web: enable-cors: true cors-origin: "http://localhost:8080" # 仅允许PromLens的域名访问,生产环境建议严格限制
- 修改Docker Compose文件,挂载配置文件:
services: prometheus: image: prom/prometheus:v2.50.1 ports: - 9090:9090 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml # 挂载本地配置到容器内 promlens: image: prom/promlens:v0.3.0 ports: - 8080:8080
- 重启容器:
docker-compose down && docker-compose up -d
- 在PromLens中输入
http://localhost:9090即可正常连接。
方案二:Docker内部网络隔离方案(适合生产环境)
如果不想将Prometheus暴露给宿主机,可通过Nginx反向代理实现内部网络访问+跨域支持:
- 修改Docker Compose,添加Nginx代理服务:
services: prometheus: image: prom/prometheus:v2.50.1 networks: - monitoring # 仅加入内部监控网络 promlens: image: prom/promlens:v0.3.0 ports: - 8080:8080 networks: - monitoring nginx: image: nginx:alpine ports: - 9090:80 volumes: - ./nginx.conf:/etc/nginx/nginx.conf networks: - monitoring networks: monitoring: driver: bridge
- 创建Nginx配置文件
nginx.conf:
events {} http { server { listen 80; location / { proxy_pass http://prometheus:9090; # 配置跨域头 add_header Access-Control-Allow-Origin "http://localhost:8080"; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type"; if ($request_method = OPTIONS) { return 204; } } } }
- 重启容器后,在PromLens中输入
http://localhost:9090即可连接。
内容的提问来源于stack exchange,提问作者Maxim Suslov
相关产品推荐
相关产品推荐

