Win11+Docker+qwen3.5本地化养虾

技术背景

从语言对话,到本地小助手,人工智能大模型在这几年的时间里有了质的飞跃。本文主要介绍一下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

参考链接

  1. https://zhuanlan.zhihu.com/p/2004187601276540473
  2. https://zhuanlan.zhihu.com/p/2013622369059623797
  3. https://www.cnblogs.com/dechinphy/p/18702523/deepseek2