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

WSL环境下Prometheus状态Down且无法连接localhost问题求助

排查与解决WSL2环境下Prometheus无法连接Docker Daemon的问题

看起来你在WSL2环境中配置Docker监控时遇到了棘手的连接问题——Prometheus状态一直显示Down,连不上localhost。结合你的环境信息,我来帮你一步步拆解排查,找到解决方法:

一、先确认Docker Daemon的Metrics配置是否真的生效

你已经在daemon.json里配置了metrics-addr,但用service docker start启动时,这个配置可能没被正确加载,这是WSL2里常见的小坑:

  • 第一步:检查Docker启动参数
    执行这条命令看看dockerd的实际启动参数:

    ps aux | grep dockerd
    

    如果输出里没有--metrics-addr 0.0.0.0:9323和--experimental,说明配置没生效。

  • 第二步:确保配置文件路径和权限正确
    WSL2里Docker的配置文件默认在/etc/docker/daemon.json,如果之前的文件位置不对,先重新创建并设置权限:

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<EOF
    {"metrics-addr" : "0.0.0.0:9323", "experimental": true}
    EOF
    

    然后重启Docker服务,让配置生效:

    sudo service docker stop
    sudo service docker start
    
  • 第三步:验证Metrics端点是否能访问
    在WSL2终端里直接curl一下metrics接口:

    curl http://localhost:9323/metrics
    

    如果能返回一堆metrics数据,说明Daemon的配置没问题;如果不行,检查WSL2的防火墙是否拦截了9323端口——可以临时关闭防火墙测试:sudo ufw disable(如果用的是ufw),或者用netstat -tulpn | grep 9323确认dockerd确实在监听这个端口。

二、解决WSL2网络特殊性导致的容器连接问题

WSL2的网络环境比较特殊,容器里的localhost和WSL2实例的localhost不是一回事,直接用127.0.0.1或者$hostIP自然连不上。这里有两个靠谱的解决方法:

方法1:用WSL2内部IP配置Prometheus

先拿到WSL2实例的内部IP:

wsl_ip=$(hostname -I | awk '{print $1}')

然后我们需要自定义Prometheus的配置文件,让它指向这个IP的metrics端口。先在本地创建一个prometheus.yml:

global:
  scrape_interval:     15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'docker'
    static_configs:
      - targets: ['${WSL_IP}:9323']

最后启动容器时挂载这个配置文件,同时传入WSL_IP环境变量:

docker run -d -p 9090:9090 \
  -e WSL_IP=$wsl_ip \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  diamol/prometheus:2.13.1

方法2:用Host网络模式启动Prometheus

更简单的方式是让Prometheus容器共享WSL2实例的网络命名空间,这样容器里的localhost就直接指向WSL2的localhost,能直接访问到Docker Daemon的metrics:

docker run -d --network host diamol/prometheus:2.13.1

注意:这种模式下不需要加-p 9090:9090,直接访问http://localhost:9090就能打开Prometheus UI。

三、关于systemctl启动Docker的报错(可选)

你提到systemctl --user start docker-desktop报错,这是因为WSL2默认没启用systemd(除非你手动配置过),用service docker start启动是完全正确的,这个问题不影响Prometheus的连接,不用特意解决。如果实在想用systemd,可以去配置WSL2启用systemd,但没必要为这个问题折腾。

四、最后验证Prometheus状态

启动后打开浏览器访问http://localhost:9090/targets(用Host模式的话),或者http://<WSL2_IP>:9090/targets(用端口映射的话),看看docker job的状态是不是变成Up了。如果还是Down,再检查这几点:

  • Prometheus配置文件里的target地址是不是和WSL2的IP一致
  • WSL2的防火墙有没有放开9323端口的入站请求
  • Docker Daemon是不是真的在监听9323端口(用netstat -tulpn | grep 9323确认)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:12:43