1. Windows 本机 Docker 跑 OpenClaw 到底卡在哪
OpenClaw 是一个可以本地自托管的 AI Agent 网关,它能把你常用的模型服务统一收口到一个入口,再通过控制台、命令行或 API 对外提供对话与工具调用能力。适合谁?适合那些不想把对话记录和密钥散落在各种客户端里、希望在自己 Windows 机器上用 Docker 跑一套可控环境的开发者。核心检索词就是 OpenClaw Windows Docker 部署,这篇就围绕这条路径把每一步写实。
很多人第一次在 Windows 上折腾 OpenClaw,卡点往往不在 OpenClaw 本身,而在三件事:Docker Desktop 的 WSL2 后端没就绪、容器里外路径映射写错、以及模型接入的 Base URL 和 Key 填错位置。前两个是环境问题,第三个是配置问题。环境问题报错很直白,配置问题则经常表现为容器起来了、端口也监听了,但一发请求就 401 或者 reading choices 报错。
我试过在一台 Win10 22H2 的机器上从零走一遍,最大的感受是:只要把 docker-compose 和 .env 两个文件写对,后面基本就是复制粘贴。真正容易翻车的是把 API Key 直接写进 compose 的 environment 里,改一次要重建容器,很烦。更稳的做法是统一放到 .env,compose 只做引用。
这篇的路线是:先确认 Docker Desktop 可用,再准备目录和配置文件,然后用 docker-compose 起容器,接着把 TaoToken 的统一 Key 和 API 通道填进 OpenClaw 的 provider 配置,最后做一次健康检查和一次真实对话请求验证。全程命令都可以直接复制,路径按 Windows 的习惯写。
需要提前说明一点:下面所有涉及模型接入的地方,Base URL 都指向 TaoToken 的 API 通道https://taotoken.net/api,Key 用你在控制台生成的统一 Key。这样你换模型时不用改一堆客户端,只改 OpenClaw 里的 model 字段就行。官网入口放在这里方便你对照:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。
2. 前置准备:Docker Desktop 与 TaoToken 统一 Key
2.1 确认 Docker Desktop 后端就绪
Windows 上跑 Linux 容器,Docker Desktop 默认走 WSL2 后端。装完之后先在 PowerShell 里确认两件事:Docker 引擎在跑,以及 WSL2 版本正常。
docker version wsl --statusdocker version能同时打印 Client 和 Server 两段信息,说明引擎已经起来了。如果只有 Client 没有 Server,多半是 Docker Desktop 没启动,或者 WSL2 集成没开。wsl --status会显示默认发行版和内核版本,内核版本过低时 Docker Desktop 会提示更新。
接着确认 compose 插件可用。新版 Docker Desktop 自带docker compose(注意是空格,不是连字符的老版docker-compose)。
docker compose version输出类似Docker Compose version v2.x.x就没问题。如果提示找不到命令,去 Docker Desktop 设置里确认 Compose 组件已启用。
2.2 准备目录结构
OpenClaw 容器内的工作目录是/home/node/.openclaw,我们要把它映射到 Windows 用户目录下,方便直接改配置文件。在 PowerShell 里建目录:
mkdir -Force $env:USERPROFILE\.openclaw mkdir -Force $env:USERPROFILE\.openclaw\data第一条建配置根目录,第二条建一个数据子目录备用。映射之后,容器里写的配置会落到C:\Users\你的用户名\.openclaw,你用记事本或 VS Code 就能直接编辑,不用进容器。
2.3 拿 TaoToken 统一 Key
打开控制台生成一个 API Key,这个 Key 就是后面 .env 里的值。生成入口在 API Keys 页面:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。生成后先复制到记事本,页面刷新后通常不再完整显示。
这里要强调一个概念:TaoToken 提供的是统一的 API 通道,Base URL 固定为https://taotoken.net/api,你拿到的 Key 可以调用通道里支持的多个模型。所以 OpenClaw 里只需要配一个 provider,模型名按需切换,不用为每个模型单独配一套 Key。想先看看通道里有哪些模型可选,可以去模型对话页面点几下:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。
如果你后面打算长期跑编码类 Agent 任务,可以顺带了解 Coding Plan,它更适合高频调用场景:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。接入细节和字段说明统一看文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。
3. 可复制配置:docker-compose.yml 与 .env
3.1 写 .env 文件
在$env:USERPROFILE\.openclaw目录下新建.env文件,内容如下。注意 Key 不要加引号,等号两边不要有空格。
# TaoToken 统一 Key TAOTOKEN_API_KEY=sk-你的TaoToken密钥 # TaoToken API 通道地址 TAOTOKEN_BASE_URL=https://taotoken.net/api # OpenClaw 默认模型,按通道支持的模型名填写 OPENCLAW_DEFAULT_MODEL=gpt-4o-mini # 控制台访问端口 OPENCLAW_PORT=18789这里TAOTOKEN_BASE_URL就是统一 API 通道地址,后面会通过 compose 的 environment 传进容器,再由 OpenClaw 的 provider 配置读取。模型名先填一个通道里确定支持的,验证通了再换。
3.2 写 docker-compose.yml
在同一个目录下新建docker-compose.yml。这份配置做了四件事:映射两个端口、挂载配置目录、注入环境变量、设置自动重启。
services: openclaw: image: ghcr.io/openclaw/openclaw:latest container_name: openclaw restart: unless-stopped ports: - "18789:18789" - "1878:1878" volumes: - "${USERPROFILE}/.openclaw:/home/node/.openclaw" environment: - OPENAI_API_KEY=${TAOTOKEN_API_KEY} - OPENAI_BASE_URL=${TAOTOKEN_BASE_URL} - OPENCLAW_DEFAULT_MODEL=${OPENCLAW_DEFAULT_MODEL} healthcheck: test: ["CMD", "curl", "-f", "http://127.0.0.1:18789/"] interval: 30s timeout: 5s retries: 3 start_period: 20s几个关键点解释一下。OPENAI_API_KEY和OPENAI_BASE_URL这两个环境变量名是 OpenClaw 兼容 OpenAI 协议时读取的,我们把 TaoToken 的 Key 和通道地址喂进去,容器启动后 OpenClaw 就能用这套凭据访问统一通道。volumes那行用了${USERPROFILE},在 Windows 的 Docker Desktop 里能正确展开成用户目录。
注意:如果你在 PowerShell 里直接跑docker compose,${USERPROFILE}由 compose 解析;如果你用的是 Git Bash,环境变量名可能不同,建议统一在 PowerShell 里操作。
3.3 关于 provider 配置文件的写法
OpenClaw 也支持在openclaw.json里显式声明 provider。如果你不想用环境变量,可以在$env:USERPROFILE\.openclaw\openclaw.json里写:
{ "providers": { "taotoken": { "apiKey": "sk-你的TaoToken密钥", "baseUrl": "https://taotoken.net/api" } }, "agents": { "defaults": { "model": { "primary": "taotoken/gpt-4o-mini" } } } }两种方式选一种即可,不要同时配,否则容易出现优先级混乱。用环境变量的好处是 Key 不进配置文件,改 Key 只改 .env。用 JSON 的好处是模型和 provider 关系一目了然。我个人倾向环境变量管凭据、JSON 管模型路由,分工清楚。
4. 启动容器与验证一次真实对话
4.1 启动并观察日志
在docker-compose.yml所在目录打开 PowerShell,执行:
docker compose up -d docker compose logs -f openclawup -d后台启动,logs -f跟日志。第一次会拉镜像,耐心等。看到类似gateway listening on 0.0.0.0:18789的输出,说明服务起来了。按 Ctrl+C 退出日志跟踪,容器不受影响。
确认容器状态和端口监听:
docker compose ps netstat -an | findstr 18789docker compose ps的 STATUS 列显示Up ... (healthy)就说明健康检查也过了。netstat能看到 18789 处于 LISTENING。
4.2 健康检查请求
先做一次最基础的 HTTP 探测,确认网关响应:
curl.exe -v http://127.0.0.1:18789/注意在 PowerShell 里curl是Invoke-WebRequest的别名,参数不兼容,所以显式写curl.exe。返回 200 或带 JSON 的响应体都算正常。如果连接被拒绝,回到上一步看容器是否真的在跑。
4.3 发一次对话请求验证模型通道
这一步是重点,验证 TaoToken 统一 Key 是否真的通了。OpenClaw 暴露了兼容 OpenAI 的接口,我们直接打:
curl.exe -X POST http://127.0.0.1:18789/v1/chat/completions ` -H "Content-Type: application/json" ` -H "Authorization: Bearer sk-你的TaoToken密钥" ` -d '{\"model\":\"gpt-4o-mini\",\"messages\":[{\"role\":\"user\",\"content\":\"用一句话说明你是什么\"}]}'如果返回里带choices数组和一段正常文本,说明整条链路通了:请求进 OpenClaw,OpenClaw 用配置的 Base URL 转发到 TaoToken 通道,通道返回模型结果。这一步成功,你的本地自托管环境就算落地了。
想更直观地看对话效果,也可以打开控制台页面:http://127.0.0.1:18789/ 。控制台地址带 Token 时可以用命令获取:
docker exec openclaw openclaw dashboard --no-open它会打印一个带 Token 的完整 URL,复制到浏览器即可。
5. 常见报错排查:401、local proxy failed 与 reading choices
5.1 401 Unauthorized
最常见。表现是请求返回{"error":{"message":"...401..."}}。原因通常是三类:Key 复制时带了空格或换行、.env 里 Key 被引号包住导致值不对、或者容器没重新加载 .env。
排查顺序:先docker compose config看 compose 解析后的 environment 里 Key 长什么样,确认没有多余字符。然后docker exec openclaw env | findstr OPENAI看容器内实际拿到的值。改完 .env 后必须docker compose up -d重建容器,光 restart 不会重新读 .env。
5.2 local proxy failed
这个报错一般出现在容器内访问外部地址失败时。OpenClaw 容器要访问https://taotoken.net/api,如果容器网络出不去,就会报 local proxy failed 或连接超时。
先在容器内测连通性:
docker exec -it openclaw sh -c "curl -v https://taotoken.net/api"如果这里就失败,说明是容器网络问题,检查 Docker Desktop 的网络设置,确认没有把容器网络限制死。如果容器内能通、但 OpenClaw 转发失败,那多半是 Base URL 写错了,比如漏了/api或者多了斜杠。Base URL 必须是https://taotoken.net/api,不要写成https://taotoken.net/api/v1,路径拼接由 OpenClaw 处理。
5.3 reading choices 报错
reading 'choices'这类报错,本质是 OpenClaw 期望拿到 OpenAI 格式的响应,但实际拿到的不是。常见原因是模型名填错,通道返回了一个错误对象而不是正常的 completions 结构。
排查:先用 curl 直接打通道确认模型名有效,再对照 OpenClaw 里配的 model 字段。如果你在 openclaw.json 里用了taotoken/模型名这种带前缀的写法,确认前缀和 provider 名一致。另外注意 JSON 里不要写注释,标准 JSON 不支持//,带注释会导致解析失败,进而 provider 没加载,请求走到默认逻辑上就报 reading choices。
5.4 端口占用与容器名冲突
如果docker compose up -d报端口被占用,先查是谁占了:
netstat -ano | findstr 18789拿到 PID 后用任务管理器结束,或者改 .env 里的OPENCLAW_PORT换一个端口,同时改 compose 的 ports 映射。容器名冲突则先docker rm -f openclaw再起。
5.5 配置改了不生效
OpenClaw 读的是/home/node/.openclaw/openclaw.json。你在 Windows 侧改的是映射目录里的文件,改完要确认容器能看到:
docker exec -it openclaw cat /home/node/.openclaw/openclaw.json如果内容还是旧的,检查映射路径是否写对。Windows 路径映射到 Linux 容器时,注意盘符和大小写。用${USERPROFILE}展开通常没问题,但如果你手动写了C:\Users\...,在 compose 里要写成/c/Users/...或C:/Users/...这种形式。
6. 把统一 Key 用顺:后续接入与文档入口
环境跑通之后,日常使用其实就三件事:改模型、看日志、按需重启。改模型只动 .env 里的OPENCLAW_DEFAULT_MODEL或 openclaw.json 里的 model 字段,然后docker compose up -d。看日志用docker compose logs -f openclaw。重启用docker compose restart openclaw,但记住改 .env 要 up 不要 restart。
如果你后面要在别的客户端里也复用这套统一 Key,比如命令行工具或编辑器插件,Base URL 依然是https://taotoken.net/api,Key 还是同一个。这样你所有工具的模型接入都收口到一处,换模型、查用量、管额度都方便。API Keys 管理入口:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。
接入过程中遇到字段含义不清楚的,直接翻文档最省事:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。文档里对 Base URL、鉴权头、模型名的写法都有说明,比在报错里猜要快得多。
最后留一个实用习惯:把 .env 和 docker-compose.yml 一起放进一个 git 仓库管理,但 .env 加进 .gitignore,只提交一份 .env.example。这样换机器时 clone 下来改个 Key 就能跑,也不会把密钥推到远端。容器重建、镜像升级这些操作,配合docker compose pull && docker compose up -d两条命令就能完成,升级前先备份一下$env:USERPROFILE\.openclaw目录,出问题能快速回滚。