OpenClaw + Docker 踩坑全记录
与其冒着风险在宿主机上裸跑,不如把 OpenClaw 关进 Docker 的“笼子”里。
最近 OpenClaw(原名 Moltbot/Clawdbot)在 AI 圈子里火得不行,但也因为其极高的系统权限让不少开发者心生顾虑。如果你也想安全、优雅地运行这个“全能 AI 智能体”,这篇指南值得收藏。
为什么选择 Docker?
OpenClaw 本质上是一个拥有系统级权限的 AI 代理。直接在 Mac 或 Linux 宿主机上运行,意味着你得信任它的每一行代码。Docker 的意义在于“沙箱隔离”:它能访问的只有你挂载进去的目录,即便 AI 产生误操作,影响范围也被锁定在容器内。
第一步:获取代码与环境准备
首先,你需要克隆官方仓库。OpenClaw 自带了完善的 Docker 支持,甚至贴心地准备了自动化脚本。
git clone https://github.com/openclaw/openclaw
第二步:安装和配置环节
在运行安装之前,你要知道 Docker 会在你的本地创建两个核心目录并挂载到容器中:
- ~/.openclaw:存放配置、记忆、API 密钥等核心数据。
- ~/openclaw/workspace:这是 AI 的“工作台”,它读取和创建的所有文件都会在这里。
运行初始化脚本:
cd openclaw
./docker-setup.sh
此时,OpenClaw 会开启“查户口”模式。建议如下选择:
- Onboarding mode: 选择
manual(手动)。 - Setup type: 选择
Local gateway。 - Model provider: 推荐使用固定月费的额度,防止 API 账单爆表。
- Tailscale: 除非你非常确定需要内网穿透,否则建议先选
No,避免初始配置失败。 - Channels: 建议选No, 后续再配置。
- Skills:建议选No, 后续再配置。
一旦配置完成,你可以通过 docker ps 看到正在运行的 openclaw-gateway 容器。但真正的管理需要用到另一个名为 openclaw-cli 的容器。
docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
openclaw-openclaw-gateway-1 openclaw:local "docker-entrypoint.s…" openclaw-gateway 58 minutes ago Up 16 minutes 0.0.0.0:18789-18790->18789-18790/tcp
第三步:访问 Web 仪表盘
OpenClaw 默认运行在 18789 端口。但直接访问 localhost:18789 会报错,你需要一个带 Token 的专属 URL。 获取方法:
docker compose run --rm openclaw-cli dashboard --no-open
复制终端输出的那个带 ?token=... 的链接即可进入。

踩坑全记录
然而,现实并不一定如此美好,一次就能成功。第一次进入时可能会遇到如下错误:
disconnected (1008): pairing required
按照网上的教程,你需要通过如下命令来批准客户端的访问:
docker compose exec openclaw-gateway \
node dist/index.js devices list
docker compose exec openclaw-gateway \
node dist/index.js devices approve \
6f9db1bd-a1cc-4d3f-b643-2c195262464e
然而,你很可能会遇到如下错误:
Error: gateway closed (1006 abnormal closure (no close frame)): no close reason
Error: gateway closed (1008): unauthorized: gateway token mismatch (set gateway.remote.token to match gateway.auth.token)
现在告诉你原因:
OPENCLAW_GATEWAY_TOKEN != gateway.auth.token
环境变量会自动覆盖你所设置的gateway token。
临时的解决方案为手动指定你的token,例如:
docker compose exec -T \
-e OPENCLAW_GATEWAY_TOKEN=1da6c798771848e6f058bf6b419c9bb9be592249e1d39da0 \
openclaw-gateway \
node dist/index.js devices list
Pending (1)
┌──────────────────────────────────────┬────────────────────────────────┬──────────┬──────────────┬──────────┬────────┐
│ Request │ Device │ Role │ IP │ Age │ Flags │
├──────────────────────────────────────┼────────────────────────────────┼──────────┼──────────────┼──────────┼────────┤
│ b14fbe12-87c7-4d83-8ca4-1ff4da86a92d │ e6df4d58a042166054358de153a662 │ operator │ 192.168.65.1 │ just now │ │
│ │ d443b7269e22b92174dfe9c644f28f │ │ │ │ │
│ │ 5b78 │ │ │ │ │
└──────────────────────────────────────┴────────────────────────────────┴──────────┴──────────────┴──────────┴────────┘
docker compose exec -T \
-e OPENCLAW_GATEWAY_TOKEN=1da6c798771848e6f058bf6b419c9bb9be592249e1d39da0 \
openclaw-gateway \
node dist/index.js devices approve b14fbe12-87c7-4d83-8ca4-1ff4da86a92d
Approved e6df4d58a042166054358de153a662d443b7269e22b92174dfe9c644f28f5b78 (b14fbe12-87c7-4d83-8ca4-1ff4da86a92d)
同样的,如果你要查看状态也需要加上-e OPENCLAW_GATEWAY_TOKEN:
docker compose exec -T \
-e OPENCLAW_GATEWAY_TOKEN=1da6c798771848e6f058bf6b419c9bb9be592249e1d39da0 \
openclaw-gateway \
node dist/index.js health
docker compose exec -T \
-e OPENCLAW_GATEWAY_TOKEN=1da6c798771848e6f058bf6b419c9bb9be592249e1d39da0 \
openclaw-gateway \
node dist/index.js status
当然,也有一个一劳永逸的解决方案**:** 变被动为主动。
在运行安装脚本前,手动生成一个固定 Token 并注入环境变量:
export OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32) && echo $OPENCLAW_GATEWAY_TOKEN
在后续的 onboarding(初始化)和 pairing(配对)过程中,统一粘贴这同一个 Token。
结语
OpenClaw 的强大之处在于它能真正动你的文件、跑你的代码。通过 Docker 部署,我们既保留了它的“手脚”,又给它加上了“围栏”。
如果你也是那种“既想玩 AI 智能体,又怕它删库跑路”的开发者,那么这套基于 Docker Compose 的方案目前是你的最优解。
如果觉得这个分享对你部署openclaw有帮助请点赞收藏。
编辑本页
