1. 为什么在 Docker 里跑 OpenClaw 要先把 Key 通道理顺
OpenClaw(龙虾)是一个能连消息平台、能调工具、能读写工作区的个人 AI 助手。它跟普通聊天机器人最大的区别是:它真的会动你的文件、真的会发请求、真的会拿着你的 API Key 到处跑。所以当你决定用 Docker 部署它的时候,容器隔离只是第一层,第二层是模型接入通道怎么管。
我见过太多人把 OpenClaw 跑起来之后,.env里塞了五六个不同厂商的 Key,今天这个欠费、明天那个限流,排查半天发现是某个 Key 过期了。更麻烦的是,OpenClaw 的配置里模型通道是写在config.toml里的,一旦你要换模型或者换通道,就得进容器改配置、重启、再验证,来回折腾。
这篇要解决的问题很具体:在 Docker 环境里安全部署 OpenClaw,并且用 TaoToken 的统一 Key 作为模型接入通道,给出可以直接复制的config.toml骨架、docker compose启动参数,以及一次完整的连通性验证。适合已经在本地或服务器上跑 Docker、想让 OpenClaw 稳定接模型的人。
核心检索词先摆出来:Docker 部署 OpenClaw、config.toml 配置、TaoToken 统一 Key、容器安全参数、连通性验证。下面按“先讲清楚通道、再给配置、再验证、再排障”的顺序走。
2. TaoToken 前置:统一 Key 与 API 通道准备
TaoToken 在这里扮演的角色是“模型接入的统一入口”。你不需要在 OpenClaw 里为每个模型厂商单独配一套 Key 和 base_url,而是用 TaoToken 的一个 Key 走一个 API 地址,模型名在请求里区分。对 OpenClaw 这种要频繁切换模型做工具调用的场景,这一点很省事。
官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
API 地址(注意这个不加 UTM):https://taotoken.net/api
你需要提前做两件事:
第一,拿到 API Key。进控制台的 API Keys 页面创建一个,复制出来。这个 Key 就是后面.env里要填的值。地址:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
第二,确认你要用的模型名。OpenClaw 的config.toml里模型字段填的是模型标识,不是随便写的。你可以先在模型对话页面确认可用模型,再填进配置。地址:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite
注意:Key 只放在
.env里,不要写进config.toml,更不要提交到 Git。config.toml里只引用环境变量名。
如果你后面打算长期跑编码类或 Agent 类任务,可以了解下 Coding Plan,它更适合高频调用场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
3. 可复制配置:config.toml 骨架与 docker compose
这一节是全文的核心,直接给可复制内容。先看目录结构,再看config.toml,再看docker-compose.yml,最后看.env。
3.1 目录结构与权限准备
在宿主机上建一个工作目录,比如/opt/openclaw,结构如下:
/opt/openclaw ├── docker-compose.yml ├── .env └── .openclaw/ └── config.toml.openclaw这个目录会被挂载进容器,作为 OpenClaw 的配置和工作区。权限必须和容器内运行用户一致,否则容器里读不到配置。假设你用 UID 1000:
mkdir -p /opt/openclaw/.openclaw chown -R 1000:1000 /opt/openclaw/.openclaw chmod 700 /opt/openclaw/.openclawchmod 700是必要的,因为config.toml里虽然不直接放 Key,但工作区里可能有会话记录和工具输出,不该让其他用户读到。
3.2 config.toml 骨架
这是 OpenClaw 的模型通道配置骨架。关键点是base_url指向 TaoToken 的 API 地址,api_key用环境变量占位,模型名按你实际要用的填。
# /opt/openclaw/.openclaw/config.toml [gateway] host = "0.0.0.0" port = 18789 [model] # 统一走 TaoToken 通道 provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" model = "claude-sonnet-4-20250514" timeout_seconds = 120 max_retries = 2 [workspace] path = "/home/node/.openclaw/workspace" allow_write = true [tools] enabled = ["shell", "file", "http"] shell_timeout_seconds = 30几个字段说明一下。provider用openai-compatible是因为 TaoToken 的 API 走的是兼容 OpenAI 的请求格式,OpenClaw 支持这种通用 provider。api_key_env写的是环境变量名,不是 Key 本身,这样容器启动时从环境变量注入。model字段填你在模型对话页面确认过的模型标识,别照抄我这里的示例,按你实际可用的填。
[tools]里的shell和file是 OpenClaw 能干活的关键,但也意味着容器一旦被攻破,攻击者能通过工具执行命令。所以下一节的容器安全参数不是可选项。
3.3 docker-compose.yml 与安全参数
services: openclaw: image: openclaw/openclaw:latest container_name: openclaw restart: unless-stopped user: "1000:1000" security_opt: - no-new-privileges:true cap_drop: - ALL ports: - "127.0.0.1:18789:18789" env_file: - .env volumes: - ./.openclaw:/home/node/.openclaw read_only: true tmpfs: - /tmp:size=64m networks: - openclaw-net networks: openclaw-net: driver: bridge逐条解释为什么这么写。user: "1000:1000"让容器以普通用户运行,避免容器内进程拿到宿主机 root。no-new-privileges:true阻止容器内进程通过 setuid 提权。cap_drop: ALL移除所有 Linux capability,只留最基础的运行环境。read_only: true让容器根文件系统只读,配合tmpfs给/tmp一个可写空间,这样即使有进程想写恶意文件也写不进去。端口绑定127.0.0.1而不是0.0.0.0,意味着只有宿主机本机能访问 Dashboard,外网访问不到。
注意:
read_only: true之后,OpenClaw 如果尝试往容器内非挂载路径写文件会失败。工作区已经挂载到./.openclaw,所以正常读写不受影响。如果你发现某个功能报写入错误,先检查它是不是在往/home/node以外的路径写。
3.4 .env 文件
TAOTOKEN_API_KEY=sk-你的实际Key就这一行。Key 只在这里出现,config.toml通过api_key_env引用它。.env文件权限设成 600:
chmod 600 /opt/openclaw/.env4. 启动与验证请求:确认通道真的通了
配置写完,先做一次初始化,再启动,最后验证。
4.1 初始化与启动
cd /opt/openclaw docker compose run --rm openclaw-cli onboard docker compose up -donboard会生成一些必要的运行时文件,跑一次就行。然后up -d后台启动。检查容器状态:
docker compose ps docker compose logs --tail=50 openclaw日志里如果看到 gateway 在 18789 端口监听,说明启动成功。如果看到权限相关的报错,回到 3.1 检查.openclaw目录的 owner 和权限。
4.2 验证模型通道连通性
这一步是重点。我们要确认 OpenClaw 通过 TaoToken 通道能真的拿到模型响应。最直接的方式是进容器发一个请求:
docker compose exec openclaw sh -c ' curl -s -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d "{\"model\":\"claude-sonnet-4-20250514\",\"messages\":[{\"role\":\"user\",\"content\":\"ping\"}],\"max_tokens\":16}" '如果返回里有choices字段和内容,说明 Key 和通道都正常。如果返回 401,检查.env里的 Key 有没有多余空格。如果返回 404,检查base_url是不是写成了https://taotoken.net/api而不是别的路径。
4.3 验证 OpenClaw 自身调用
上面验证的是通道本身。再验证 OpenClaw 通过config.toml调用模型是否正常。进容器用 CLI 发一条消息:
docker compose run --rm openclaw-cli message "用一句话说明你当前使用的模型通道"如果 OpenClaw 返回了模型响应,说明config.toml里的base_url、api_key_env、model三个字段都生效了。这一步过了,整个部署就算通了。
4.4 获取 Dashboard Token
Dashboard 需要一个访问 Token,用这个命令拿:
docker compose run --rm openclaw-cli dashboard --no-open输出的 Token 复制出来,浏览器访问http://127.0.0.1:18789,粘贴 Token 登录。因为端口绑的是127.0.0.1,如果你在服务器上部署,需要用 SSH 端口转发才能从本地访问,这是刻意的安全设计。
5. 本篇常见错排查
部署过程中最容易卡住的几个点,我按出现频率排一下。
权限报错permission denied读写.openclaw:九成是宿主机目录 owner 不是 1000。执行chown -R 1000:1000 /opt/openclaw/.openclaw再重启容器。如果你宿主机第一个用户不是 1000,用id -u查一下实际 UID,把user和chown都改成对应值。
容器启动后立刻退出:先看docker compose logs openclaw。如果是config.toml解析错误,检查 TOML 语法,特别是字符串有没有漏引号。如果是read_only导致的写入失败,确认所有需要写的路径都挂载了。
模型请求返回 401:Key 问题。确认.env里TAOTOKEN_API_KEY=后面没有引号、没有空格。docker compose读.env时不会自动去引号,TAOTOKEN_API_KEY="sk-xxx"会把引号也当成值的一部分。
模型请求返回 404:base_url路径问题。TaoToken 的 API 根地址是https://taotoken.net/api,OpenClaw 的 openai-compatible provider 会自动拼/v1/chat/completions。如果你在base_url里多写了/v1,就会变成/v1/v1/...,直接 404。
Dashboard 打不开:端口绑的是127.0.0.1,外网访问不到是正常的。本地部署直接访问http://127.0.0.1:18789。服务器部署用ssh -L 18789:127.0.0.1:18789 user@server做端口转发,再在本地浏览器访问。
工具调用超时:config.toml里shell_timeout_seconds默认 30 秒,跑长命令会超。按需调大,但别调太大,避免卡死。同时确认timeout_seconds在[model]段里也够用,模型响应慢的时候 120 秒是合理起点。
改了 config.toml 不生效:OpenClaw 不会热加载配置,改完要docker compose restart openclaw。如果你只改了.env,同样要重启,因为环境变量是启动时注入的。
6. 后续接入与长期使用建议
部署通了之后,日常维护其实就三件事:Key 管理、配置备份、日志观察。
Key 管理上,TaoToken 的统一 Key 让你只需要维护一个凭证。如果 Key 需要轮换,改.env然后docker compose up -d重建容器即可,config.toml不用动。接入文档在这里,遇到字段问题可以对照:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
配置备份上,.openclaw目录整个打包就是完整备份,包括config.toml和工作区。建议定期备份,尤其是你调了很久的工具配置。
日志观察上,docker compose logs -f openclaw可以实时看。如果发现模型请求频繁重试,先看是不是max_retries设太大导致雪崩,再检查网络到 TaoToken 的延迟。
如果你后面要把 OpenClaw 接到编码工作流或者长期跑的 Agent 任务上,Coding Plan 的额度模型更适合这种持续调用场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite
最后提醒一句:read_only: true和cap_drop: ALL这两个参数,在你调试阶段可以先注释掉方便排查,但正式跑之前一定加回来。安全参数不是装饰,OpenClaw 能执行 shell 这件事本身就意味着它值得被认真隔离。