1. 为什么要在本地 Docker 里跑 OpenClaw
OpenClaw 是一个把大模型能力封装成 CLI 与 Gateway 的开源项目,你可以把它理解成一个「本地 AI 助手调度台」:它自己不带模型,而是通过配置去调用外部模型服务,然后把对话、文件读写、任务执行这些能力统一暴露给命令行和网页控制台。适合谁?适合想在自己机器上折腾 Agent、又不想把配置散落一地的开发者,尤其是习惯用 Docker 管理服务的人。
我这次的目标很明确:在本地 Docker 环境里把 OpenClaw 完整跑起来,并且把模型通道换成国内可直接调用的大模型,用 TaoToken 的统一 Key 来接入,省去每个厂商单独申请、单独配 baseUrl 的麻烦。整个过程会交付三样东西:一份可复制的 docker-compose 骨架、一段 config.toml / openclaw.json 配置片段、以及一组连通性验证命令。
先说清楚一个容易踩的坑:OpenClaw 的配置目录是通过 volume 挂载到宿主机的,所以你在宿主机改配置文件,容器重启后就生效,不需要进容器 bash 里手改。这一点决定了后面「自定义配置国内大模型」到底顺不顺手。另外 Gateway 默认只监听 loopback,Docker bridge 网络下宿主机访问不到,必须改成 lan,这个在 .env 里就要定好。
下面按「前置准备 → 可复制配置 → 验证 → 排障」的顺序走,每一步都给完整命令和参数说明,你照着敲就行。
2. TaoToken 前置:统一 Key 与通道准备
TaoToken 在这里扮演的角色是「模型通道的统一入口」。你不用为每个国内大模型分别记 baseUrl、分别管 Key,而是拿一个统一 Key,通过它的 API 通道去调用后端模型。对 OpenClaw 来说,它只需要认一个 OpenAI 兼容的 baseUrl 和一个 apiKey,剩下的路由交给 TaoToken。
你需要提前准备两样东西:
第一,一个可用的 TaoToken API Key。登录官网后进入控制台,在 API Keys 页面创建一个 Key,复制保存好,后面配置里会用到。控制台地址是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite ,API Keys 管理页在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。
第二,确认你要用的模型 id。TaoToken 的 API 入口是 https://taotoken.net/api ,它是 OpenAI 兼容格式,所以 OpenClaw 里api字段填openai-completions即可。模型 id 按你实际要用的填,比如常见的对话模型 id,填错会直接报 model not found。
注意:baseUrl 要填到兼容路径那一层,通常是
https://taotoken.net/api/v1这种形式,具体以文档为准。文档入口:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。填成根域名会 404。
如果你后面打算长期用 OpenClaw 做编码或 Agent 任务,可以顺带了解下 Coding Plan,它更适合高频调用场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。想先在网页里验证模型通不通,可以用模型对话页:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。
3. 可复制配置:docker-compose 骨架与 .env
这一节是全文的核心,给你可以直接抄的配置。先建目录结构,假设你在D:\openclaw下操作:
mkdir openclaw && cd openclaw mkdir config workspaceconfig用来挂载 OpenClaw 的配置目录,workspace是 Agent 的工作目录。然后创建.env文件:
# .env OPENCLAW_GATEWAY_TOKEN=替换成你自己生成的token OPENCLAW_CONFIG_DIR=D:/openclaw/config OPENCLAW_WORKSPACE_DIR=D:/openclaw/workspace OPENCLAW_GATEWAY_PORT=18789 OPENCLAW_GATEWAY_BIND=lan几个参数逐个解释。OPENCLAW_GATEWAY_TOKEN是访问 Gateway 的认证密钥,Gateway 启动后会暴露 WebSocket 和 HTTP 接口,没有这个 token 任何人都能连进来,相当于你家门的钥匙,必须设置。生成方式二选一:
# Python 方式 python -c "import secrets; print(secrets.token_hex(32))" # PowerShell 方式 -join ((1..32) | ForEach-Object { '{0:x2}' -f (Get-Random -Max 256) })OPENCLAW_CONFIG_DIR是配置文件目录,容器通过 volume 挂载它,重启后配置不丢。OPENCLAW_WORKSPACE_DIR是 Agent 读写文件、执行任务的工作目录。OPENCLAW_GATEWAY_PORT默认 18789。OPENCLAW_GATEWAY_BIND决定监听哪个网卡,loopback只有本机能访问,Docker bridge 网络下宿主机也访问不到;lan监听所有网卡,Docker 部署必须用这个。
接着是 docker-compose 骨架。如果你是从源码构建,先构建镜像:
docker build -t openclaw:local .然后docker-compose.yml大致长这样:
services: openclaw-gateway: image: openclaw:local container_name: openclaw-gateway env_file: .env ports: - "${OPENCLAW_GATEWAY_PORT}:${OPENCLAW_GATEWAY_PORT}" volumes: - ${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw - ${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace restart: unless-stopped openclaw-cli: image: openclaw:local env_file: .env volumes: - ${OPENCLAW_CONFIG_DIR}:/home/node/.openclaw - ${OPENCLAW_WORKSPACE_DIR}:/home/node/.openclaw/workspace entrypoint: ["openclaw"]openclaw-cli这个服务是给命令行操作用的,docker compose run --rm openclaw-cli ...就是借它执行一次性命令。两个服务挂载同一份配置目录,所以 CLI 改的配置 Gateway 能读到。
初始化配置:
docker compose run --rm openclaw-cli onboard --mode local --no-install-daemon交互过程里,模型服务商先选Skip for now,聊天平台、联网搜索、Skills、Hooks 都先跳过,把主流程跑通再说。安装 skills 要谨慎,以防投毒风险。
启动前设置访问来源:
docker compose run --rm openclaw-cli config set gateway.controlUi.allowedOrigins "[\"http://localhost:18789\"]" --strict-json docker compose up -d openclaw-gateway访问http://localhost:18789,输入.env里的 token 登录。此时还不能进,需要后台允许设备访问:
docker compose run --rm openclaw-cli devices list docker compose run --rm openclaw-cli devices approve <设备id>把devices list里 PendingRequest 下的字符串填到 approve 后面,就能正常登录了。
4. 自定义配置国内大模型:三种写入方式
配置目录已经挂载到宿主机,所以你可以直接在D:\openclaw\config下找到openclaw.json改,不用进容器 bash。下面三种方式任选。
方式一,交互式配置,适合还不熟的人:
docker compose run --rm openclaw-cli models auth login它会重新走一遍模型配置界面,按提示填 baseUrl、apiKey、模型 id。
方式二,CLI 命令逐项写入,适合脚本化:
docker compose run --rm openclaw-cli config set models.providers.taotoken "{\"baseUrl\":\"https://taotoken.net/api/v1\",\"api\":\"openai-completions\",\"apiKey\":\"sk-你的key\",\"models\":[{\"id\":\"你的模型id\",\"name\":\"你的模型id\",\"reasoning\":false,\"input\":[\"text\"],\"contextWindow\":128000,\"maxTokens\":4096,\"cost\":{\"input\":0,\"output\":0,\"cacheRead\":0,\"cacheWrite\":0}}]}" --strict-json docker compose run --rm openclaw-cli models set "taotoken/你的模型id"方式三,直接改openclaw.json,改完重启:
{ "models": { "providers": { "taotoken": { "baseUrl": "https://taotoken.net/api/v1", "apiKey": "sk-你的key", "api": "openai-completions", "models": [ { "id": "你的模型id", "name": "你的模型id", "reasoning": false, "input": ["text"], "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 128000, "maxTokens": 4096 } ] } } }, "agents": { "defaults": { "model": { "primary": "taotoken/你的模型id" }, "models": { "taotoken/你的模型id": {} }, "workspace": "/home/node/.openclaw/workspace" } } }docker compose restart openclaw-gateway参数对照表:
| 字段 | 作用 | 注意 |
|---|---|---|
| baseUrl | 模型通道地址 | 填到 /v1 兼容层 |
| api | 协议类型 | OpenAI 兼容填 openai-completions |
| apiKey | 统一 Key | 用 TaoToken 控制台创建的 Key |
| id | 模型标识 | 必须与通道支持的 id 一致 |
| contextWindow | 上下文窗口 | 按模型实际能力填 |
| maxTokens | 单次最大输出 | 别超过模型上限 |
5. 验证请求与成功结果
配置完先做一次连通性验证,别急着开网页。用 CLI 发一条测试消息:
docker compose run --rm openclaw-cli models list这条命令会列出当前已配置的 provider 和模型,确认taotoken/你的模型id在列表里。然后直接发一条对话:
docker compose run --rm openclaw-cli chat --message "用一句话说明你是什么模型"如果返回正常文本,说明 Key、baseUrl、模型 id 三者都对上了。如果报 401,是 Key 问题;报 404,多半是 baseUrl 路径不对;报 model not found,是模型 id 写错。
再验证 Gateway 侧。浏览器打开http://localhost:18789,用 token 登录,在对话框里发一句「你好」,能收到回复就说明整条链路通了。你也可以在网页里切换模型,确认默认模型是taotoken/你的模型id。
实测下来,最容易出问题的是 baseUrl 结尾的/v1。有人填成https://taotoken.net/api,结果请求打到根路径直接 404。另一个坑是.env里OPENCLAW_GATEWAY_BIND忘了改lan,网页能打开但设备一直 pending,approve 之后还是连不上。
6. 本篇常见错排查
报错一:docker compose up后端口占用。18789 被别的服务占了。改.env里的OPENCLAW_GATEWAY_PORT,比如换成 18790,然后docker compose up -d重建。
报错二:登录后一直提示设备未授权。先devices list看有没有 PendingRequest,有就devices approve <id>。如果 approve 后还不行,检查gateway.controlUi.allowedOrigins是否设成了["http://localhost:18789"],端口要和实际访问的一致。
报错三:模型调用返回 401 Unauthorized。Key 复制时带了空格,或者用了别的平台的 Key。重新在 TaoToken 控制台生成一个,粘贴时注意首尾不要有空白字符。
报错四:返回 404 或invalid path。baseUrl 路径不对。OpenClaw 走的是 OpenAI 兼容协议,baseUrl 要指到兼容层,通常是https://taotoken.net/api/v1。改完openclaw.json记得docker compose restart openclaw-gateway。
报错五:改了配置但没生效。方式三直接改文件的话,必须重启容器。方式二用config set写入的,Gateway 会读同一份挂载目录,但保险起见也重启一次。
报错六:容器启动即退出。看日志docker compose logs openclaw-gateway。常见原因是.env里OPENCLAW_CONFIG_DIR路径不存在,或者 Windows 下路径分隔符写错。用绝对路径,正斜杠。
排障时如果怀疑是 Key 或通道问题,可以先用模型对话页单独验证 Key 是否可用:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。确认 Key 没问题再回来查 OpenClaw 配置。接入相关的细节以官方文档为准:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。
7. 后续怎么用得更顺
跑通之后,日常操作基本就三条命令:docker compose up -d openclaw-gateway启动,docker compose run --rm openclaw-cli chat ...发消息,docker compose logs -f openclaw-gateway看日志。配置改动集中在openclaw.json一个文件里,改完重启即可。
如果你要长期跑编码或 Agent 任务,建议把模型通道单独规划一下,用 Coding Plan 这类更适合高频调用的方案:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。Key 管理统一在控制台做,方便轮换和排查:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。
最后提醒一句:Skills 和 Hooks 这类扩展能力,等基础对话稳定跑通之后再逐个开,别一上来全打开,出问题不好定位。先把 Gateway、模型通道、设备授权这三件事钉死,剩下的都是增量。