1. OpenClaw Docker 部署为什么总卡在模型通道上
OpenClaw 是一个可以本地跑起来的智能体服务框架,支持工具调用、多轮对话和任务编排,适合想自己掌控数据、又不想从零写调度逻辑的开发者。它本身不绑定任何模型厂商,模型能力通过 endpoint 和 API Key 接入,所以你可以把它理解成一个“壳”,真正干活的是背后那个模型接口。问题也恰恰出在这里:很多人 Docker 容器跑起来了,页面能打开,但一发消息就报错,或者响应极慢,最后发现是模型通道没配对。
我见过最多的场景是这样的:开发者照着教程docker run起了一个 OpenClaw 容器,默认配置指向某个海外 endpoint,结果容器内 DNS 解析超时、TLS 握手失败,日志里一堆connection refused。还有人把 Key 写死在镜像里,换一次模型要重新 build,非常折腾。更麻烦的是,OpenClaw 的配置分散在环境变量、挂载的 config 文件和运行时设置里,改错一个地方就静默失败,页面上只显示“请求异常”,根本不知道是哪一层的问题。
这篇要解决的就是这件事:用一份可复制的 docker-compose 和部署脚本,把 OpenClaw 在 Docker 里拉起来,并且把模型 endpoint 统一改到 TaoToken,让容器内的请求走一条稳定、可验证的通道。TaoToken 在这里的角色是模型调用网关,提供兼容 OpenAI 风格的接口,你只需要改 Base URL、Key 和 Model ID 三个值,OpenClaw 不用改任何业务代码。适合谁?适合已经会用 Docker、想让 OpenClaw 快速跑通并统一模型入口的开发者,也适合之前部署失败、想找一份能对照排障的配置的人。
下面我会按“先讲清楚问题 → 准备 TaoToken → 给出可复制配置 → 验证请求 → 排错 → 收尾”的顺序走,每一步都有命令和预期结果,你可以直接跟着敲。
2. TaoToken 前置准备:拿到 Base URL、Key 和 Model ID
在动 Docker 之前,先把 TaoToken 侧的三件套准备好,否则后面配置里全是占位符,验证时必然 401。TaoToken 的 API 入口是https://taotoken.net/api,注意这个地址不带任何查询参数,直接作为 OpenAI 兼容的 base_url 使用。你需要去控制台创建一个 API Key,路径是 API Keys 页面,创建后复制那串sk-开头的字符串,只显示一次,丢了就重新建。
模型 ID 这块要留意:OpenClaw 的配置里通常有一个model字段,它必须和 TaoToken 支持的模型名一致。你可以在模型对话页面先手动发一条消息,确认某个模型名可用,再把它填进 OpenClaw。比如你测试时用的是某个通用对话模型,就把那个名字原样抄过去,不要自己加前缀或后缀。很多人报model not found,就是因为填了厂商原始名,而网关侧用的是另一套命名。
关于接入方式,TaoToken 提供的是标准 HTTP 接口,容器内通过https://taotoken.net/api访问即可,不需要在宿主机做额外转发。如果你之前用过其他网关,注意把旧的 base_url 整个替换掉,不要保留/v1之类的后缀,除非文档明确要求。我实测下来,OpenClaw 的 OpenAI 兼容层会自动拼接路径,所以 base_url 写到/api这一层就够了。
还有一个容易忽略的点:Key 的权限。创建 Key 时如果选了受限范围,可能只能调部分模型。排障阶段建议先用一个权限完整的 Key,跑通后再收紧。把这三样东西记在一个临时文本里:Base URL =https://taotoken.net/api,API Key = 你的sk-...,Model ID = 你验证过的模型名。接下来写配置时直接替换。
如果你还没有 Key,可以去 API Keys 页面创建;想先确认模型名,去模型对话页面试一条;长期做编码或 Agent 任务,可以了解 Coding Plan,它更适合高频调用场景。这几个入口后面 CTA 还会再提,这里先知道在哪就行。
3. 可复制的 docker-compose 与部署脚本配置
这一节是核心,给你一份能直接用的docker-compose.yml,以及一个把 endpoint 改到 TaoToken 的.env文件。目录结构建议这样:
openclaw-deploy/ ├── docker-compose.yml ├── .env └── data/先写.env,把三件套放进去,避免硬编码进 compose:
# .env OPENCLAW_BASE_URL=https://taotoken.net/api OPENCLAW_API_KEY=sk-你的真实Key OPENCLAW_MODEL=你验证过的模型名 OPENCLAW_PORT=8080然后是docker-compose.yml,关键是把环境变量透传给容器,并挂载 data 目录做持久化:
# docker-compose.yml services: openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: unless-stopped ports: - "${OPENCLAW_PORT}:8080" environment: - OPENAI_BASE_URL=${OPENCLAW_BASE_URL} - OPENAI_API_KEY=${OPENCLAW_API_KEY} - OPENCLAW_MODEL=${OPENCLAW_MODEL} - OPENCLAW_LOG_LEVEL=info volumes: - ./data:/app/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 5s retries: 3注意OPENAI_BASE_URL这个变量名,OpenClaw 的 OpenAI 兼容层读的就是它。不同版本可能用OPENCLAW_BASE_URL,如果启动后日志显示 base_url 没生效,就把两个都写上,值一样。Model ID 通过OPENCLAW_MODEL传入,确保和你在 TaoToken 验证过的一致。
再给一个部署脚本deploy.sh,做三件事:检查 Docker、拉起 compose、打印日志:
#!/usr/bin/env bash set -euo pipefail if ! command -v docker >/dev/null 2>&1; then echo "未检测到 Docker,请先安装 Docker Engine 或 Docker Desktop" exit 1 fi if ! docker compose version >/dev/null 2>&1; then echo "未检测到 docker compose 插件,请升级 Docker 版本" exit 1 fi echo "开始部署 OpenClaw..." docker compose up -d echo "等待容器健康检查通过..." sleep 10 docker compose ps echo "最近日志:" docker compose logs --tail=50 openclaw给脚本执行权限并运行:
chmod +x deploy.sh ./deploy.sh预期结果是docker compose ps显示openclaw状态为Up或healthy,日志里出现监听 8080 的记录。如果日志里出现base_url相关行,确认它指向https://taotoken.net/api。这一步跑通,说明容器和配置都对了,接下来验证请求。
4. 验证请求与成功结果:从容器内打到 TaoToken
容器起来不代表模型通道通,必须实际发一次请求。最直接的方式是在容器内用 curl 打 TaoToken 的接口,确认网络和 Key 都没问题:
docker compose exec openclaw sh -c 'curl -sS https://taotoken.net/api/models \ -H "Authorization: Bearer $OPENAI_API_KEY" | head -c 500'如果返回一段 JSON,里面有模型列表,说明容器能出网、Key 有效、base_url 正确。这一步失败的话,先别去调 OpenClaw,先把 curl 打通。常见的是容器内 DNS 问题,可以在 compose 里加dns: 223.5.5.5试试。
接着验证 OpenClaw 自己的对话接口。假设它暴露了/v1/chat/completions兼容路径,可以这样打:
curl -sS http://localhost:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "'"$OPENCLAW_MODEL"'", "messages": [{"role": "user", "content": "只回复两个字:通了"}] }'预期返回里choices[0].message.content是“通了”。如果返回 401,检查.env里的 Key 有没有被 compose 正确读取,可以用docker compose config看解析后的环境变量。如果返回model not found,说明 Model ID 和 TaoToken 侧不一致,回模型对话页面再确认一次。
还有一种验证方式是直接看 OpenClaw 的日志。发请求时另开一个终端:
docker compose logs -f openclaw成功时日志里会有上游请求的 URL 和状态码,确认 URL 是https://taotoken.net/api/...,状态码 200。如果看到reading choices之类的解析错误,通常是上游返回了非预期结构,多半是 base_url 多写了/v1导致路径重复。把 base_url 改回https://taotoken.net/api再试。
实测下来,只要 curl 那步通了,OpenClaw 这步基本不会卡。真正容易出问题的是环境变量没透传,或者 compose 文件里用了旧的变量名。验证通过后,你就可以在 OpenClaw 的界面里正常对话、跑工具调用了。
5. 本篇常见错排查:401、local proxy failed、reading choices
排障这节按真实报错来,你遇到哪个对哪个。
401 Unauthorized:最常见。先确认.env里的OPENCLAW_API_KEY是完整的sk-开头字符串,没有多余空格或换行。然后docker compose config看解析结果,确认 Key 真的传进容器了。如果 Key 没问题,检查是不是用了受限权限的 Key,换一个完整权限的再试。还有一种情况是 Key 被复制时带了引号,去掉引号。
local proxy failed / connection refused:容器内访问https://taotoken.net/api失败。先在容器里curl -v https://taotoken.net/api/models看卡在哪。如果是 DNS,加dns配置;如果是 TLS,检查系统时间是否准确,容器时间偏差大会导致证书校验失败。注意不要在宿主机配任何代理再指望容器继承,容器网络是独立的,代理配置要在 compose 里显式设置,但更推荐直接让容器出网。
reading choices / unexpected response:OpenClaw 解析上游返回时失败。九成是 base_url 写成了https://taotoken.net/api/v1,导致实际请求路径变成/api/v1/v1/chat/completions。把 base_url 改成https://taotoken.net/api,重启容器。另外确认 Model ID 没有拼错,有些模型名区分大小写。
OAuth / auth.json 相关报错:如果你用的是 Codex 类工具链,认证信息可能写在auth.json里。这时要保证三件套齐全:Base URL 填https://taotoken.net/api,Key 填在对应字段,Model ID 填验证过的名字。三者缺一不可,只填 Key 不填 base_url 会走默认海外地址,必然失败。CC Switch 或 Cline MCP 场景同理,配置里必须同时出现 Base URL、Key、Model ID。
容器启动后立刻退出:docker compose logs openclaw看最后几行。如果是配置解析错误,多半是.env格式问题,比如值里有空格没加引号。如果是端口占用,改OPENCLAW_PORT。如果是镜像拉取失败,检查网络或换镜像源。
排障时记住一个顺序:先容器内 curl 通 TaoToken,再 curl 通 OpenClaw 本地接口,最后看日志。这个顺序能帮你快速定位是网络层、认证层还是应用层的问题。需要对照接口文档的话,接入文档里有完整的路径和参数说明;Key 管理去 API Keys 页面。
6. 把通道固定下来:后续维护与入口选择
跑通之后,建议把.env纳入版本管理时做脱敏,Key 用环境变量注入而不是写死。OpenClaw 升级镜像时,先docker compose pull再up -d,配置不变的情况下通道不会断。如果你要换模型,只改OPENCLAW_MODEL一个值,重启容器即可,不用动 compose 文件。
日常调用量大的话,可以关注 Coding Plan,它针对长期编码和 Agent 场景做了优化,比按次调用更划算。需要临时验证某个模型,用模型对话页面最快。Key 的创建和轮换在 API Keys 页面,接入细节查接入文档。这几个入口按你的使用频率选,不用一次全用上。
最后留一个实用技巧:在 compose 里加一行logging限制日志大小,避免长时间运行把磁盘写满:
logging: driver: "json-file" options: max-size: "10m" max-file: "3"这样 OpenClaw 跑几周也不会因为日志膨胀出问题。通道固定到 TaoToken 之后,你换模型、加工具、扩容器都只动配置层,业务代码不用碰,这才是 Docker 部署该有的样子。