【openclaw小技巧】Docker 部署 OpenClaw,如何优雅调用宿主机浏览器?
1
先说说为什么要折腾这个
OpenClaw 是一个相当好用的 AI Agent 框架,支持浏览器自动化操作——让 AI 直接操控浏览器,截图、填表、爬数据,一气呵成。
但问题来了:我用 Docker 跑 OpenClaw Gateway,容器里没有浏览器啊!
装一个无头 Chrome?可以,但体验很差——看不到浏览器在干嘛,调试全靠猜。而且很多场景(比如登录某些网站)就是需要真实浏览器窗口。
最理想的方案:Gateway 跑在 Docker 里,浏览器跑在宿主机上,Agent 一声令下,宿主机 Brave/Chrome 应声而起。
这篇文章就是把这条路走通的完整记录,坑我已经帮你踩完了 👇
2
整体架构,一句话说清
1Agent(飞书/Discord)2 ↓3Docker Gateway(注册 browser 工具,不执行)4 ↓ WebSocket(宿主机 localhost:18889)5宿主机 Node(轻量 WS 客户端,转发指令)6 ↓ CDP(127.0.0.1:18801)7宿主机 Brave/Chrome(真正干活的那个)8
三个关键认知:
-
Gateway 只负责”声明有这个工具”,不做浏览器操作 -
Node 是个轻量中转站,只转发指令,不搞复杂逻辑 -
CDP 通信全在宿主机本地完成,Node ↔ 浏览器走 127.0.0.1,安全高效
3
第一步:宿主机装上 Node
在 macOS 上,推荐用 launchd 装成后台服务,开机自启、挂了自动复活:
1# 安装为系统服务2openclaw node install --host 127.0.0.1 --port 1888934# 立即启动5openclaw node restart6
如果只是临时测一下,也可以前台跑:
openclaw node run --host 127.0.0.1 --port 18889
宿主机浏览器配置保持原样就行,Node 会自动读取:
1{2 "browser": {3 "enabled": true,4 "executablePath": "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",5 "profiles": {6 "openclaw": { "cdpPort": 18800, "color": "#FF4500" }7 }8 }9}10
4
第二步:Docker 容器配置
4.1
2.1 端口映射
先确保 Gateway 的 WebSocket 端口能被宿主机访问到:
1# docker-compose.yml2services:3 openclaw:4 ports:5 - "18889:18889"6
4.2
2.2 Gateway 配置
Docker 里的配置极其精简——只需要 browser.enabled: true:
1{2 "browser": {3 "enabled": true4 },5 "gateway": {6 "bind": "lan",7 "port": 188898 }9}10
⚠️ 重点:Docker 容器默认绑定 loopback,外部根本连不上。必须设
bind: "lan",让 Gateway 监听0.0.0.0。少写这一行,排查半天。
4.3
2.3 批准配对
Node 启动后会自动向 Gateway 发起配对请求。在 Docker 容器里执行:
1openclaw devices list # 查看待批准的设备2openclaw devices approve <device-id> # 批准3
批准后 Node 自动建连,整个过程几秒钟。
5
🔥 五大踩坑实录
5.1
坑一:SSRF 代理拦截
现象:Agent 操作浏览器时报 proxy environment variable conflict,导航直接挂。
原因:容器里设置了 HTTP_PROXY / HTTPS_PROXY,OpenClaw 的 SSRF 安全策略检测到代理变量后拒绝导航——合理但没想到。
方案 A(推荐)——移除或排除代理:
1environment:2 - NO_PROXY=localhost,127.0.0.1,host.docker.internal3
直接把本地地址排除出代理,干净利落。
方案 B——放宽安全策略(不推荐生产环境):
1{2 "browser": {3 "ssrfPolicy": {4 "dangerouslyAllowPrivateNetwork": true5 }6 }7}8
5.2
坑二:macOS CDP 端口死活绑不上 0.0.0.0
加了 --remote-debugging-address=0.0.0.0 参数,Chrome/Brave 照样只监听 127.0.0.1。这是 macOS 系统级限制,所有 Chromium 浏览器都这样。
好消息:对本方案没影响。Node 和浏览器都在同一台机器上,127.0.0.1 完全够用。
5.3
坑三:extraArgs 改了不生效
改完 browser.extraArgs 重启 Gateway,浏览器行为没变。因为 extraArgs 要重启浏览器进程才生效——关掉浏览器,下次 Agent 调用时会带上新参数。
5.4
坑四:Node 命令写错了
1# ❌ 不存在的参数,直接报错2openclaw node --url ws://localhost:1888934# ✅ 正确写法5openclaw node run --host 127.0.0.1 --port 188896
注意是 --host 和 --port,没有 --url 这个参数。
5.5
坑五:autoApproveCidrs 不生效
配了 gateway.nodes.pairing.autoApproveCidrs,Gateway 直接报 Unrecognized key。这个字段是 2026.5.x 才引入的,老版本不支持。低版本老老实实用 openclaw devices approve 手动批。
6
进阶:一台宿主机跑多个容器
假设你有多个 Docker Gateway(比如开发环境和生产环境隔离),每个配对一台宿主机 Node:
1# 容器 A,端口 188892nohup openclaw node run --host 127.0.0.1 --port 18889 > /tmp/node-gw1.log 2>&1 &34# 容器 B,端口 188905nohup openclaw node run --host 127.0.0.1 --port 18890 > /tmp/node-gw2.log 2>&1 &6
想持久化?给每个 Node 写一个 launchd plist,Label 和 port 不同即可:
1<!-- ~/Library/LaunchAgents/com.openclaw.node-18889.plist -->2<plist version="1.0">3<dict>4 <key>Label</key>5 <string>com.openclaw.node-18889</string>6 <key>ProgramArguments</key>7 <array>8 <string>/opt/homebrew/bin/openclaw</string>9 <string>node</string>10 <string>run</string>11 <string>--host</string>12 <string>127.0.0.1</string>13 <string>--port</string>14 <string>18889</string>15 </array>16 <key>KeepAlive</key><true/>17 <key>RunAtLoad</key><true/>18</dict>19</plist>20
1launchctl load ~/Library/LaunchAgents/com.openclaw.node-18889.plist2
不过说实话,大多数场景一个 Gateway + 多个 agent session 就够用了,不必上来就搞多容器。
7
验证:跑一遍确认通了
|
|
|
|
|---|---|---|
|
|
openclaw nodes status |
|
|
|
browser start |
|
|
|
browser open |
|
|
|
browser screenshot |
|
四条全过,恭喜你,Docker + 宿主机浏览器的方案跑通了 🎉
8
核心配置速查
|
|
|
|
|---|---|---|
|
|
browser.enabled: true |
|
|
|
gateway.bind: "lan" |
必须
|
|
|
HTTP_PROXY |
|
|
|
openclaw node install |
|
|
|
|
|
一句话总结:Docker Gateway 开 browser + 绑 lan,宿主机安 Node + 配对,再干掉代理环境变量——齐活。
夜雨聆风