如何让其他设备客户端访问WSL中Docker部署的nats-server?
解决WSL中Docker化NATS Server无法被局域网设备访问的问题
问题原因
WSL2 环境中,Docker 默认会将端口绑定到 WSL 实例的私有 IP(通常是 172.x.x.x 段),而非主机的所有网卡接口。这就导致只有主机能通过 WSL 互通网络访问容器服务,但局域网内其他设备无法直接连接。而直接运行 nats-server.exe 时,程序默认绑定主机的 0.0.0.0,所以外部设备能正常访问。
解决方案
1. 修改 Docker 启动命令,强制端口绑定到所有网卡
将原启动命令中的端口映射改为绑定 0.0.0.0,这样容器端口会开放到 WSL 的所有可用网卡,配合 WSL 与主机的网络转发,外部设备就能通过主机 IP 访问:
docker run -d -p 0.0.0.0:4222:4222 -p 0.0.0.0:6222:6222 -p 0.0.0.0:8222:8222 --name my-nats-container nats:latest
0.0.0.0表示绑定当前实例的所有网卡接口,确保局域网设备的请求能穿透到容器。
2. 放行 Windows 防火墙入站规则
主机的 Windows 防火墙可能拦截了外部设备对这些端口的访问,需要手动添加入站规则:
- 打开「Windows Defender 防火墙 → 高级设置」
- 点击「入站规则」→「新建规则」
- 选择「端口」→ 勾选「TCP」,填入端口
4222,6222,8222 - 选择「允许连接」,应用到「域、专用、公网」(根据你的网络环境调整)
- 完成规则创建并命名(比如
NATS Server Ports)
3. (可选)检查 WSL 内部防火墙
如果 WSL 中启用了 ufw 等防火墙工具,需要同步放行对应端口:
sudo ufw allow 4222/tcp sudo ufw allow 6222/tcp sudo ufw allow 8222/tcp sudo ufw reload
4. (备选)使用 Docker Host 网络模式
直接让容器使用 WSL 的网络栈,无需端口映射,启动命令如下:
docker run -d --network host --name my-nats-container nats:latest
- 注意:此模式下容器会直接占用 WSL 的对应端口,需确保端口未被其他程序占用;客户端仍使用主机局域网 IP 访问。
客户端连接配置
客户端需使用主机的局域网 IPv4 地址(而非 WSL 的私有 IP),配合对应端口连接:
- 查看主机局域网 IP:在 Windows 命令行执行
ipconfig,找到当前网络适配器的 IPv4 地址(比如192.168.1.105) - 连接示例:
nats://192.168.1.105:4222或http://192.168.1.105:8222
内容的提问来源于stack exchange,提问作者Philly G
相关产品推荐
相关产品推荐

