1. 为什么我要把 OpenClaw 塞进 Docker
OpenClaw 这个被江湖人称“小龙虾”的 AI Agent,年初火得一塌糊涂。它能自己读代码、自己拆任务、自己调工具,理论上你只要把需求丢给它,它就能像数字员工一样把活干完。但真到自己动手部署的时候,你会发现它跟“开箱即用”四个字基本无缘——尤其是在 Linux 和 fnOS 这类 NAS 系统上,配置文件的骨架、模型通道的接入、容器挂载的路径,每一步都能让你在凌晨两点对着红色报错发呆。
我这次的目标很明确:在 fnOS(飞牛 NAS 系统)上用 Docker 把 OpenClaw 跑起来,并且用 TaoToken 的统一 Key 和 API 通道把模型调用接进去,避免在多个模型供应商之间来回切换 Key、改 base_url、重启容器。适合谁看?如果你手里有一台 Linux 服务器或者 fnOS NAS,想让 OpenClaw 稳定跑在容器里,并且希望模型通道统一管理,这篇就是给你写的。
整篇我会按“先讲坑、再给配置、最后验证”的顺序来,所有配置片段都可以直接复制,改掉路径和 Key 就能用。重点放在 settings.json 和 config.toml 这两个骨架文件上,因为 OpenClaw 的绝大多数启动失败,根源都在这两个文件里。
2. TaoToken 前置:统一 Key 和 API 通道
在把 OpenClaw 塞进容器之前,先解决模型通道的问题。OpenClaw 本身不绑定任何一家模型,它通过配置文件里的 base_url 和 api_key 去调用模型。如果你手上有多个模型来源,每个都配一遍 Key、记一遍地址,容器一重启就容易乱。
TaoToken 在这里的作用是提供一个统一的 API 入口。你只需要在 TaoToken 控制台生成一个 Key,然后把 OpenClaw 的 base_url 指向 TaoToken 的 API 地址,模型名称按文档填,就能在一个通道里调用不同模型。这样容器里的配置文件只需要维护一份 Key,换模型的时候改一个字段就行,不用动容器本身。
具体操作路径是这样的:先到 TaoToken 控制台创建一个 API Key,地址是 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。创建完之后把 Key 复制出来,后面写进 config.toml。如果你对模型对话本身还想先试试效果,可以走模型对话入口 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite ,先确认通道通不通,再往容器里配。
这里有个细节要注意:TaoToken 的 API 基础地址是 https://taotoken.net/api ,这个地址不带任何查询参数,直接作为 base_url 写进配置。Key 的权限和额度在控制台里可以单独管理,建议给 OpenClaw 单独建一个 Key,方便后面排查是哪个容器在消耗额度。
提示:不要在配置文件里直接写主账号的 Key,给每个容器或每个项目单独建 Key,出问题的时候能快速定位。
3. 可复制配置:settings.json 与 config.toml 骨架
OpenClaw 在容器里启动时,会读取两个核心配置文件:settings.json 和 config.toml。前者管运行时的行为,后者管模型通道和工具权限。很多人容器起不来,不是镜像的问题,是这两个文件的路径没挂对,或者字段名写错了。
先看目录结构。我在 fnOS 上把配置放在 /vol1/docker/openclaw/ 下面,容器内对应 /app/config/。挂载的时候用 -v 把宿主机目录映射进去,这样改配置不用进容器。
# 宿主机目录准备 mkdir -p /vol1/docker/openclaw/config mkdir -p /vol1/docker/openclaw/data mkdir -p /vol1/docker/openclaw/logs然后是 settings.json 的骨架。这个文件控制 OpenClaw 的日志级别、并发数、工作目录。字段不多,但少一个都可能让容器启动后立刻退出。
{ "log_level": "info", "max_concurrent_tasks": 2, "workspace": "/app/data", "log_dir": "/app/logs", "auto_restart": true, "task_timeout_seconds": 600 }max_concurrent_tasks 建议先给 2,给太高在 NAS 上容易把内存打满。task_timeout_seconds 是单个任务的超时时间,默认 600 秒够用,如果你的任务比较重可以往上调。
接下来是 config.toml,这是重点。模型通道、API Key、base_url 都在这里。
[model] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "你的TaoToken Key" model_name = "claude-sonnet-4-20250514" max_tokens = 8192 temperature = 0.3 [agent] name = "openclaw" workspace = "/app/data" allowed_tools = ["shell", "file_read", "file_write"] [server] host = "0.0.0.0" port = 8080provider 填 openai-compatible 是因为 TaoToken 的 API 走的是兼容 OpenAI 的协议格式,OpenClaw 能直接识别。base_url 就是前面说的 https://taotoken.net/api ,不要加斜杠结尾。model_name 按你实际要用的模型填,TaoToken 文档里有完整的模型列表。
容器启动命令长这样:
docker run -d \ --name openclaw \ --restart unless-stopped \ -p 8080:8080 \ -v /vol1/docker/openclaw/config:/app/config \ -v /vol1/docker/openclaw/data:/app/data \ -v /vol1/docker/openclaw/logs:/app/logs \ openclaw/openclaw:latest这里有个坑:fnOS 的 Docker 存储目录和标准 Linux 不一样,如果你把 config 目录放在系统盘,重启后可能会被清理。所以一定要放在 /vol1 这种数据卷下面。另外端口映射如果 8080 被占用了,换成 8081 也行,但 config.toml 里的 port 要同步改。
4. 验证请求:重启后确认模型调用生效
配置写完,容器起来之后,别急着丢任务进去。先做一次最小验证,确认模型通道是通的。这一步能帮你把“配置错误”和“模型调用失败”分开排查。
第一步,看容器日志有没有报配置解析错误:
docker logs -f openclaw如果看到 config loaded successfully 和 server started on 0.0.0.0:8080,说明配置文件本身没问题。如果看到 parse error 或者 missing field,回去检查 config.toml 的字段名和缩进。
第二步,直接调 OpenClaw 的健康检查接口,确认服务活着:
curl -s http://127.0.0.1:8080/health正常返回应该是 {"status":"ok"} 之类的 JSON。如果连不上,检查端口映射和容器状态。
第三步,发一个最小的模型调用请求,验证 TaoToken 通道是否生效。OpenClaw 一般会暴露一个 /v1/chat/completions 之类的接口,具体路径看版本。我这边用的是:
curl -s http://127.0.0.1:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复一个字:好"}], "max_tokens": 16 }'如果返回里带了 choices 字段,并且 content 是“好”,说明从容器到 TaoToken 再到模型的整条链路是通的。如果返回 401,说明 api_key 写错了或者 Key 没生效;如果返回 404,说明 base_url 或者路径不对;如果返回超时,检查 NAS 的出网是否正常。
第四步,重启容器再验证一次。这一步很关键,因为很多配置在首次启动时能读,重启后就丢了,通常是挂载路径写成了容器内临时目录。
docker restart openclaw sleep 10 curl -s http://127.0.0.1:8080/health重启后健康检查仍然返回 ok,并且再发一次模型请求也能正常返回,才算真正部署完成。我实测下来,只要 config.toml 挂载正确,重启后模型调用是稳定的。
5. 本篇常见错排查
部署 OpenClaw 的过程中,报错基本集中在几个地方。我把踩过的坑列出来,你对照着查。
第一个高频错误是容器启动后立刻退出,日志里只有一行 config file not found。这通常是挂载路径写错了。宿主机目录是 /vol1/docker/openclaw/config,容器内必须是 /app/config,两边名字要对上。fnOS 上还要注意大小写,Linux 是区分大小写的。
第二个是模型调用返回 401 Unauthorized。先确认 api_key 有没有多余的空格,TOML 里字符串不要用中文引号。然后去 TaoToken 控制台看这个 Key 的状态和额度。如果 Key 没问题,检查 base_url 是不是写成了 https://taotoken.net/api/ ,结尾多一个斜杠有时候会导致路径拼接错误。
第三个是容器能启动,但任务执行到一半就断。看 logs 目录下的日志,如果出现 task timeout,把 config.toml 里的 task_timeout_seconds 调大。如果是内存不足被 OOM kill,把 max_concurrent_tasks 降到 1,或者给容器加内存限制。
第四个是 fnOS 上镜像拉不下来。这是网络问题,不是配置问题。可以换镜像源,或者先把镜像在别的机器上拉好再导入。注意不要在配置文件里写任何网络代理相关的字段,OpenClaw 本身不需要这些。
第五个是改了 config.toml 之后不生效。OpenClaw 不会热加载配置,改完必须 docker restart openclaw。如果你改了配置但没重启,会一直用旧的 Key 和 base_url,排查半天以为是 Key 失效,其实是没重启。
注意:每次改完 config.toml 或 settings.json,养成先 docker restart 再验证的习惯,能省掉大量无效排查。
6. 接入文档与 Coding Plan 入口
配置跑通之后,如果你还想把 OpenClaw 接到更多工具链里,或者想让它长期跑编码任务,可以走 TaoToken 的接入文档和 Coding Plan。接入文档里有完整的 API 字段说明和不同语言的调用示例,地址是 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。Coding Plan 更适合长期编码和 Agent 场景,地址是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。
如果你用的是 Claude Code 这类工具,TaoToken 也有对应的 Anthropic 通道配置说明,入口在 https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite 。控制台统一在 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite ,Key 管理、额度查看、用量统计都在里面。
我自己的习惯是,OpenClaw 容器里只放一个专用 Key,所有模型调用都走 TaoToken 的统一通道。这样换模型的时候只改 config.toml 里的 model_name,容器不用重建,Key 也不用换。凌晨两点改配置这件事,能少一次是一次。