从零开始:在 Docker 容器中部署 OpenClaw + Ollama 本地 AI 助手(完整实操记录与问题解决)

大家好,这篇文章完整记录了我在 2026 年 3 月,从一个空白的 Docker 容器开始,一步步搭建 OpenClaw(2026.3.2 版本)+ Ollama 的全过程。整个过程遇到了大量实际问题(尤其是 Gateway 启动、配置生效、模型识别等),也把所有坑和解决方案都写出来了,希望能帮到同样在 Docker 环境里折腾的朋友。

最终目标:用 tmux 保活 TUI,在终端里愉快地使用本地 Ollama 模型(例如 lfm2:24b-a2b、qwen2.5:7b 等)。

环境与前提

  • 宿主机:任意支持 Docker 的系统
  • 容器镜像:archlinux:latest
  • OpenClaw 版本:2026.3.2 (85377a2)
  • Ollama:部署在宿主机或另一台机器(IP: 192.168.1.3:11434)
  • 容器启动命令(关键:映射 Ollama 端口)
docker run -it --name claw1 -p 11434:11434 archlinux:latest /bin/bash

进入容器后先更新并安装基础工具:

pacman -Syu --noconfirm
pacman -S --noconfirm base-devel git curl wget sudo which tmux net-tools

步骤 1:安装 NVM + Node.js LTS

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install --lts
nvm use --lts
nvm alias default lts/*

验证:

node -v   # 应显示 v20.x 或 v22.x

步骤 2:安装 OpenClaw(跳过 onboarding)

curl -fsSL https://openclaw.ai/install.sh | bash
# 或 npm install -g openclaw@latest
openclaw --no-onboard

步骤 3:Ollama 推荐分离部署(网络连接方式)

强烈建议:不要在同一个容器里同时跑 OpenClaw 和 Ollama。

我在宿主机(或另一台服务器)运行 Ollama:

# 宿主机执行
curl -fsSL https://ollama.com/install.sh | sh
ollama serve &
ollama pull lfm2:24b-a2b
ollama pull qwen2.5:7b
ollama pull llama3.1:8b
ollama pull deepseek-coder-v2:16b

容器内连接配置:

openclaw config set models.providers.ollama.baseUrl "http://192.168.1.3:11434"
openclaw config set models.providers.ollama.apiKey "ollama-local-dummy"
openclaw config set models.providers.ollama.api "ollama"

手动指定模型列表(绕过自动发现 bug):

openclaw config set models.providers.ollama.models '[
  {"id": "lfm2:24b-a2b", "name": "LFM2 24B A2B"},
  {"id": "qwen2.5:7b", "name": "Qwen 2.5 7B"},
  {"id": "llama3.1:8b", "name": "Llama 3.1 8B"},
  {"id": "deepseek-coder-v2:16b", "name": "DeepSeek Coder V2"}
]'

设置默认模型:

openclaw config set agents.defaults.model.primary "ollama/lfm2:24b-a2b"

步骤 4:最常见的启动坑与解决

坑 1:gateway restart 依赖 systemd 失败

openclaw gateway restart
# 报错:systemctl --user is-enabled unavailable

Docker 容器内没有 systemd,所以所有依赖 systemctl 的命令都会失败。

正确做法:直接手动启动 Gateway

openclaw gateway --verbose
# 或后台 + tmux
tmux new -s gateway
openclaw gateway --verbose
# detach: Ctrl+b d

坑 2:Gateway start 被 blocked(2026 版本安全检查)

Gateway start blocked: set gateway.mode=local (current: unset) or pass --allow-unconfigured.

解决

openclaw config set gateway.mode local
openclaw gateway --verbose

坑 3:TUI 连接失败(gateway disconnected: closed)

原因:Gateway 根本没跑起来。

解决:先确保 Gateway 在运行(用 tmux 保活),再开 TUI:

tmux attach -t gateway   # 查看是否在跑
openclaw tui

步骤 5:模型识别坑(anthropic 前缀鬼故事)

最崩溃的一幕:

TUI 显示模型为 anthropic/lfm2:24b-a2b → Unknown model

原因:OpenClaw 默认会给模型名加 anthropic/ 前缀,除非明确指定 ollama/ provider。

解决(在 TUI 里立即生效):

/model ollama/lfm2:24b-a2b

永久设置(CLI):

openclaw config set agents.defaults.model.primary "ollama/lfm2:24b-a2b"

切换后状态栏变为:

connected | idle
agent main | session main (openclaw-tui) | ollama/lfm2:24b-a2b | tokens ?/33k

成功回复:

你好!我是你的开放式AI助手。很高兴认识你。……

步骤 6:安全加固(别忘了)

运行审计:

openclaw security audit

常见高危项及修复:

# 解决两个 CRITICAL
openclaw config set gateway.auth.token "$(openssl rand -base64 32)"
openclaw gateway --verbose   # 重启生效

# 修复权限
chmod 700 ~/.openclaw
chmod 600 ~/.openclaw/*.json

最终状态栏解释(很多人问)

connected | idle
agent main | session main (openclaw-tui) | ollama/lfm2:24b-a2b | tokens ?/33k
  • connected | idle:已连接网关,当前空闲
  • agent main:使用 main 智能体
  • session main (openclaw-tui):会话名为 main,通过 TUI 访问
  • ollama/lfm2:24b-a2b:当前模型
  • tokens ?/33k:已用 token 未知 / 上下文最大 33k token

小结 & 经验教训

  1. Docker 容器里不要依赖 openclaw gateway restart/start/install 等命令,直接 openclaw gateway --verbose 或 tmux 后台跑。
  2. 必须设置 gateway.mode local,否则启动被 block。
  3. 本地模型一定要写全 ollama/模型名,否则被强制加 anthropic/ 前缀导致 Unknown model。
  4. Gateway 配置变更后,重启容器docker restart claw1)是最暴力但最可靠的生效方式。
  5. TUI + tmux 是最舒服的长期使用方式。

现在我已经在容器里稳定运行 lfm2:24b-a2b 了,响应速度和质量都超出预期。

希望这篇记录能帮你少走弯路。

有问题欢迎留言或直接问我~

🦞 Happy clawing!