1019 字
5 分钟
wsl2的docker 开启代理

在 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 中的 nameserver IP(如 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 服务#

现象

Terminal window
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)。

  1. 在 Windows 执行:

    Terminal window
    ipconfig

    找到当前网络的 IPv4 地址(例如 192.168.137.1)。

  2. 在 WSL 中设置代理:

    Terminal window
    export WIN_IP=192.168.137.1
    export HTTP_PROXY="http://$WIN_IP:7890"
    export HTTPS_PROXY="http://$WIN_IP:7890"
  3. 测试:

    Terminal window
    curl -x http://$WIN_IP:7890 https://httpbin.org/ip
    # 返回公网 IP,说明代理成功!

❌ 问题 2:Docker 拉取镜像失败(connection refused#

现象

Terminal window
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 配置系统级代理。

Terminal window
# 创建配置目录
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
# 重载并重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

验证是否生效:

Terminal window
sudo systemctl show --property=Environment docker
# 应包含你设置的代理地址

❌ 问题 3:权限错误(permission denied#

现象

Terminal window
docker run ...
# permission denied while trying to connect to the Docker daemon socket

原因:当前用户不在 docker 用户组。

✅ 解决方案(可选):

Terminal window
sudo usermod -aG docker $USER
# 然后重启 WSL 或重新登录

或者始终使用 sudo docker(简单但不够优雅)。


三、成功运行 GROBID#

完成上述配置后,执行:

Terminal window
# 拉取并运行轻量版(推荐 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 测试:

Terminal window
curl -d "citations=Smith, J. (2020). Deep Learning." \
-X POST http://localhost:8070/api/processCitation

四、关于 -full-crf 版本的选择#

版本适用场景是否支持 ARM64GPU
0.8.2-full高精度、有 GPU、资源充足✅(但依赖复杂)
0.8.2-crf快速、低资源、批量处理✅(推荐)

💡 ARM64 设备(如树莓派)强烈推荐使用 -crf 版本,体积小、内存占用低、启动快。


五、总结#

通过本次实践,我们明确了几个关键点:

  1. WSL2 NAT 模式下,必须使用 Windows 局域网 IP(如 192.168.137.1),不能用 localhost/etc/resolv.conf 中的 nameserver IP
  2. Docker daemon 需要单独配置代理,不能依赖 shell 环境变量
  3. Clash 必须开启 Allow LAN 并监听 0.0.0.0,Windows 防火墙需放行 7890 端口
  4. ARM64 环境优先选择 grobid:0.8.2-crf 镜像

现在,你可以在 WSL2 中无缝使用 Windows 代理,高效部署各类 Docker 应用!


附录:常用命令速查#

Terminal window
# 设置代理(WSL)
export WIN_IP=192.168.137.1
export HTTP_PROXY="http://$WIN_IP:7890"
export HTTPS_PROXY="http://$WIN_IP:7890"
# 配置 Docker 代理
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo 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-reload
sudo systemctl restart docker
# 运行 GROBID(轻量版)
docker run --rm --init --ulimit core=0 -p 8070:8070 grobid/grobid:0.8.2-crf

🌟 希望这篇文章能帮你少走弯路!欢迎点赞、收藏~


wsl2的docker 开启代理
https://fuwari.vercel.app/posts/proxy/linux_proxy/
作者
江湖一条鱼
发布于
2026-01-15
许可协议
CC BY-NC-SA 4.0