乐于分享
好东西不私藏

【openclaw小技巧】Docker 部署 OpenClaw,如何优雅调用宿主机浏览器?

【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

三个关键认知:

  1. Gateway 只负责”声明有这个工具”,不做浏览器操作
  2. Node 是个轻量中转站,只转发指令,不搞复杂逻辑
  3. 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

验证:跑一遍确认通了

步骤
操作
预期结果
Node 在线
openclaw nodes status
显示 node,status 为 online
启动浏览器
Agent 调用 browser start
宿主机 Brave 窗口弹出来
打开网页
Agent 调用 browser open
页面正常加载
截图
Agent 调用 browser screenshot
返回正确页面截图

四条全过,恭喜你,Docker + 宿主机浏览器的方案跑通了 🎉


8

核心配置速查

位置
配置
说明
Docker Gateway
browser.enabled: true
仅注册工具,不需要 profiles
Docker Gateway
gateway.bind: "lan" 必须

,否则外部连不上
Docker 容器
移除/排除 HTTP_PROXY
避免 SSRF 代理拦截
宿主机 Node
openclaw node install
一次安装,后台常驻
宿主机 browser
保持原有 profiles 配置
Node 会自动读取

一句话总结:Docker Gateway 开 browser + 绑 lan,宿主机安 Node + 配对,再干掉代理环境变量——齐活。