怎么在 Windows-WSL2-Ubuntu-Docker 部署 OpenClaw,并使用本地大模型?

WSL2

Ubuntu

从 WSL 2.0.0 版本开始,支持在安装时指定自定义名称,从而创建多个相同发行版的独立实例。

安装

  1. 安装第一个 Ubuntu-24.04(如果你只需要一个Ubuntu,执行完这个命令即可)。
    1. wsl --install -d Ubuntu-24.04
  2. 安装第二个Ubuntu-24.04
    1. wsl --install -d Ubuntu-24.04 --name ubuntu24-1
  3. 安装第三个Ubuntu-24.04
    1. wsl --install -d Ubuntu-24.04 --name ubuntu24-2
  4. 删除指定名称的 Ubuntu
    1. wsl --unregister ubuntu24-1
    2. wsl --unregister ubuntu24-2

启动

wsl.exe -d ubuntu24-1

查看和进入

  1. 查看已安装哪些 Ubuntu
    1. wsl -l -v
  2. 进入指定 Ubuntu
    1. wsl -d ubuntu24-1

NVM

  1. 安装 NVM
    1. curl -o- https://mirror.ghproxy.com/https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
    2. curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
  2. 环境变量、启动代码写入文件 ~/.bashrc
    1. source ~/.bashrc
  3. 验证版本
    1. nvm -v

NodeJS

  1. 查看所有可安装版本
    1. nvm ls-remote
  2. 只看 LTS 稳定版
    1. nvm ls-remote --lts
  3. 安装指定版本
    1. nvm install 24
    2. 第一次安装似乎会自动设置默认版本?
  4. 查看你已经装了哪些版本
    1. nvm ls
  5. 查看当前正在用的版本
    1. nvm current
  6. 查看默认版本
    1. nvm alias default

OpenClaw (常规安装)

  1. 安装
    1. npm install -g openclaw --registry=https://registry.npmmirror.com
  2. 验证版本
    1. openclaw --version
  3. 键入配置界面
    1. openclaw onboard
  4. 启动 openclaw
    1. openclaw gateway
  5. 进入后台
    1. http://127.0.0.1:18789/

OpenClaw (Docker内安装)

LM Studio

  1. 准备 lmstudio 所需要的依赖
    1. sudo apt-get update && sudo apt-get install -y libatomic1
  2. 安装 lmstudio
    1. curl -fsSL https://lmstudio.ai/install.sh | bash

Miniconda

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
# 回车 + yes
source ~/.bashrc
conda create -n vllm python=3.11
conda activate vllm
pip install vllm
npm install -g openclaw

VLLM

安装

conda deactivate 
conda remove -n vllm --all -y pip cache purge


conda create -n vllm python=3.10 -y
conda activate vllm

pip install torch==2.3.1 torchvision==0.18.1 torchaudio==2.3.1 --index-url https://download.pytorch.org/whl/cu121

pip install vllm --no-cache-dir


vllm --version

启动


vllm serve /home/jin/.vllm/models/Qwen/Qwen2.5-7B-Instruct-AWQ \
  --host 0.0.0.0 \
  --port 8000 \
  --trust-remote-code \
  --quantization awq \
  --dtype auto \
  --gpu-memory-utilization 0.9 \
  --max-model-len 32768 \
  --max-num-seqs 8 \
  --enable-auto-tool-choice \
  --tool-call-parser hermes

Docker

最小生产级方案(Makefile + Compose)

docker-compose.yml

路径 ~/openclaw/docker-compose.yml

services:
  openclaw:
    image: ghcr.io/openclaw/openclaw:latest
    container_name: openclaw-${INSTANCE}
    volumes:
      - ./base:/app/config/base
      - ./instances/${INSTANCE}:/app/config/override
    environment:
      - CONFIG_BASE=/app/config/base/config.yaml
      - CONFIG_OVERRIDE=/app/config/override/override.yaml
    restart: unless-stopped

Makefile

路径: ~/openclaw/Makefile

# =========================
# OpenClaw Infra 管理(极简版)
# =========================

N ?= 2

# =========================
# 初始化
# =========================
init:
	@echo "📁 初始化基础目录..."
	mkdir -p base
	mkdir -p instances
	@echo "✅ 完成"

# =========================
# 创建实例(只做最小结构)
# =========================
add:
	@echo "➕ 创建 $(N) 个实例..."
	@for i in $$(seq 1 $(N)); do \
		dir=instances/o$$i; \
		if [ ! -d $$dir ]; then \
			mkdir -p $$dir; \
			touch $$dir/override.yaml; \
			echo "  ✔ 创建 $$dir"; \
		else \
			echo "  ⚠ 已存在 $$dir"; \
		fi; \
	done

# =========================
# 生成基础模板(仅入口级)
# =========================
template:
	@echo "🧩 生成基础配置(不会覆盖)..."

	@if [ ! -f base/config.yaml ]; then \
		printf "model:\n  provider: openai-compatible\n  base_url: http://host.docker.internal:11434/v1\n  api_key: dummy\n\nruntime:\n  timeout: 60\n" > base/config.yaml; \
		echo "  ✔ base/config.yaml"; \
	else \
		echo "  ⚠ base/config.yaml 已存在"; \
	fi

	@for dir in instances/*; do \
		if [ ! -f $$dir/override.yaml ]; then \
			printf "system:\n  mode: single\n" > $$dir/override.yaml; \
			echo "  ✔ $$dir/override.yaml"; \
		fi; \
	done

	@echo "✅ 完成"

# =========================
# 启动所有实例
# =========================
up:
	@echo "🚀 启动所有实例..."
	@for dir in instances/*; do \
		name=$$(basename $$dir); \
		echo "  ▶ $$name"; \
		INSTANCE=$$name docker compose up -d; \
	done

# =========================
# 停止所有实例
# =========================
down:
	@echo "🛑 停止所有实例..."
	@for dir in instances/*; do \
		name=$$(basename $$dir); \
		echo "  ■ $$name"; \
		INSTANCE=$$name docker compose down; \
	done

# =========================
# 单实例操作
# =========================
logs:
	@INSTANCE?=o1
	docker logs -f openclaw-$(INSTANCE)

restart:
	@INSTANCE?=o1
	docker restart openclaw-$(INSTANCE)

# =========================
# 状态 & 更新
# =========================
ps:
	docker ps | grep openclaw

pull:
	docker compose pull

update:
	docker compose pull
	docker compose up -d

首次使用(初始化 + 启动)

make add N=2        # 创建实例 o1、o2(必须手动执行)
make up             # 初始化 + 生成模板 + 启动全部

比下方之前的版本更简洁高效.

make init      # 创建目录
make add N=2   # 创建实例
make template  # 生成配置
make up        # 自动执行 docker compose 启动所有

日常使用

# 启动
make up          # 初始化 + 生成配置 + 启动全部实例
make up o1       # 只启动 o1 实例

# 停止
make down        # 停止所有实例
make down o2     # 只停止 o2 实例

# 重启
make restart     # 重启所有实例
make restart o1  # 只重启 o1 实例

# 日志
make logs o1     # 查看 o1 实例日志

# 更新
make update      # 更新所有实例的镜像并重启(保持最新版本)
make update o2   # 只更新并重启指定实例(o2)

# 状态查看
make ps          # 查看所有 openclaw 实例状态(支持)

openclaw/ ├── base/ │ └── config.yaml ├── instances/ │ ├── o1/ │ │ ├── override.yaml │ │ ├── agents/ │ │ ├── workflow.md │ │ └── workspace/ │ ├── o2/ │ └── o3/ ├── docker-compose.yml └── Makefile

docker exec 容器名 openclaw devices approve 这里填请求ID

docker exec o1-openclaw-1 openclaw devices approve ae3c8159-9e10-4ace-af37-20bc7ccdf612 │ 6245d6c691b596 Pending (1) ┌──────────────────────────────────────┬────────────────┬──────────┬────────────────────┬────────────┬────────┬────────┐ │ Request │ Device │ Role │ Scopes │ IP │ Age │ Flags │ ├──────────────────────────────────────┼────────────────┼──────────┼────────────────────┼────────────┼────────┼────────┤ │ ae3c8159-9e10-4ace-af37-20bc7ccdf612 │ 6245d6c691b596 │ operator │ operator.admin, │ 172.19.0.1 │ 3m ago │ │ │ │ 5b08f11d2f788f │ │ operator.read, │ │ │ │ │ │ c0adffcfd8798e │ │ operator.write, │ │ │ │ │ │ 675eca05c34a4a │ │ operator. │ │ │ │ │ │ 3dc94661 │ │ approvals, │ │ │ │ │ │ │ │ operator.pairing

docker exec o2-openclaw-1 openclaw devices approve 这里填请求ID docker exec o3-openclaw-1 openclaw devices approve 这里填请求ID

Pending (1)
┌──────────────────────────────────────┬────────────────┬──────────┬────────────────────┬────────────┬────────┬────────┐
│ Request                              │ Device         │ Role     │ Scopes             │ IP         │ Age    │ Flags  │
├──────────────────────────────────────┼────────────────┼──────────┼────────────────────┼────────────┼────────┼────────┤
│ ae3c8159-9e10-4ace-af37-20bc7ccdf612 │ 6245d6c691b596 │ operator │ operator.admin,    │ 172.19.0.1 │ 3m ago │        │
│                                      │ 5b08f11d2f788f │          │ operator.read,     │            │        │        │
│                                      │ c0adffcfd8798e │          │ operator.write,    │            │        │        │
│                                      │ 675eca05c34a4a │          │ operator.          │            │        │        │
│                                      │ 3dc94661       │          │ approvals,         │            │        │        │
│                                      │                │          │ operator.pairing   │            │        │        │

6245d6c691b5965b08f11d2f788fc0adffcfd8798e675eca05c34a4a3dc94661

What do you think?
0 Reactions
Pick a reaction