☰
Docker本地部署OpenClaw(小龙虾)完整指南:从零搭建安全隔离的个人AI助手
2026/10/3 16:42:00 网站建设 项目流程

1. 为什么我劝你别把 OpenClaw 直接装在主力机上

OpenClaw(圈里叫“小龙虾”)本质是一个高权限 AI 代理加自动化执行系统。它能读写文件、跑 shell、调浏览器、连外部 API,你给它一句“帮我整理今天的资讯”,它背后可能真的去开浏览器、抓页面、写文件。这种能力放在一台干净的机器上很爽,但放在你天天办公、存着 SSH 私钥和浏览器 Cookie 的主力机上,就是另一回事了。

我见过最典型的翻车场景:某个第三方 Skill 里藏了一段rm -rf或者偷偷把~/.ssh打包外发,因为 OpenClaw 默认以当前用户权限运行,它干这些事根本不需要你二次确认。再叠加各种来路不明的 Skills,风险不是“会不会”,而是“什么时候”。

云厂商的托管方案能解决一部分问题,但两个硬伤绕不开:一是长期成本,二是数据要出本地。对个人用户来说,Docker 本地部署是目前平衡安全、成本和可控性的最优解。容器把 OpenClaw 关进一个独立文件系统,它默认看不到宿主机除挂载点以外的任何东西;数据留在本地卷里,不经过第三方;启动停止就是一条docker compose命令,删掉容器不留痕。

这篇就按“从零到能跑”的顺序走一遍:先讲清楚隔离边界怎么设计,再给可复制的docker-compose.yml骨架,然后是环境变量、卷挂载、启动验证,最后把几个高频报错(401、pairing required、容器起不来)逐个拆掉。模型接入部分我用 TaoToken 做示例,因为它同时提供 OpenAI 兼容接口和 Claude Code 的 Anthropic 兼容入口,配 OpenClaw 这种需要多模型切换的场景比较省事。

适合谁看:想在个人电脑或一台闲置小主机上跑 OpenClaw、又不想让它碰你主力数据的开发者;已经装过但被权限和报错卡住的同学;以及想给团队做一套可复现部署模板的人。

2. 部署前的隔离设计与 TaoToken 接入准备

2.1 先想清楚隔离边界,再动手写 compose

很多人一上来就docker run,结果容器里能读到宿主机一堆东西,隔离等于没做。正确的顺序是先画边界:

第一层是文件系统隔离。OpenClaw 需要持久化的只有两块:配置目录(~/.openclaw,存openclaw.json、token、设备配对信息)和工作区(~/.openclaw/workspace,存它生成的文件)。这两个用命名卷或绑定挂载单独映射,其余一律不给。千万别图省事把/或整个用户目录挂进去。

第二层是网络隔离。OpenClaw 的 Gateway 默认监听容器内端口,映射到宿主机时只绑127.0.0.1,不要绑0.0.0.0。这样即使同局域网有人扫到你的机器,也连不上这个端口。需要远程访问时再单独走内网穿透或 Tailscale,而不是直接把端口暴露出去。

第三层是权限隔离。容器内用非 root 用户跑(OpenClaw 官方镜像默认就是node用户),并且不要加--privileged,不要挂/var/run/docker.sock。挂了 docker.sock 等于把宿主机 root 权限送出去,这是最常见的自毁操作。

第四层是资源隔离。给容器设 CPU 和内存上限,防止某个失控的 Skill 把机器吃满。deploy.resources.limits或mem_limit都行。

2.2 用 TaoToken 统一模型入口

OpenClaw 要干活必须有“大脑”,也就是大模型 API。直接对接各家官方接口的问题是:每家 Key 格式、Base URL、模型 ID 命名都不一样,换模型就要改配置。用 TaoToken 的好处是它提供统一的 OpenAI 兼容入口,Base URL 固定,模型 ID 按需切换,OpenClaw 里配一次就行。

你需要准备三样东西,后面配置向导会逐个填:

  • Base URL:https://taotoken.net/api(注意 API 调用不加任何查询参数)
  • API Key:在控制台创建,形如sk-开头的一串
  • Model ID:比如claude-sonnet-4-5、gpt-4o这类,按你订阅的套餐选

如果你打算长期跑编码类或 Agent 类任务,Coding Plan 的额度模型更适合高频调用;只是偶尔问答,按量付费即可。控制台里可以随时看用量,避免跑飞。

提示:Key 只存在本地openclaw.json或环境变量里,不要提交到 Git,也不要在截图里露出来。容器日志里如果打印了 Key,记得在 compose 里关掉详细日志。

2.3 环境检查清单

动手前确认这几项,能省掉后面一半的报错:

  • Docker 版本 ≥ 24,docker compose version能输出版本号(v2 语法,不是老的docker-compose)
  • 宿主机剩余磁盘 ≥ 5GB(镜像加依赖不小)
  • 18789 端口没被占用,lsof -i :18789检查一下
  • 如果之前装过 OpenClaw,先docker compose down -v清干净,避免旧卷里的配置冲突

macOS 上装 Docker Desktop 最省事,它自带 compose 插件。Linux 上装 docker-ce 后单独装docker-compose-plugin。Windows 建议走 WSL2 后端,别用老式 Hyper-V。

3. 可复制的 docker-compose 骨架与配置片段

3.1 目录结构先定好

我习惯把部署文件集中放,方便备份和迁移:

~/docker/openclaw/ ├── docker-compose.yml ├── .env └── data/ ├── config/ # 映射到容器内 ~/.openclaw └── workspace/ # 映射到容器内 ~/.openclaw/workspace

data/下两个子目录分别对应配置和工作区,用绑定挂载而不是命名卷,好处是你随时能在宿主机上看到、备份、改配置,出问题好排查。

3.2 docker-compose.yml 完整骨架

下面这份可以直接复制,改掉路径和 Key 就能用:

services: openclaw-gateway: image: openclaw:local container_name: openclaw-gateway restart: unless-stopped ports: # 只绑本地回环,绝不写 0.0.0.0 - "127.0.0.1:18789:18789" environment: - OPENCLAW_GATEWAY_BIND=lan - OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN} - OPENAI_BASE_URL=https://taotoken.net/api - OPENAI_API_KEY=${TAOTOKEN_API_KEY} - OPENCLAW_DEFAULT_MODEL=${OPENCLAW_MODEL_ID} - NODE_ENV=production volumes: - ./data/config:/home/node/.openclaw - ./data/workspace:/home/node/.openclaw/workspace # 资源上限,防止失控 Skill 吃满机器 mem_limit: 4g cpus: "2.0" # 安全加固:禁止提权 security_opt: - no-new-privileges:true healthcheck: test: ["CMD", "node", "dist/index.js", "health"] interval: 30s timeout: 10s retries: 3

几个关键点解释一下。ports写成127.0.0.1:18789:18789,冒号左边是宿主机绑定地址,写死回环就杜绝了外部直连。security_opt里的no-new-privileges阻止容器内进程通过 setuid 提权。mem_limit和cpus是硬上限,超了会被 OOM kill 而不是拖垮宿主机。

3.3 .env 文件放敏感变量

compose 里用${}引用的变量都从.env读,这样 compose 文件本身可以进 Git,Key 不会泄露:

# .env OPENCLAW_GATEWAY_TOKEN=换成你自己生成的长随机串 TAOTOKEN_API_KEY=sk-你的key OPENCLAW_MODEL_ID=claude-sonnet-4-5

Gateway Token 用openssl rand -hex 32生成,别用弱密码。这个 token 是登录管理界面的凭证,泄露了别人就能操作你的助手。

3.4 openclaw.json 里的模型配置片段

首次启动后,OpenClaw 会在data/config/openclaw.json生成配置。模型部分长这样,你可以直接改:

{ "models": { "default": "claude-sonnet-4-5", "providers": { "taotoken": { "type": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的key", "models": ["claude-sonnet-4-5", "gpt-4o"] } } }, "gateway": { "bind": "lan", "port": 18789 } }

注意baseUrl结尾不要带斜杠,OpenClaw 拼接路径时容易出双斜杠导致 404。type写openai-compatible,因为 TaoToken 走的是 OpenAI 兼容协议。

3.5 启动命令

cd ~/docker/openclaw docker compose up -d docker compose logs -f openclaw-gateway

-d后台启动,logs -f跟日志。看到Gateway running with host port mapping就说明起来了。日志里会打印一个 Gateway Token,如果你在.env里已经指定,就以.env为准。

4. 启动后验证隔离生效与助手可用

4.1 验证容器隔离

先确认容器确实被关住了。进容器看看它能看到什么:

docker exec -it openclaw-gateway /bin/bash # 容器内执行 ls /home/node/.openclaw whoami

whoami应该输出node,不是root。ls只能看到你挂载进去的 config 和 workspace,看不到宿主机的其他目录。再试着访问宿主机路径:

ls /Users # 应该报 No such file or directory,说明没挂宿主机用户目录

这一步很关键。如果这里能看到你的整个用户目录,说明挂载写错了,回去检查volumes那两行。

4.2 验证端口只绑本地

在宿主机上查端口绑定:

lsof -i :18789 # 或 netstat -an | grep 18789

输出里本地地址应该是127.0.0.1:18789,不是*:18789或0.0.0.0:18789。如果是后者,说明 compose 里端口写错了,外部能直连,隔离破功。

4.3 验证 Gateway 健康

用日志里给的命令做健康检查:

docker compose exec openclaw-gateway \ node dist/index.js health --token "你的GatewayToken"

返回ok或类似状态就说明 Gateway 正常。如果返回 401,往下看第 5 节。

4.4 验证模型连通

进管理界面之前,先用 curl 直接打 TaoToken 接口,确认 Key 和网络没问题:

curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer sk-你的key" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-5", "messages": [{"role": "user", "content": "说一句你好"}] }'

能返回 JSON 且choices[0].message.content有内容,说明模型侧通了。这一步能提前排掉 401 和模型 ID 写错的问题,比在 OpenClaw 里瞎试高效。

4.5 浏览器登录与设备配对

浏览器打开http://127.0.0.1:18789/,输入 Gateway Token 登录。如果提示pairing required,这是 OpenClaw 的零信任设备模型:任何新客户端首次连接都要手动批准。

# 查看待批准设备 docker exec -it openclaw-gateway openclaw devices list # 批准 docker exec -it openclaw-gateway openclaw devices approve <设备ID>

批准后刷新浏览器就能进后台。这个机制虽然多一步,但意味着即使 token 泄露,攻击者没有设备批准也进不来,值得保留。

4.6 跑一个真实任务验证

在聊天窗口发一句:

帮我整理今天科技领域的三条新闻,每条一句话总结加一句分析,标注重要程度。

OpenClaw 会调搜索、整理、输出。如果它能正常返回结构化结果,说明模型、工具链、容器网络全通了。这时候你可以在宿主机data/workspace/下看到它生成的文件,确认卷挂载双向生效。

5. 高频报错排查:401、pairing required、容器起不来

5.1 401 Unauthorized

最常见,来源有三个。第一是 Gateway Token 不对,检查.env里的OPENCLAW_GATEWAY_TOKEN和登录时输入的是否一致,注意别把首尾空格复制进去。第二是模型 API Key 错,用 4.4 的 curl 单独验证。第三是openclaw.json里baseUrl带了多余斜杠或路径,导致请求打到错误端点。

排查顺序:先 curl 打 TaoToken,通了再查 Gateway Token,最后看配置文件。日志里搜401能看到具体是哪一层拒绝的。

5.2 pairing required 反复出现

批准了设备还是提示,通常是容器重启后设备状态丢了。检查data/config/是否真的挂载成功,openclaw devices list里设备状态是不是Approved。如果每次重启都要重新配对,说明配置目录没持久化,回去看 compose 的 volumes 路径。

还有一种情况是浏览器换了隐身窗口或清了 Cookie,设备指纹变了,会被当成新设备。重新批准即可。

5.3 容器起不来 / 端口占用

docker compose up -d后docker ps看不到容器,先看日志:

docker compose logs openclaw-gateway

如果是port is already allocated,说明 18789 被占,lsof -i :18789找到进程杀掉,或改 compose 里的宿主机端口。如果是镜像构建失败,多半是网络问题拉不到基础镜像,配好 Docker 的镜像加速再试。

5.4 reading choices 报错

这个报错通常出现在模型返回体解析阶段,原因是接口返回的不是标准 OpenAI 格式,或者返回了错误对象但代码按成功解析。检查baseUrl是否指向了正确的兼容端点,以及模型 ID 是否在 TaoToken 支持的列表里。用 4.4 的 curl 看原始返回,如果返回体里有error字段,那就是模型侧的问题,不是 OpenClaw 的锅。

5.5 local proxy failed

容器内访问外部 API 失败时会出现。先在容器内测网络:

docker exec -it openclaw-gateway curl -I https://taotoken.net/api

如果超时,检查宿主机 DNS 和 Docker 的网络配置。有些公司网络需要走内部 DNS,容器默认拿不到,可以在 compose 里加dns字段指定。

5.6 OAuth 相关报错

如果你用的是需要 OAuth 的模型服务,token 过期会报这个。OpenClaw 里配 OAuth 类 provider 时,refresh token 要能自动续期,否则跑一段时间就断。用 TaoToken 这种 API Key 模式就没这个问题,Key 长期有效,省心。

6. 把 OpenClaw 接进日常:从能跑到好用

跑通只是起点。真正让它有价值的是接进你的日常工作流,同时不破坏前面建立的隔离边界。

第一件事是配聊天通道。OpenClaw 支持飞书、微信等通道,配好后你可以在手机上给它派活,比如每天早上推一份资讯简报。通道配置在管理界面里做,token 存在openclaw.json里,注意别把通道的 webhook 地址暴露到公网。

第二件事是按需装 Skills。官方 Skill 市场里有不少实用工具,但装之前看一眼它申请了什么权限。一个只需要读网页的 Skill 如果申请了文件写入,就要警惕。装完在容器里跑一次,观察它有没有异常的网络请求。

第三件事是定期备份配置卷。data/config/里有你的模型配置、设备配对、通道凭证,丢了要重配。写个 cron 每天打包一次,存到别的地方。

第四件事是控制成本。Agent 类任务调用量大,容易跑飞。在 TaoToken 控制台设个用量告警,或者用 Coding Plan 的额度模型,超了自动停。OpenClaw 侧也可以在配置里限制单次任务的工具调用轮数,防止死循环。

最后提醒一句:容器隔离不是万能的。如果某个 Skill 通过挂载的工作区目录往外传数据,或者你手动把敏感目录挂进去了,隔离照样破。边界是你自己划的,compose 只是帮你执行。每次改挂载和权限前,先问一句“这个目录真的需要给它看吗”。

需要创建 API Key 或查看接入文档,可以从这里进:API Keys 在控制台的console页面,接入文档在doc页面,模型对话入口在模型对话,长期编码和 Agent 任务看Coding Plan。配好之后,你的小龙虾就在一个只属于它的盒子里干活了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询