从WSL向Windows暴露Docker守护进程遇问题求助
问题排查与解决方案
1. WSL网络端口转发缺失
WSL 2采用NAT网络模式,直接在WSL内绑定0.0.0.0:2375后,Windows主机无法直接访问该端口,需手动配置端口转发:
- 先在WSL内确认Docker守护进程已监听2375端口:
若输出包含ss -tulpn | grep 23750.0.0.0:2375,说明服务端监听配置生效。 - 在Windows管理员权限的PowerShell中执行以下操作:
- 获取当前WSL的IP地址(WSL内执行
hostname -I | awk '{print $1}',得到类似172.17.0.2的地址)。 - 添加端口转发规则:
netsh interface portproxy add v4tov4 listenport=2375 listenaddress=0.0.0.0 connectport=2375 connectaddress=你的WSL_IP地址 - 允许Windows防火墙放行2375端口:
New-NetFirewallRule -DisplayName "Docker WSL" -Direction Inbound -Protocol TCP -LocalPort 2375 -Action Allow -Profile Private
- 获取当前WSL的IP地址(WSL内执行
2. Docker配置方式不持久化且存在冲突
直接修改/lib/systemd/system/docker.service会被系统更新覆盖,且易与Docker默认配置冲突,正确配置方式如下:
- 在WSL内创建/编辑Docker守护进程配置文件:
添加以下内容(已有其他配置则合并):sudo nano /etc/docker/daemon.json{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"], "tls": false } - 修改
/lib/systemd/system/docker.service,移除ExecStart行中的-H参数(避免与daemon.json配置冲突),修改后该行应为:ExecStart=/usr/bin/dockerd - 重新加载systemd并重启Docker服务:
sudo systemctl daemon-reload sudo systemctl restart docker
3. Windows环境变量配置未生效或错误
- 确保Windows的
DOCKER_HOST环境变量设置为tcp://localhost:2375(利用端口转发,无需直接写WSL的动态IP)。 - 设置完成后,必须重启命令行窗口(PowerShell/CMD),让环境变量生效。
4. 端口转发持久化(可选,解决WSL重启后失效问题)
WSL重启后IP会变化,端口转发规则会失效,可通过启动脚本自动配置:
- 在WSL用户目录下创建启动脚本
~/.wsl_startup.sh:#!/bin/bash sudo systemctl start docker WSL_IP=$(hostname -I | awk '{print $1}') powershell.exe -Command "netsh interface portproxy delete v4tov4 listenport=2375; netsh interface portproxy add v4tov4 listenport=2375 listenaddress=0.0.0.0 connectport=2375 connectaddress=$WSL_IP" - 给脚本添加执行权限:
chmod +x ~/.wsl_startup.sh - 在
/etc/profile末尾添加一行:~/wsl_startup.sh,确保WSL启动时自动执行脚本。
完成以上步骤后,在Windows命令行执行docker ps,若能正常返回容器列表则配置成功。
内容的提问来源于stack exchange,提问作者Michele Ietri
相关产品推荐
相关产品推荐

