
1. 为什么要在 Linux 上用 Docker 跑 OpenClawOpenClaw 是一个以 TypeScript 为主的大型项目运行环境要求 Node.js ≥ 22官方同时提供了 Docker 安装方式。如果你直接把它装在宿主机上Node 版本、全局依赖、Playwright 浏览器内核这些东西会和你现有的开发环境互相打架卸载的时候还容易留下残留。用 Docker 部署 OpenClaw 的核心价值就在于隔离容器里跑的是它自己的一套运行时宿主机只负责提供 CPU、内存和磁盘误操作和数据泄露的风险都被限制在容器边界内。我这次的目标场景很明确一台普通的 Linux 服务器不额外买机器用 Docker Compose 把 OpenClaw 的 gateway 服务拉起来然后通过 TaoToken 的统一 Key 和 API 通道完成模型接入。这样做的另一个好处是模型鉴权信息集中在环境变量里管理不用在多个配置文件之间来回改。适合读这篇的人大概有三类一是想在服务器上长期挂一个 OpenClaw 实例、但不想污染宿主环境的开发者二是手里有多个模型供应商、希望用统一 Key 简化接入的团队三是已经装过 OpenClaw、但卡在权限、配对或网络连接问题上的同学。下面我会把 Docker Compose 配置、环境变量、鉴权设置、启动验证和日志排查都拆开讲每一步都能直接复制。需要先说明一点OpenClaw 项目迭代非常快镜像体积和配置项在不同版本之间差异明显。我实测下来上周的镜像还是 1.88G这周加了 Playwright 和 Python 工具后已经涨到 4.2G。所以下面的配置以「结构正确、字段可复用」为准具体版本号你按自己拉到的 tag 调整。2. TaoToken 统一 Key 接入 OpenClaw 的前置准备在动 Docker 之前先把模型通道这件事理清楚。OpenClaw 本身不绑定某一家模型它通过 gateway 配置里的 provider 和 API Key 去调用外部模型服务。如果你每个模型都单独配一套 Key配置文件会变得很难维护尤其是当你想在 Kimi、Claude、GPT 之间切换做对比测试的时候。TaoToken 在这里扮演的角色是统一入口你只需要一个 Key就能通过它的 API 通道访问多种模型。对 OpenClaw 来说它看到的就是一个标准的 OpenAI 兼容接口Base URL 指向 TaoToken 的 API 地址Model ID 填你实际要用的模型名。这样 gateway 的鉴权配置只需要维护一份换模型只改一个字符串。前置准备分三步。第一步拿到 TaoToken 的 API Key。访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后进入控制台创建 Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 只在创建时完整显示一次复制后先存到密码管理器里。第二步确认你要用的 Model ID。如果你不确定有哪些可选可以打开模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 实际发一条消息页面里会显示当前调用的模型标识。把这个 Model ID 记下来后面写进 OpenClaw 的配置。第三步确认 API 端点。TaoToken 的 API 基础地址是 https://taotoken.net/api 注意这个地址不带任何查询参数。OpenClaw 的 gateway 配置里通常需要填完整的 chat completions 路径也就是在基础地址后面接 /v1/chat/completions具体以你所用版本的 provider 模板为准。这里有个容易踩的坑不要把官网首页地址当成 API 地址填进去。首页是给人看的API 是给程序调的两者路径不同。我第一次配的时候就犯过这个错gateway 日志里一直报 404排查了半天才发现是 Base URL 写成了首页。另外如果你打算长期跑编码类或 Agent 类任务可以了解一下 Coding Plan地址是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。它的定位是给持续性的代码生成和 Agent 调用提供更稳定的额度适合 OpenClaw 这种会长时间在后台跑任务的场景。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言的调用示例配之前扫一眼能省不少事。3. 可复制的 Docker Compose 与环境变量配置这一节是全文的核心我会给出完整的目录结构、docker-compose.yml、.env 和 openclaw.json 片段。你按顺序创建文件即可。先建目录。我习惯把配置和数据分开方便备份和迁移sudo mkdir -p /opt/openclaw/{config,data} sudo chown -R 1000:1000 /opt/openclaw注意这里的 1000:1000 是宿主机上运行容器的用户 UID/GID。OpenClaw 镜像内默认的 node 用户 UID 也是 1000保持一致能避免后面读写权限报错。如果你宿主机上 UID 1000 已经被别的用户占了要么改这个目录的属主要么在构建镜像时指定 UID后者更规范但麻烦一些。接下来是 docker-compose.yml。我把它放在 /opt/openclaw 下services: openclaw-gateway: image: openclaw/gateway:latest container_name: openclaw-gateway restart: unless-stopped env_file: - .env ports: - 18789:18789 volumes: - ./config:/home/node/.openclaw - ./data:/home/node/.openclaw/data environment: - NODE_ENVproduction - OPENCLAW_GATEWAY_BIND0.0.0.0 healthcheck: test: [CMD, curl, -f, http://localhost:18789/health] interval: 30s timeout: 5s retries: 3几个关键点解释一下。ports 把容器内的 18789 映射到宿主机这是 OpenClaw 管理面板和 gateway 的默认端口。volumes 把 config 目录挂进去对应容器内的 /home/node/.openclaw这样配置持久化在宿主机上容器重建不丢。healthcheck 用 curl 探活后面排查启动问题时会用到。然后是 .env 文件和 docker-compose.yml 同目录# TaoToken 统一接入 TAOTOKEN_API_KEYsk-你的TaoToken密钥 TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_MODEL_ID你的模型ID # OpenClaw gateway 鉴权 OPENCLAW_GATEWAY_TOKEN自己生成一个足够长的随机串 OPENCLAW_GATEWAY_PORT18789OPENCLAW_GATEWAY_TOKEN 建议用 openssl rand -hex 32 生成别用弱口令。这个 Token 是浏览器访问管理面板时要带的泄露了别人就能操作你的实例。最后是 openclaw.json放在 /opt/openclaw/config 下。这个文件是 OpenClaw 根据用户配置生成的我们手动写一份最小可用版本{ gateway: { mode: local, auth: { mode: token, token: 你的OPENCLAW_GATEWAY_TOKEN }, controlUi: { allowInsecureAuth: true }, port: 18789, bind: lan, tailscale: { mode: off, resetOnExit: false } }, providers: { taotoken: { type: openai-compatible, baseUrl: https://taotoken.net/api/v1, apiKey: 你的TAOTOKEN_API_KEY, model: 你的模型ID } } }controlUi.allowInsecureAuth 设为 true 是为了绕过初始的 pairing required 校验这个后面排障章节会详细说。providers 段里的 baseUrl 我写的是 https://taotoken.net/api/v1因为 OpenAI 兼容接口的 chat completions 路径是 /v1/chat/completions具体以你版本里的 provider 模板为准如果报 404 就检查这里。三件套齐了Base URL、Key、Model ID。这三个值在 TaoToken 侧对应 API 地址、控制台创建的 Key、以及模型对话页显示的模型标识。任何一处写错gateway 都会在调用时报鉴权失败或模型不存在。4. 启动容器并验证请求是否打通配置写完后启动命令很简单cd /opt/openclaw docker compose up -d openclaw-gateway第一次启动会拉镜像4G 左右取决于你的网络。拉完后用 docker compose ps 看状态healthy 表示探活通过。如果显示 starting等 30 秒再看。接着看日志确认 gateway 有没有正常加载配置docker compose logs -f openclaw-gateway正常的话你会看到类似 gateway listening on 0.0.0.0:18789 和 provider taotoken registered 的输出。如果 provider 没注册成功日志里会有明确的报错比如 invalid api key 或 unknown provider type。现在验证模型调用。最直接的方式是进容器用 curl 打一次 TaoToken 的接口docker exec -it openclaw-gateway sh curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: $TAOTOKEN_MODEL_ID, messages: [{role: user, content: ping}], max_tokens: 16 }如果返回 JSON 里 choices[0].message.content 有内容说明 Key、Base URL、Model ID 三件套都是通的。这一步很关键它把「网络问题」和「OpenClaw 配置问题」隔离开了。如果这条 curl 就失败那问题在 TaoToken 侧或容器网络如果这条成功但 OpenClaw 调用失败问题就在 openclaw.json 的 provider 配置。浏览器访问管理面板http://你的服务器IP:18789?token你的OPENCLAW_GATEWAY_TOKEN能打开聊天界面并正常收发消息就说明整条链路通了。如果提示 pairing required看下一节。验证通过后建议把容器设为开机自启restart: unless-stopped 已经覆盖了这一点。另外可以配一个简单的日志轮转避免日志文件把磁盘写满docker compose logs --tail100 openclaw-gateway日常排查用 tail 看最近 100 行就够了不用 -f 一直挂着。5. 常见报错排查401、pairing required 与网络连接失败这一节按真实报错来组织你遇到哪个直接对号入座。401 Unauthorized。这个最常见出现在 curl 验证或 OpenClaw 调用模型时。原因通常是三类Key 复制时带了空格或换行、Key 已失效或被删除、Authorization 头格式不对。先检查 .env 里的 TAOTOKEN_API_KEY 有没有多余字符然后确认控制台里这个 Key 还在。如果都没问题检查 openclaw.json 里 providers.taotoken.apiKey 是否和 .env 一致。注意 OpenClaw 不会自动把 .env 的值注入到 openclaw.json两个文件里的 Key 要手动保持一致或者用环境变量引用语法取决于版本支持。pairing required (1008)。浏览器访问管理面板时被拒绝提示需要配对。这是严格安全校验导致的官方文档的配对流程在某些版本上走不通。解决办法是编辑 openclaw.json确保 gateway.controlUi.allowInsecureAuth 为 true然后重启容器docker compose restart openclaw-gateway重启后再用带 token 的 URL 访问。如果还是不行检查 gateway.auth.mode 是否为 token以及 token 值是否和 URL 里的一致。这个配置只建议在受信任的内网环境用公网暴露的话还是走正规配对流程。local proxy failed / 连接被拒绝。CLI 容器连不上 gateway 容器时会出现。原因是 CLI 容器内部无法解析 gateway 地址。解决办法是在 openclaw.json 的 gateway 段里明确指定可访问的 URL比如 ws://192.168.10.165:18789用宿主机的局域网 IP 而不是 localhost。不过说实话openclaw-cli 的主要用途是初始安装阶段生成配置日常管理直接 docker exec 进 gateway 容器执行命令就行CLI 和 Gateway 的网络连通性并非必需。所以这个报错可以不用死磕。reading choices 报错。调用模型后返回的 JSON 里没有 choices 字段通常是 Base URL 路径不对。检查 openclaw.json 里 baseUrl 是否带了 /v1以及 TaoToken 的 API 地址是否写成了首页。正确的基础地址是 https://taotoken.net/api chat completions 完整路径是 https://taotoken.net/api/v1/chat/completions。OAuth 相关报错。如果你在配置里误开了 OAuth 模式但用的是 API Key 鉴权会报 OAuth token missing。把 provider 的鉴权模式改回 apiKey 即可。OpenClaw 的 provider 配置里 type 为 openai-compatible 时默认走 Bearer Token不需要 OAuth。权限问题容器无法读写配置目录。报错通常是 permission denied 或 EACCES。原因是宿主机上 config 目录的属主 UID 和容器内 node 用户的 UID 不一致。快速验证用 chmod 777但长期方案是保持 UID 一致sudo chown -R 1000:1000 /opt/openclaw/config sudo chown -R 1000:1000 /opt/openclaw/data如果你宿主机上 UID 1000 是别的用户那就创建容器用户时指定 UID或者在构建镜像时用 --build-arg 传入。测试环境用 777 能快速排除问题但别带到生产。排查顺序建议固定下来先 curl 直连 TaoToken 验证三件套再看 gateway 日志确认 provider 注册最后看浏览器访问和容器权限。这样能把问题范围一步步缩小不会东改西改。6. 长期运行建议与接入入口容器跑起来只是开始长期稳定运行还需要注意几件事。第一镜像版本要锁定。OpenClaw 迭代快latest 标签可能今天和明天拉到的不是同一个东西。生产环境建议用具体 tag比如 openclaw/gateway:v2026.2.2升级前先在测试目录拉一份新配置验证。第二日志和磁盘监控。4G 的镜像加上 Playwright 运行时磁盘占用不小。定期 docker system prune 清理无用镜像日志用 docker compose logs --tail 查看而不是全量导出。第三Key 轮换。TaoToken 的 Key 如果怀疑泄露在控制台重新生成一个更新 .env 和 openclaw.json 后重启容器即可。因为鉴权信息集中在两个文件里轮换成本很低这也是统一 Key 接入的好处之一。第四模型切换。想换模型时只改 openclaw.json 里 providers.taotoken.model 的值重启 gateway 生效。不用动 Docker 配置也不用重新构建镜像。如果你还没创建 Key入口在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。接入过程中遇到配置问题文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里有各语言的完整示例。想先验证模型效果再决定用哪个可以打开模型对话 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 直接试。长期跑编码和 Agent 任务的话Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 的额度模型更适合后台常驻场景。最后说个实际经验OpenClaw 的安装过程确实有点折腾作者也提到代码大量依赖大模型生成项目复杂度增长很快。但用 Docker 隔离之后最坏情况就是删掉容器和目录重来不会影响宿主机上的其他服务。把配置、数据、镜像三层分开管理升级和回滚都会轻松很多。