在 WSL2 + ARM64 环境下通过 Windows Clash 代理成功运行 GROBID
关键词:WSL2、Clash for Windows、Docker 代理、GROBID、ARM64、局域网代理、
connection refused解决方案
背景
最近我尝试在 Windows 11 的 WSL2(Ubuntu) 中部署 GROBID —— 一个用于学术 PDF 解析的强大工具。我的目标是:
- 利用 Windows 上运行的 Clash 作为全局代理;
- 在 WSL2 的 ARM64 环境(如树莓派或 ARM 云服务器模拟环境)中拉取并运行 GROBID;
- 避免直接在 Linux 中配置复杂网络。
然而,过程中遇到了多个典型问题:
curl能通,但docker pull失败;localhost:7890无法访问;/etc/resolv.conf中的nameserverIP(如10.255.255.254)不能用于 TCP 连接;- Docker daemon 不走 shell 代理。
本文将完整记录 从零到成功运行 GROBID 的全过程,供同样在 WSL2 + 代理环境下挣扎的朋友参考。
一、环境说明
| 组件 | 版本/说明 |
|---|---|
| 主机系统 | Windows 11 |
| 子系统 | WSL2 (Ubuntu 22.04) |
| 网络模式 | NAT 模式(非镜像网络) |
| 代理工具 | Clash for Windows(开启 Allow LAN) |
| 目标应用 | GROBID 0.8.2-crf(轻量版,适配 ARM64) |
| 设备架构 | ARM64(需注意镜像兼容性) |
二、关键问题与解决方案
❌ 问题 1:WSL2 无法通过 localhost 访问 Windows 服务
现象:
curl -x http://localhost:7890 https://httpbin.org/ip# Connection refused原因:
你的 WSL2 运行在 NAT 模式(非 Windows 11 默认的“镜像网络”),此时 localhost 仅指向 Linux 自身,无法访问 Windows 上的服务。
⚠️ 即使
netstat显示 Clash 监听0.0.0.0:7890,WSL2 NAT 模式下仍无法通过localhost连接。
✅ 解决方案:
使用 Windows 的真实局域网 IP(如 192.168.137.1)。
-
在 Windows 执行:
Terminal window ipconfig找到当前网络的 IPv4 地址(例如
192.168.137.1)。 -
在 WSL 中设置代理:
Terminal window export WIN_IP=192.168.137.1export HTTP_PROXY="http://$WIN_IP:7890"export HTTPS_PROXY="http://$WIN_IP:7890" -
测试:
Terminal window curl -x http://$WIN_IP:7890 https://httpbin.org/ip# 返回公网 IP,说明代理成功!
❌ 问题 2:Docker 拉取镜像失败(connection refused)
现象:
sudo docker run ... grobid/grobid:0.8.2-crf# Error: Get "https://registry-1.docker.io/v2/": connection refused原因:
虽然你在终端设置了代理,但 Docker daemon 是 systemd 服务,不继承 shell 环境变量,因此无法走代理。
✅ 解决方案:为 Docker daemon 配置系统级代理。
# 创建配置目录sudo mkdir -p /etc/systemd/system/docker.service.d
# 写入代理配置sudo tee /etc/systemd/system/docker.service.d/proxy.conf <<EOF[Service]Environment="HTTP_PROXY=http://192.168.137.1:7890"Environment="HTTPS_PROXY=http://192.168.137.1:7890"Environment="NO_PROXY=localhost,127.0.0.1,.local"EOF
# 重载并重启 Dockersudo systemctl daemon-reloadsudo systemctl restart docker验证是否生效:
sudo systemctl show --property=Environment docker# 应包含你设置的代理地址❌ 问题 3:权限错误(permission denied)
现象:
docker run ...# permission denied while trying to connect to the Docker daemon socket原因:当前用户不在 docker 用户组。
✅ 解决方案(可选):
sudo usermod -aG docker $USER# 然后重启 WSL 或重新登录或者始终使用 sudo docker(简单但不够优雅)。
三、成功运行 GROBID
完成上述配置后,执行:
# 拉取并运行轻量版(推荐 ARM64)sudo docker run --rm --init --ulimit core=0 -p 8070:8070 grobid/grobid:0.8.2-crf首次启动需等待 30–60 秒(加载模型),看到日志:
Started GROBID ... in X seconds即可在浏览器访问:
http://localhost:8070或通过 API 测试:
curl -d "citations=Smith, J. (2020). Deep Learning." \ -X POST http://localhost:8070/api/processCitation四、关于 -full 与 -crf 版本的选择
| 版本 | 适用场景 | 是否支持 ARM64 | GPU |
|---|---|---|---|
0.8.2-full | 高精度、有 GPU、资源充足 | ✅(但依赖复杂) | ✅ |
0.8.2-crf | 快速、低资源、批量处理 | ✅(推荐) | ❌ |
💡 ARM64 设备(如树莓派)强烈推荐使用
-crf版本,体积小、内存占用低、启动快。
五、总结
通过本次实践,我们明确了几个关键点:
- WSL2 NAT 模式下,必须使用 Windows 局域网 IP(如
192.168.137.1),不能用localhost或/etc/resolv.conf中的 nameserver IP; - Docker daemon 需要单独配置代理,不能依赖 shell 环境变量;
- Clash 必须开启
Allow LAN并监听0.0.0.0,Windows 防火墙需放行 7890 端口; - ARM64 环境优先选择
grobid:0.8.2-crf镜像。
现在,你可以在 WSL2 中无缝使用 Windows 代理,高效部署各类 Docker 应用!
附录:常用命令速查
# 设置代理(WSL)export WIN_IP=192.168.137.1export HTTP_PROXY="http://$WIN_IP:7890"export HTTPS_PROXY="http://$WIN_IP:7890"
# 配置 Docker 代理sudo mkdir -p /etc/systemd/system/docker.service.dsudo tee /etc/systemd/system/docker.service.d/proxy.conf <<< '[Service]Environment="HTTP_PROXY=http://192.168.137.1:7890"Environment="HTTPS_PROXY=http://192.168.137.1:7890"'
sudo systemctl daemon-reloadsudo systemctl restart docker
# 运行 GROBID(轻量版)docker run --rm --init --ulimit core=0 -p 8070:8070 grobid/grobid:0.8.2-crf🌟 希望这篇文章能帮你少走弯路!欢迎点赞、收藏~