“在本地跑得好好的OpenClaw一放到Docker容器里代理就不生效了……”“明明docker-compose.yml里配了环境变量容器里curl也能通但OpenClaw就是不走代理……”“更离谱的是容器能ping通外网但OpenClaw一跑采集任务就报网络错误……”如果你正在经历这些别怀疑人生——这不是你的问题是Docker网络和OpenClaw代理解析逻辑的“双重夹击”。我在这上面折腾了好几天踩了不下5个坑今天一次性帮你排完。一、问题现象容器内代理“失灵”的典型表现先看看你是不是遇到了以下情况现象可能原因宿主机curl能通代理容器内curl也能通但OpenClaw报错OpenClaw代理解析与Docker网络叠加问题容器能ping通外网但OpenClaw采集失败代理环境变量未正确传递到OpenClaw进程Docker Desktop刚升级后代理突然失效新版Docker的容器网络隔离策略变更配置了HTTP_PROXY但OpenClaw仍走直连YAML配置与容器环境变量冲突我一个一个说并给出对应的解决方案。二、踩坑一环境变量没传到容器里最常见2.1 错误做法很多人在docker run命令里只写了这样docker run -d --name openclaw openclaw/openclaw:latest然后在容器里手动export HTTP_PROXY——容器重启就没了。2.2 正确做法方案Adocker run时直接传环境变量docker run -d \ -e HTTP_PROXYhttp://隧道ID:密码tps.zdaye.com:8080 \ -e HTTPS_PROXYhttp://隧道ID:密码tps.zdaye.com:8080 \ -e NO_PROXYlocalhost,127.0.0.1 \ --name openclaw \ openclaw/openclaw:latest方案Bdocker-compose.yml配置推荐services: openclaw: image: openclaw/openclaw:latest container_name: openclaw ports: - 18789:18789 environment: - HTTP_PROXYhttp://隧道ID:密码tps.zdaye.com:8080 - HTTPS_PROXYhttp://隧道ID:密码tps.zdaye.com:8080 - NO_PROXYlocalhost,127.0.0.1 volumes: - openclaw_data:/root/.openclaw restart: unless-stopped volumes: openclaw_data:验证环境变量是否生效docker exec openclaw env | grep -i proxy应该能看到你配置的代理地址。三、踩坑二YAML配置和容器环境变量“打架”3.1 问题根源这是一个很容易被忽略的坑。回顾我们之前讲过的HTTP/HTTPS协议混淆问题——OpenClaw在处理YAML中的代理配置时可能存在解析缺陷。而当你在容器里同时做了两件事在config.yaml里配置了proxy字段通过-e传入了HTTP_PROXY环境变量OpenClaw的代理加载逻辑可能产生冲突导致两个都不生效。3.2 解决方案二选一别混用推荐方案只用环境变量注释掉YAML中的proxy配置# config.yaml - 代理配置注释掉让环境变量接管 # proxy: # http: http://... # https: http://...备选方案只用YAML配置不用环境变量但这意味着你需要把YAML文件挂载进容器并且要确保OpenClaw能正确解析可能会遇到协议混淆问题。我的建议在Docker环境中优先使用环境变量方案。这是最底层、最可靠的代理配置方式能绕开OpenClaw自己实现的代理解析逻辑。四、踩坑三Docker Desktop的容器网络隔离4.1 问题现象Docker Desktop 4.29.0及以上版本引入了“隔離容器”Air-Gapped Containers功能可以对容器网络流量施加自定义代理规则。这个功能本意是好的——帮助管理员限制容器网络访问保护敏感环境。但如果配置不当可能会意外拦截容器的代理流量。4.2 检查方法如果你用的是Docker Desktop检查一下admin-settings.json中是否有containersProxy配置{ containersProxy: { mode: manual, http: http://proxy.company.com:8080, https: http://proxy.company.com:8080, transparentPorts: * } }如果这里有配置Docker会强制容器的网络流量走这个代理覆盖你在容器内设置的环境变量。4.3 解决方案方案A如果你不需要这个功能删除或注释掉containersProxy配置方案B如果需要保留确保这里的代理地址配置正确且与OpenClaw的代理设置不冲突PAC文件配置示例function FindProxyForURL(url, host) { // 允许访问站大爷代理 if (dnsDomainIs(host, tps.zdaye.com)) { return DIRECT; } // 其他流量走公司代理 return PROXY corporate-proxy:8080; }五、踩坑四容器网络模式选错了5.1 常见错误用--network host导致代理配置失效有些用户为了让容器和宿主机共享网络会这样写docker run --network host ...这会导致容器使用宿主机的网络栈HTTP_PROXY环境变量可能被宿主机网络配置覆盖代理行为变得不可预测5.2 正确做法使用默认bridge网络 环境变量services: openclaw: image: openclaw/openclaw:latest # 不要用 network_mode: host # 让Docker使用默认bridge网络 environment: - HTTP_PROXYhttp://隧道ID:密码tps.zdaye.com:8080 - HTTPS_PROXYhttp://隧道ID:密码tps.zdaye.com:80805.3 特殊场景容器需要访问宿主机的代理服务如果你在宿主机上运行了一个代理服务比如Clash、v2ray想让容器通过它上网方案A使用host.docker.internalDocker Desktop专用environment: - HTTP_PROXYhttp://host.docker.internal:7890 - HTTPS_PROXYhttp://host.docker.internal:7890方案B使用宿主机IPLinux Docker# 先获取宿主机IP ip addr show docker0 | grep inet # 输出示例inet 172.17.0.1/16environment: - HTTP_PROXYhttp://172.17.0.1:7890 - HTTPS_PROXYhttp://172.17.0.1:7890六、踩坑五容器内DNS解析问题6.1 问题现象代理配置看起来没问题环境变量也传进去了但OpenClaw报错Error: getaddrinfo ENOTFOUND tps.zdaye.com6.2 原因分析容器内的DNS配置可能无法正确解析站大爷的代理域名。这在某些云服务器或自定义Docker网络中很常见。6.3 解决方案方案A使用IP地址代替域名联系站大爷客服获取代理入口的IP地址然后environment: - HTTP_PROXYhttp://隧道ID:密码123.123.123.123:8080方案B自定义容器DNSservices: openclaw: image: openclaw/openclaw:latest dns: - 114.114.114.114 - 8.8.8.8 environment: - HTTP_PROXYhttp://隧道ID:密码tps.zdaye.com:8080方案C在容器内测试DNS解析docker exec openclaw nslookup tps.zdaye.com如果不通说明DNS确实有问题用方案A或B。七、完整配置模板复制即用下面是一份经过实测、可直接使用的docker-compose.ymlversion: 3.8 services: openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: unless-stopped ports: - 18789:18789 environment: # 站大爷隧道代理配置 - HTTP_PROXYhttp://你的隧道ID:你的隧道密码tps.zdaye.com:8080 - HTTPS_PROXYhttp://你的隧道ID:你的隧道密码tps.zdaye.com:8080 - NO_PROXYlocalhost,127.0.0.1 # 时区设置 - TZAsia/Shanghai # DNS配置如果解析有问题取消注释 # dns: # - 114.114.114.114 # - 8.8.8.8 volumes: - openclaw_data:/root/.openclaw - openclaw_cache:/root/.cache # 健康检查可选 healthcheck: test: [CMD, curl, -f, http://localhost:18789] interval: 30s timeout: 10s retries: 3 volumes: openclaw_data: openclaw_cache:启动命令docker-compose up -d验证代理是否生效# 进入容器 docker exec -it openclaw bash # 测试代理连通性 curl -I https://httpbin.org/ip # 或者用OpenClaw指令 openclaw gateway status八、网络模式选择建议总结网络模式适用场景代理兼容性推荐度bridge默认大多数场景容器需要独立网络⭐⭐⭐⭐⭐ 最佳最推荐host容器需要极致网络性能不关心隔离⭐⭐ 可能冲突不推荐用于代理场景none完全离线容器❌ 不支持代理不适用自定义网络多容器互联⭐⭐⭐⭐ 良好高级用户一句话总结普通用户用默认bridge网络 环境变量配置代理 最稳不要用--network host会让代理行为变得不可预测不要混用YAML配置和环境变量二选一九、快速排障清单如果配置完还是不行按顺序检查[ ] 环境变量是否传入了容器→docker exec openclaw env | grep -i proxy[ ] 代理地址格式是否正确→ 不要漏掉http://前缀和认证信息[ ] 容器内能否curl通代理→docker exec openclaw curl -x http://... https://httpbin.org/ip[ ] DNS能否解析代理域名→docker exec openclaw nslookup tps.zdaye.com[ ] Docker Desktop是否有containersProxy配置拦截→ 检查admin-settings.json[ ] 是否混用了YAML配置和环境变量→ 注释掉YAML中的proxy[ ] 网络模式是不是host→ 改回bridge总结Docker部署OpenClaw站大爷隧道代理核心就三句话环境变量传代理别用YAML配置网络模式用bridge别用host二选一别混用环境变量最稳把这三点记住基本就不会踩坑了。如果还不行按上面的排障清单一步步查总能找到问题。