技术背景
从语言对话,到本地小助手,人工智能大模型在这几年的时间里有了质的飞跃。本文主要介绍一下OpenClaw的Docker本地化部署方案,因其非常高的操作、读写权限,因此它的本地化的最终形态,必然是封装在一个虚拟化的环境里,通过容器或者虚拟机来对其权限进行约束,以此来加强其安全性。这里我们使用的环境是Win11+WSL2+Docker,本地显卡为3080系列。
Ollama环境部署
关于Ollama的部署问题,可以参考之前的这篇文章,在大模型部署篇已经讲过,这里不再赘述。需要提醒的是,已经安装过Ollama的童鞋,需要把Ollama升级到最新版。安装完成后,通过Ollama配置好本地模型,我个人比较推荐的是qwen3.5(带tools的版本):

这个模型在Ollama运行阶段,大概会消耗10GB左右的显存/内存。具体指令如下:
bash
> ollama pull qwen3.5:latest
大家可以针对自己本地的硬件条件做模型的选择,如果是8GB显存的GPU卡,建议可以选择再小一些的模型。或则按照之前的方案,部署一个KTransformer用于推理,理论上也是可行的,不过这里暂时使用Ollama作为示例。
安全提醒
需要说明的是,这里我们的安装方案,是图方便把Ollama直接安装在宿主机了,理论上应该像KTransformer一样装在Docker里边,通过虚拟化进行管理,会更合适。
安装npm和pnpm环境
需要在Ubuntu的Linux子系统中建立一个空目录,然后依照如下顺序安装一个pnpm:
bash
$ mkdir nodejs
$ cd nodejs/
$ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
$ sudo apt-get install -y nodejs
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
安装成功后可以看到版本号:
bash
$ node --version
v20.20.1
$ npm --version
11.8.0
然后用npm安装我们所需的pnpm:
bash
$ npm install -g pnpm
$ pnpm --version
10.31.0
$ pnpm install
安装完成后,就可以正式开始部署OpenClaw了。
WSL2环境下的OpenClaw环境部署
在Win11上打开一个Ubuntu Linux的子系统窗口,下载openclaw的仓库源代码:
bash
$ git clone https://github.com/openclaw/openclaw.git
$ cd openclaw/
直接运行:
bash
$ ./docker-setup.sh
理论上来说,如果环境配置的没有问题,<网络也很通畅>的话,是可以直接运行成功的。所以如果这一步运行没有问题,本章节后面的内容就不用看了。如果有遇到一些报错信息,这里逐个排查。
docker-image报错
如果发生报错:
bash
=> ERROR resolve image config for docker-image://docker.io/docker/dockerfile:1.7
那就把Dockerfile中的第一行内容删掉:
bash
# syntax=docker/dockerfile:1.7
网络连接TimeOut问题
如果因为网络问题,导致下载过程报错,可以在Docker的配置文件daemon.json中添加如下配置:
bash
"registry-mirrors": ["https://docker.1ms.run"]
frozen-lockfile报错
如果遇到frozen-lockfile的报错:
bash
ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/package.json
这个问题是由于npm和pnpm的环境没有配置好,需要按照上一个章节中的配置命令进行相应的模块安装。
一切就绪
如果一切都没有问题,执行Docker的构建,你会得到:
bash
==> Starting gateway
[+] Running 1/0
✔ Container openclaw-openclaw-gateway-1 Running 0.0s
[+] Creating 1/0
✔ Container openclaw-openclaw-gateway-1 Running0.0s
(node:7) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
Config overwrite: /home/node/.openclaw/openclaw.json (sha256 65de -> edbd, backup=/home/node/.openclaw/openclaw.json.bak)
Gateway running with host port mapping.
Access from tailnet devices via the host's tailnet IP.
Config: /home/xxx/.openclaw
Workspace: /home/xxx/.openclaw/workspace
Token: fbf6
Commands:
docker compose -f /mnt/k/openclaw/docker-compose.yml logs -f openclaw-gateway
docker compose -f /mnt/k/openclaw/docker-compose.yml exec openclaw-gateway node dist/index.js health --token "819e"
到这一步,OpenClaw的界面就可以打开了:

不过这里界面上还是会有一些报错,这是因为我们还没有完成本地模型的配置,所以会话窗口无法识别到本地的大模型。我们在下一个章节中,继续介绍一下这个问题的解决方案。
本地大模型配置
然后按照上述启动的指令,就完成了Docker镜像的启动,然后可以通过docker attach或者VSCode的插件进入到容器内部。然后查看openclaw的版本:
bash
$ openclaw --version
OpenClaw 2026.3.8
根据需求,配置一下openclaw.json的内容,以下是我的配置清单,比较重点的就是本地模型部分的配置参数:
json
{
"meta": {
"lastTouchedVersion": "2026.3.8",
"lastTouchedAt": "2026-03-10T07:12:39.442Z"
},
"wizard": {
"lastRunAt": "2026-03-10T07:12:39.438Z",
"lastRunVersion": "2026.3.8",
"lastRunCommand": "onboard",
"lastRunMode": "local"
},
"models": {
"providers": {
"ollama": {
"baseUrl": "http://127.0.0.1:xxxxx/v1",
"apiKey": "ollama-local",
"api": "openai-completions",
"models": [
{
"id": "your_model",
"name": "your_model",
"reasoning": true,
"input": ["text"],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 32768,
"maxTokens": 32768
}
]
}
}
},
"agents": {
"defaults": {
"model": {
"primary": "ollama/your_model"
},
"models": {
"ollama/your_model": {}
},
"workspace": "/home/node/.openclaw/workspace",
"compaction": {
"mode": "safeguard"
},
"maxConcurrent": 4,
"subagents": {
"maxConcurrent": 8
},
"sandbox": {
"mode": "off"
}
}
},
"tools": {
"profile": "coding"
},
"messages": {
"ackReactionScope": "group-mentions"
},
"commands": {
"native": "auto",
"nativeSkills": "auto",
"restart": true,
"ownerDisplay": "raw"
},
"session": {
"dmScope": "per-channel-peer"
},
"gateway": {
"port": 18789,
"mode": "local",
"bind": "auto",
"controlUi": {
"allowedOrigins": [
"http://localhost:xxx",
"http://127.0.0.1:xxx"
]
},
"auth": {
"mode": "password",
"token": "c9b9",
"password": "xxx"
},
"tailscale": {
"mode": "off",
"resetOnExit": false
},
"nodes": {
"denyCommands": [
"camera.snap",
"camera.clip",
"screen.record",
"contacts.add",
"calendar.add",
"reminders.add",
"sms.send"
]
}
}
}
重启Docker容器,可以查看到相应的openclaw容器:
bash
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xxxx openclaw:local "docker-entrypoint.s..." 18 hours ago Up 18 hours (healthy) xxx:xxx-xxx->xxx-xxx/tcp openclaw-openclaw-gateway-1
如果继续使用docker attach或者vscode插件进入到容器内部,可以查看到openclaw现已加载的模型:
bash
$ openclaw models list
🦞 OpenClaw 2026.3.8 (unknown) --- Like having a senior engineer on call, except I don't bill hourly or sigh audibly.
Model Input Ctx Local Auth Tags
ollama/qwen3.5:latest text 32k no yes default,configured
这里链接到模型后,还会有一个本地配对的请求授权:

这个直接按照操作指引配置一下即可:
bash
$ openclaw devices list
🦞 OpenClaw 2026.3.8 (unknown) --- Say "stop" and I'll stop---say "ship" and we'll both learn a lesson.
│
◇
Pending (1)
┌──────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────┬──────────┬────────────┬──────────┬────────┐
│ Request │ Device │ Role │ IP │ Age │ Flags │
├──────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────┼──────────┼────────────┼──────────┼────────┤
│ e6dc │ 177f │ operator │ 172.18.0.1 │ just now │ │
└──────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────┴──────────┴────────────┴──────────┴────────┘
Paired (1)
┌───────────────────────────────────────────────────┬────────────┬─────────────────────────────────────────────────────────────────────┬────────────┬────────────┐
│ Device │ Roles │ Scopes │ Tokens │ IP │
├───────────────────────────────────────────────────┼────────────┼─────────────────────────────────────────────────────────────────────┼────────────┼────────────┤
│ 250c │ operator │ operator.read, operator.admin, operator.write, operator.approvals, │ operator │ │
│ 5958 │ │ operator.pairing │ │ │
└───────────────────────────────────────────────────┴────────────┴─────────────────────────────────────────────────────────────────────┴────────────┴────────────┘
$ openclaw devices 177f
🦞 OpenClaw 2026.3.8 (unknown) --- Making 'I'll automate that later' happen now.
│
◇
Approved 177f)
再回到主界面,就可以正常对话了:

例如简单点的任务,可以让他自己切换本地时区到北京时间:

甚至可以让它自己在本地配置一个Anaconda的环境:

配置完成后进入容器就可以看到安装的环境:
bash
node@xxx:~/.openclaw$ /home/node/.conda/bin/conda env list
# conda environments:
#
# * -> active
# + -> frozen
base /home/node/.conda
python39_env /home/node/.conda/envs/python39_env
在容器内,基础的读写权限也是有的:


总结概要
本文介绍了一种在Win11操作系统下,使用Docker部署OpenClaw的一种方案,并且Token由本地部署的Ollama加载开源的qwen3.5模型产生,实现零成本、相对安全可控的一种部署方案。当然,目前OpenClaw和Ollama的安全性还是有待提升,结合自己的情况,慎重部署!!!
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/openclaw.html
作者ID:DechinPhy
更多原著文章:https://www.cnblogs.com/dechinphy/
请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html