OpenClaw 部署指南:Docker 化 AI Agent 从入门到安全加固,TaoToken 统一 Key 接入 1. 为什么 OpenClaw 值得用 Docker 跑起来OpenClaw 是 2026 年初开源的一个全能型 AI Agent 运行时简单说就是「你自己的私人 AI 助手后台」。它能接入微信、企业微信、飞书、钉钉、Telegram 等十几种消息渠道把消息聚合到一个面板里再通过工具调用去执行 Shell 命令、控制浏览器、读写文件、联动设备。项目本身 MIT 协议开源免费可商用核心程序体积不到 200MB2 核 2G 的机器就能跑起来。但正因为 OpenClaw 权限大——它能执行系统命令、能访问你的聊天记录、能拿到你配置的模型 API Key——所以「怎么部署」这件事直接决定了你的安全边界。裸机直接跑一旦 Control Plane 暴露在公网又没开认证攻击者可以顺着 19890 端口接管整个实例拿走你的 Key、删你的文件、冒充你发消息。这不是危言耸听2026 年 2 月就有安全研究员扫出 1200 多个无认证暴露的 OpenClaw 实例。Docker 化部署解决的正是这个问题容器隔离、只读根文件系统、丢弃内核能力、禁用沙箱网络、非 root 用户运行。配合 TaoToken 统一 Key 接入模型你只需要维护一个 API 通道不用在多个模型厂商之间来回切换配置。这篇就按「环境准备 → 容器编排 → 权限隔离 → 安全加固 → 连通性验证」的顺序把可复制的配置和踩坑点一次讲清楚。适合谁看想在云服务器或本地机器上长期跑 OpenClaw 的个人开发者需要给团队搭一个内部 AI 助手的运维以及已经装过但被 401、local proxy failed 这类报错卡住的人。2. TaoToken 前置准备统一 Key 与模型通道在动 Docker 之前先把模型接入这条链路理清楚。OpenClaw 的 LLM 推理层需要三个东西Base URL、API Key、Model ID。传统做法是每个模型厂商配一套OpenAI 一套、Anthropic 一套、国内厂商再各一套配置文件里堆一大坨Key 泄露风险也成倍增加。TaoToken 的思路是提供一个统一的 API 通道你拿一个 Key就能在同一个 Base URL 下调用不同模型。对 OpenClaw 这种需要「智能模型路由」的场景特别合适——简单任务走轻量模型复杂任务走强模型切换时只改 Model ID不用动 Key 和地址。具体操作路径先到官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册账号然后进控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 创建后只显示一次复制下来存到密码管理器里。API 的基础地址是 https://taotoken.net/api 注意这个地址不带任何查询参数直接作为 Base URL 填进配置。如果你用的是 OpenAI 兼容的 SDK 或工具通常需要在末尾加/v1也就是https://taotoken.net/api/v1具体看工具要求。模型 ID 怎么查进模型对话页面 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 可以直接试跑页面上会列出当前可用的模型标识。你也可以在文档页 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 找到完整的模型列表和参数说明。这里有个关键点OpenClaw 的配置文件里baseUrl和apiKey是分开写的。用 TaoToken 的话baseUrl固定填https://taotoken.net/api/v1apiKey填你创建的那个 KeydefaultModel填模型 ID。这样你后续换模型只改defaultModel一行不用碰 Key。如果你打算长期跑编码类 Agent 任务可以看一下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 它针对高频调用场景做了额度优化比按量计费更适合 7×24 运行的实例。Key 的管理建议不要用主账号的 Key 直接跑生产实例。在控制台里为 OpenClaw 单独建一个 Key权限范围限制到你需要的那几个模型万一泄露了也好吊销。API Keys 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。3. 可复制的 Docker Compose 配置这一节直接给能用的配置。我按「最小可用 安全加固」两个层次来写你可以先跑最小版验证连通性再叠加加固项。先建目录结构mkdir -p ~/openclaw-docker/{data,config,logs} cd ~/openclaw-docker然后是docker-compose.yml。注意几个关键设计Control Plane 只绑定127.0.0.1不直接暴露公网数据卷持久化到本地目录容器以非 root 用户运行根文件系统只读。version: 3.8 services: openclaw-core: image: openclaw/openclaw:2026.2.10 container_name: openclaw-core restart: unless-stopped user: 1000:1000 read_only: true ports: - 127.0.0.1:19890:19890 volumes: - ./data:/home/node/.openclaw - ./config:/home/node/.openclaw/config:ro - ./logs:/home/node/.openclaw/logs - /tmp/openclaw:/tmp environment: - OPENCLAW_AUTH_MODEtoken - OPENCLAW_AUTH_TOKEN${OPENCLAW_AUTH_TOKEN} - OPENCLAW_BIND127.0.0.1 - OPENCLAW_LOG_REDACTtrue - TZAsia/Shanghai cap_drop: - ALL cap_add: - NET_BIND_SERVICE security_opt: - no-new-privileges:true - seccomp:./seccomp-profile.json pids_limit: 256 mem_limit: 2g memswap_limit: 4g networks: - openclaw-internal openclaw-sandbox: image: openclaw/sandbox:alpine-slim container_name: openclaw-sandbox restart: unless-stopped user: 1000:1000 read_only: true network_mode: none volumes: - ./sandbox-workspace:/workspace:rw cap_drop: - ALL security_opt: - no-new-privileges:true pids_limit: 128 mem_limit: 1g tmpfs: - /tmp:size64m,noexec,nosuid networks: openclaw-internal: driver: bridge internal: false环境变量文件.env放在同目录权限设成600OPENCLAW_AUTH_TOKEN换成你用openssl生成的32位随机串 TAOTOKEN_API_KEY你的TaoToken Key TAOTOKEN_BASE_URLhttps://taotoken.net/api/v1 OPENCLAW_DEFAULT_MODEL你的模型ID生成 Token 的命令openssl rand -hex 32然后是 OpenClaw 自己的配置文件config/openclaw.json。这个文件挂载为只读容器内改不了只能从宿主机改防止运行时被篡改{ core: { bind: 127.0.0.1, auth: { mode: token, tokenLength: 32, allowIp: [127.0.0.1, 172.16.0.0/12] }, discovery: { mdns: disable } }, llm: { defaultModel: 你的模型ID, providers: { taotoken: { baseUrl: https://taotoken.net/api/v1, apiKey: ${TAOTOKEN_API_KEY}, type: openai-compatible } }, session: { resetMode: after-task, maxContextTokens: 30000, autoClean: true, toolOutputCache: local } }, agents: { defaults: { sandbox: { mode: always, scope: per-agent, workspaceAccess: none, docker: { image: openclaw/sandbox:alpine-slim, network: none, user: 1000:1000, readOnlyRoot: true } } } }, logging: { redact: true, redactPatterns: [sk-*, Bearer *, token*, apiKey*] } }注意apiKey这里写的是${TAOTOKEN_API_KEY}OpenClaw 支持从环境变量读取。如果你用的版本不支持变量插值就把实际 Key 填进去但那样配置文件里就有明文了记得把config目录权限收紧到700。启动命令docker compose up -d docker compose logs -f openclaw-core看到Control Plane listening on 127.0.0.1:19890就说明起来了。4. 验证请求与成功结果容器起来之后别急着开浏览器。先用命令行验证三件事Control Plane 是否响应、认证是否生效、模型通道是否通。第一步健康检查curl -s http://127.0.0.1:19890/health正常返回类似{status:ok,version:2026.2.10,uptime:42}如果返回connection refused说明容器没起来或者端口没映射对回去看docker compose ps和日志。第二步验证认证。不带 Token 访问应该被拒curl -s -o /dev/null -w %{http_code} http://127.0.0.1:19890/api/status期望返回401。如果返回200说明认证没生效检查.env里的OPENCLAW_AUTH_TOKEN是否被正确读取以及openclaw.json里auth.mode是不是token。带上 Token 再试curl -s -H Authorization: Bearer $OPENCLAW_AUTH_TOKEN \ http://127.0.0.1:19890/api/status应该返回实例状态、已加载的渠道、当前默认模型等信息。第三步验证模型通道。这是最容易出问题的地方。OpenClaw 提供了一个诊断命令docker compose exec openclaw-core openclaw doctor --llm它会实际发一个最小请求到配置的 Base URL返回类似[OK] LLM provider: taotoken [OK] Base URL: https://taotoken.net/api/v1 [OK] Model: 你的模型ID [OK] Latency: 842ms [OK] Response: pong如果这一步报错对照下一节的排查表。第四步跑一个端到端任务。通过 API 发一条消息curl -s -X POST http://127.0.0.1:19890/api/message \ -H Authorization: Bearer $OPENCLAW_AUTH_TOKEN \ -H Content-Type: application/json \ -d {channel:api,text:用一句话说明你现在运行在什么环境里}成功的话会返回模型生成的回复并且日志里能看到这次调用的 Token 消耗。到这一步说明 Docker 隔离、认证、模型通道三条链路全通了。如果你更习惯图形界面可以用 SSH 隧道把端口转到本地ssh -L 19890:127.0.0.1:19890 user你的服务器然后本地浏览器访问http://127.0.0.1:19890?token你的Token。这样 Control Plane 始终没有暴露在公网安全性最高。5. 本篇常见错误排查这一节按真实报错来。我把部署过程中最容易撞上的几个问题列出来每个都给定位方法和修复步骤。报错一401 Unauthorized现象是curl带 Token 也返回 401。先确认 Token 有没有多余空格.env文件里不要加引号。然后检查openclaw.json里的auth.allowIp是否包含你请求的来源 IP——如果你从宿主机 curl来源是127.0.0.1如果从另一台机器 curl来源是那台机器的内网 IP得加进白名单。还有一个坑tokenLength设成 32但你生成的 Token 长度不是 32某些版本会校验长度不匹配直接拒。用openssl rand -hex 32生成的就是 64 个字符32 字节的十六进制如果配置要求 32 字符改用openssl rand -hex 16。报错二local proxy failed / connection refused这个通常出现在容器内访问模型 API 时。原因有两个一是容器网络模式设成了none但 Control Plane 需要出网访问 TaoToken。注意区分——openclaw-sandbox容器是network_mode: none这是对的沙箱本来就不该出网但openclaw-core必须在openclaw-internal网络里且该网络internal: false允许出网。如果你把 core 也设成 none模型请求必然失败。二是 DNS 问题容器内解析不了taotoken.net在docker-compose.yml的 core 服务下加dns: [8.8.8.8, 1.1.1.1]试试。报错三reading choices: unexpected end of JSON input这是模型返回体解析失败。常见原因是 Base URL 写错了。TaoToken 的 API 地址是https://taotoken.net/api但 OpenAI 兼容接口需要/v1后缀所以配置里要写https://taotoken.net/api/v1。如果你只写了https://taotoken.net/api请求会打到错误的路径返回的不是标准 JSON解析就炸了。另一个可能是 Model ID 填错模型不存在时某些网关返回空体。去模型对话页面确认一下当前可用的模型标识。报错四OAuth token expired / auth.json 相关如果你同时用了 Claude Code 或其他需要 OAuth 的工具可能会混淆认证方式。OpenClaw 用的是 API Key 模式不是 OAuth。检查openclaw.json里 provider 的type是不是openai-compatible。如果你之前配过 Codex 的auth.json那个文件跟 OpenClaw 无关不要混用。三件套要写全Base URL 填https://taotoken.net/api/v1Key 填 TaoToken 创建的 KeyModel ID 填具体模型标识缺一不可。报错五容器启动后立即退出日志显示 permission denied这是只读根文件系统 非 root 用户导致的。OpenClaw 运行时需要写一些临时文件但read_only: true把根 fs 锁了。解决办法是在volumes里加- /tmp/openclaw:/tmp并且确保宿主机这个目录的属主是 uid 1000。命令sudo chown -R 1000:1000 /tmp/openclaw。另外data、logs目录也要同样处理。报错六seccomp profile 加载失败如果你用了自定义 seccomp 配置但文件路径不对容器会起不来。先确认seccomp-profile.json在docker-compose.yml同目录。如果不需要精细控制可以先删掉seccomp:./seccomp-profile.json这一行用 Docker 默认的 seccomp 策略安全性已经够用。等跑通了再叠加自定义策略。排查通用思路先docker compose logs openclaw-core看容器日志再docker compose exec openclaw-core openclaw doctor跑诊断最后用curl手动打接口。三层定位基本能覆盖九成问题。6. 安全加固检查清单与长期维护配置跑通只是开始长期运行的关键在加固和维护。这一节给一份可执行的检查清单你上线前逐项过一遍。认证层确认auth.mode是token或password永远不要用none。2026.2.10 版本已经强制移除无认证模式如果你还在用旧版本第一件事就是升级。Token 定期轮换建议 90 天换一次写个 cron 脚本自动生成新 Token 并重启容器。网络层Control Plane 只绑定127.0.0.1公网访问一律走 SSH 隧道或反向代理。如果必须用 Nginx 反代配置里加allow/deny限制来源 IP并且强制 HTTPS。防火墙只放行必要端口19890 绝对不要对公网开放。用ss -tlnp | grep 19890确认监听地址是127.0.0.1而不是0.0.0.0。容器层read_only: true、cap_drop: ALL、no-new-privileges:true、pids_limit、mem_limit这五项是基础。沙箱容器必须network: none工作区挂载用:rw但限制在专用目录不要挂宿主机敏感路径。定期用docker compose config检查配置有没有被意外改动。数据层data目录里存的是会话记录、渠道配置、工具输出缓存属于敏感数据。宿主机上把这个目录权限设成700属主是运行容器的用户。日志开启脱敏redactPatterns要覆盖你的 Key 格式。备份策略定期打包data和config但备份文件要加密因为里面有 API Key。模型通道层TaoToken 的 Key 单独创建权限最小化。在控制台里可以设置 Key 的可用模型范围只勾选 OpenClaw 实际要用的那几个。如果发现异常调用量第一时间去 API Keys 页面吊销旧 Key、创建新 Key然后更新.env重启容器。审计层OpenClaw 内置了安全审计命令定期跑docker compose exec openclaw-core openclaw security audit --deep它会检查认证配置、端口暴露、工具权限、插件来源、日志脱敏等。加--fix可以自动修复能修的问题。建议设成每周一次输出存到logs/audit/下。成本层Docker 部署本身不产生费用成本全在模型调用。用 TaoToken 的好处是可以在一个面板里看到所有模型的消耗明细。配置里开启session.resetMode: after-task和maxContextTokens能砍掉一大半上下文累积成本。心跳类任务用轻量模型复杂任务才切强模型。最后说一个实际经验我见过太多人把 OpenClaw 跑起来之后就不管了结果几个月后收到账单才发现后台心跳任务一直在烧 Token。Docker 化部署给了你隔离和可复现的环境但安全加固和成本控制是持续动作不是一次性配置。把上面这份清单存下来每次升级版本或改配置后过一遍能避开绝大多数坑。