WSL环境下Prometheus状态Down且无法连接localhost问题求助
看起来你在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

