OpenClaw 多 Agent 系统完整容器化实战
字数 2692,阅读大约需 14 分钟

一、项目背景
1.1 我的多 Agent 系统架构
我之前部署了一套 OpenClaw 多 Agent 系统,包含:
主 workspace(豆豆直聊):
-
• 15 个 cron 定时任务 -
• 持仓盯盘(每 5 分钟) -
• 交易蜘蛛(A 股/美股/Token) -
• 选股策略(每日选股 + 次日跟踪)
多 Agent workspace:
-
• Zoe(主协调 Agent) -
• AI 哨兵(监控预警) -
• 交易蜘蛛(行情分析) -
• 共享技能库(stock-watcher, longhu-analyzer, stock-selector)
1.2 为什么要容器化?
迁移前的问题:
-
• 环境依赖复杂(Node.js、npm 包、系统库) -
• 配置分散(多个 openclaw.json、cron 任务) -
• 部署麻烦(换台机器要重新配一遍) -
• 备份困难(不知道哪些文件重要)
容器化的好处:
-
• 一次构建,到处运行 -
• 配置集中管理 -
• 备份简单(打包镜像 + 数据卷) -
• 快速恢复(几分钟重新拉起)
二、迁移前准备
2.1 梳理现有架构
~/.openclaw/
├── openclaw.json # Gateway 主配置
├── workspace/ # 主工作区(豆豆直聊)
│ ├── SOUL.md
│ ├── MEMORY.md
│ ├── HEARTBEAT.md
│ ├── articles/ # 文章
│ └── ...
└── workspace-multi-agent/ # 多 Agent 工作区
├── openclaw.json # 多 Agent 配置
├── agents/ # Agent 配置
├── skills/ # 技能库
├── shared-context/ # 跨 Agent 共享状态
│ ├── intel/ # 情报数据
│ ├── status/ # 状态信息
│ └── monitor-tasks/ # 监控任务
└── memory/ # 短期记忆
2.2 列出关键配置
环境变量:
# 飞书配置
FEISHU_APP_ID=cli_xxxxxxxxxxxxx
FEISHU_APP_SECRET=xxx
FEISHU_VERIFICATION_TOKEN=xxx
FEISHU_ENCRYPT_KEY=xxx
# 大模型配置
DASHSCOPE_API_KEY=sk-sp-xxxxxxxxxxxxxx
# Gateway 配置
OPENCLAW_PORT=18789
OPENCLAW_BIND=0.0.0.0
Cron 任务(共 15 个):
-
• 持仓盯盘:每 5 分钟(交易时段) -
• 早盘分析:09:00 -
• 收盘分析:15:30 -
• 龙虎榜:20:00 -
• 美股盘前:22:00 -
• Token 日报:22:30 -
• 隔夜行情:05:10
需要持久化的数据:
-
• 配置文件(openclaw.json) -
• 工作区(workspace、workspace-multi-agent) -
• 记忆数据(memory/) -
• Cron 任务(cron/) -
• 凭据(credentials/) -
• 日志(logs/)
三、Dockerfile 编写
3.1 基础镜像选择
# 方案 1:官方 Node 镜像(推荐)
FROM node:20-slim
# 方案 2:Alpine(体积更小,但可能有兼容问题)
FROM node:20-alpine
# 方案 3:自定义(需要额外依赖)
FROM node:20-slim
RUN apt-get update && apt-get install -y git python3 make g++
我的选择:node:20-slim
-
• 体积适中(~200MB) -
• 兼容性好 -
• 基于 Debian,调试方便
3.2 完整 Dockerfile
# Dockerfile.gateway
FROM node:20-slim
# 设置工作目录
WORKDIR /root/.openclaw
# 安装 OpenClaw(全局)
RUN npm install -g openclaw@latest
# 安装可选依赖(浏览器自动化需要)
RUN apt-get update && apt-get install -y \
git \
wget \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# 创建数据目录
RUN mkdir -p /root/.openclaw/{workspace,workspace-multi-agent,memory,cron,logs,credentials}
# 暴露网关端口
EXPOSE 18789
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
CMD wget -q --spider http://localhost:18789/health || exit 1
# 启动命令
CMD ["openclaw", "gateway", "start"]
关键点:
-
• 全局安装 OpenClaw(方便更新) -
• 暴露 18789 端口(Gateway API) -
• 健康检查(容器编排需要) -
• 不固化配置(配置通过数据卷挂载)
四、Docker Compose 编排
4.1 为什么用 Docker Compose?
不用 Compose:
# 手动启动,命令超长
docker run -d \
--name openclaw \
-p 18789:18789 \
-v ./config:/root/.openclaw/config \
-v ./workspace:/root/.openclaw/workspace \
... \
openclaw:latest
用 Compose:
# docker-compose.yml
services:
openclaw:
image: openclaw:latest
ports:
- "18789:18789"
volumes:
- ./config:/root/.openclaw/config
- ./workspace:/root/.openclaw/workspace
docker compose up -d
4.2 完整 docker-compose.yml
version: '3.8'
services:
# OpenClaw Gateway 主服务
openclaw:
build:
context: .
dockerfile: Dockerfile.gateway
container_name: openclaw-gateway
restart: unless-stopped
# 工作目录
working_dir: /root/.openclaw
# 端口映射
ports:
- "18789:18789"
# 数据卷挂载(核心配置)
volumes:
# 主配置文件
- ./config/openclaw.json:/root/.openclaw/openclaw.json:ro
- ./config/exec-approvals.json:/root/.openclaw/exec-approvals.json
# 主工作区(豆豆直聊)
- ./workspace:/root/.openclaw/workspace
# 多 Agent 工作区
- ./workspace-multi-agent:/root/.openclaw/workspace-multi-agent
# 记忆数据
- ./memory:/root/.openclaw/memory
# Cron 任务
- ./cron:/root/.openclaw/cron
# 认证凭据
- ./credentials:/root/.openclaw/credentials:ro
# 日志
- ./logs:/root/.openclaw/logs
# 环境变量
environment:
- NODE_ENV=production
- TZ=Asia/Shanghai
# API Keys(从.env 文件加载)
- DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY}
- FEISHU_APP_ID=${FEISHU_APP_ID}
- FEISHU_APP_SECRET=${FEISHU_APP_SECRET}
# 网络配置
networks:
- openclaw-network
# 资源限制
deploy:
resources:
limits:
memory: 2G
cpus: '2.0'
reservations:
memory: 512M
cpus: '0.5'
# 日志配置
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 健康检查
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:18789/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# 可选:Chrome 浏览器服务(浏览器自动化需要)
browser:
image: browserless/chrome:latest
container_name: openclaw-browser
restart: unless-stopped
expose:
- "3000"
environment:
- CONNECTION_TIMEOUT=60000
- MAX_CONCURRENT_SESSIONS=5
networks:
- openclaw-network
profiles:
- browser
# 网络配置
networks:
openclaw-network:
driver: bridge
# 数据卷(可选,用绑定挂载替代)
volumes:
openclaw-data:
openclaw-logs:
4.3 环境变量文件
# .env(可以提交到 git)
# 时区
TZ=Asia/Shanghai
# Gateway 配置
OPENCLAW_PORT=18789
OPENCLAW_BIND=0.0.0.0
# .env.secret(不要提交到 git!)
# 飞书配置
FEISHU_APP_ID=cli_a92cec9952fa9cc4
FEISHU_APP_SECRET=xxx
FEISHU_VERIFICATION_TOKEN=xxx
FEISHU_ENCRYPT_KEY=xxx
# 大模型配置
DASHSCOPE_API_KEY=sk-sp-82...1115b0b2
# Gateway 认证
OPENCLAW_AUTH_TOKEN=xxx
安全建议:
# 设置权限
chmod 600 .env.secret
# 添加到 .gitignore
echo ".env.secret" >> .gitignore
五、配置文件调整
5.1 openclaw.json 关键修改
修改前(本地运行):
{
"gateway": {
"port": 18789,
"bind": "lan",
"mode": "local"
}
}
修改后(Docker 运行):
{
"gateway": {
"port": 18789,
"bind": "0.0.0.0", // 绑定所有接口
"mode": "local",
"auth": {
"mode": "token",
"token": "${OPENCLAW_AUTH_TOKEN}" // 使用环境变量
}
}
}
5.2 飞书渠道配置
{
"channels": {
"feishu": {
"appId": "${FEISHU_APP_ID}",
"appSecret": "${FEISHU_APP_SECRET}",
"verificationToken": "${FEISHU_VERIFICATION_TOKEN}",
"encryptKey": "${FEISHU_ENCRYPT_KEY}",
"connectionMode": "websocket",
"enabled":true,
"groupPolicy": "allowlist",
"allowFrom": ["ou_2ded705d02ce58c17ba15cc0f1be3f32"]
}
}
}
关键点:
-
• 敏感信息用环境变量引用( ${VAR_NAME}) -
• groupPolicy用allowlist(安全) -
• allowFrom明确允许的用户 ID
5.3 Cron 任务配置
Cron 任务会自动从 cron/ 目录加载,无需修改。
示例:持仓盯盘任务
{
"name": "持仓盯盘 - 吉鑫科技",
"schedule": {
"kind": "every",
"everyMs": 300000 // 5 分钟
},
"payload": {
"kind": "agentTurn",
"message": "检查吉鑫科技 (601218) 当前股价,成本 5.785 元,计算盈亏"
},
"sessionTarget": "isolated",
"enabled":true
}
六、迁移步骤
6.1 准备目录结构
# 创建迁移目录
mkdir -p ~/openclaw-docker/{config,workspace,workspace-multi-agent,memory,cron,logs,credentials}
# 进入目录
cd ~/openclaw-docker
6.2 复制现有数据
# 复制配置文件
cp ~/.openclaw/openclaw.json ~/openclaw-docker/config/
# 复制工作区
cp -r ~/.openclaw/workspace/* ~/openclaw-docker/workspace/
cp -r ~/.openclaw/workspace-multi-agent/* ~/openclaw-docker/workspace-multi-agent/
# 复制记忆数据
cp -r ~/.openclaw/memory/* ~/openclaw-docker/memory/
# 复制 Cron 任务
cp -r ~/.openclaw/cron/* ~/openclaw-docker/cron/
# 复制凭据
cp -r ~/.openclaw/credentials/* ~/openclaw-docker/credentials/
6.3 创建 Docker 文件
# 创建 Dockerfile
cat > Dockerfile.gateway << 'EOF'
FROM node:20-slim
WORKDIR /root/.openclaw
RUN npm install -g openclaw@latest
RUN apt-get update && apt-get install -y git wget ca-certificates && rm -rf /var/lib/apt/lists/*
EXPOSE 18789
HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD wget -q --spider http://localhost:18789/health || exit 1
CMD ["openclaw", "gateway", "start"]
EOF
# 创建 docker-compose.yml(复制上面的完整配置)
# 创建 .env 和 .env.secret
6.4 构建并启动
# 构建镜像
docker compose build
# 启动服务
docker compose up -d
# 查看状态
docker compose ps
# 查看日志
docker compose logs -f openclaw
6.5 验证部署
# 检查网关是否可达
curl http://localhost:18789/health
# 输出:{"status":"ok","uptime":123456}
# 检查飞书渠道
# 发送一条测试消息,看是否收到
# 检查 Cron 任务
docker compose exec openclaw openclaw cron list
七、数据持久化策略
7.1 什么数据需要持久化?
必须持久化:
-
• ✅ 配置文件(openclaw.json) -
• ✅ 工作区代码(workspace/) -
• ✅ 记忆数据(memory/) -
• ✅ Cron 任务(cron/) -
• ✅ 认证凭据(credentials/)
可选持久化:
-
• ⚠️ 日志(logs/)- 看是否需要长期保存 -
• ⚠️ 浏览器缓存 – 一般不需要
不需要持久化:
-
• ❌ 临时文件 -
• ❌ 节点模块缓存
7.2 两种持久化方式
方式 1:绑定挂载(Bind Mount)
volumes:
- ./workspace:/root/.openclaw/workspace
-
• 优点:主机目录可见,方便编辑 -
• 缺点:路径依赖,跨平台麻烦
方式 2:数据卷(Volume)
volumes:
- openclaw-data:/root/.openclaw
volumes:
openclaw-data:
-
• 优点:Docker 管理,跨平台 -
• 缺点:主机上不可见(在 Docker 内部)
我的选择:绑定挂载
-
• 方便调试和备份 -
• 配置和工作区需要经常修改
7.3 备份脚本
#!/bin/bash
# backup.sh
BACKUP_DIR=~/openclaw-backups
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
echo "开始备份..."
# 备份配置和工作区
tar -czf $BACKUP_DIR/openclaw-data-$DATE.tar.gz \
~/openclaw-docker/config \
~/openclaw-docker/workspace \
~/openclaw-docker/workspace-multi-agent \
~/openclaw-docker/memory \
~/openclaw-docker/cron \
~/openclaw-docker/credentials
# 备份 Docker 配置
cp ~/openclaw-docker/docker-compose.yml $BACKUP_DIR/
cp ~/openclaw-docker/Dockerfile.gateway $BACKUP_DIR/
# 清理旧备份(保留 7 天)
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "备份完成:$BACKUP_DIR/openclaw-data-$DATE.tar.gz"
定时备份(Cron):
# 每天凌晨 2 点备份
0 2 * * * /home/user/openclaw-docker/backup.sh
八、网络配置
8.1 端口映射
ports:
- "18789:18789" # 主机:容器
访问方式:
-
• 本地: http://localhost:18789 -
• 局域网: http://192.168.x.x:18789 -
• 外网:需要端口转发或反向代理
8.2 容器间通信
# Gateway 和 Browser 在同一网络
networks:
- openclaw-network
# Gateway 配置中引用 Browser
browser:
image: browserless/chrome:latest
networks:
- openclaw-network
Gateway 配置:
{
"browser": {
"cdpEndpoint": "http://browser:3000"
}
}
8.3 防火墙配置
Windows(PowerShell):
# 允许 18789 端口
New-NetFirewallRule -DisplayName "OpenClaw Gateway" `
-Direction Inbound `
-LocalPort 18789 `
-Protocol TCP `
-Action Allow
Linux(ufw):
ufw allow 18789/tcp
九、监控与日志
9.1 查看日志
# 实时日志
docker compose logs -f openclaw
# 最近 100 行
docker compose logs --tail 100 openclaw
# 导出日志
docker compose logs openclaw > gateway.log 2>&1
9.2 健康检查
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:18789/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
查看健康状态:
docker inspect --format='{{.State.Health.Status}}' openclaw-gateway
# 输出:healthy
9.3 资源监控
# 查看资源使用
docker stats openclaw-gateway
# 输出示例:
# CONTAINER ID NAME CPU % MEM USAGE / LIMIT
# abc123 openclaw-gateway 2.5% 512MiB / 2GiB
十、常见问题与解决方案
问题 1:容器启动失败
症状:
docker compose up -d
# 容器不断重启
排查:
# 查看日志
docker compose logs openclaw
# 检查配置文件
docker compose exec openclaw cat /root/.openclaw/openclaw.json | jq .
# 检查权限
docker compose exec openclaw ls -la /root/.openclaw/
常见原因:
-
• 配置文件语法错误 -
• 端口被占用 -
• 环境变量缺失
问题 2:飞书消息不发送
症状:
-
• Gateway 正常启动 -
• 飞书消息发不出去
排查:
# 检查网络连接
docker compose exec openclaw ping -c 3 open.feishu.cn
# 检查环境变量
docker compose exec openclaw env | grep FEISHU
# 检查渠道状态
curl http://localhost:18789/health
解决方案:
-
• 检查防火墙 -
• 确认代理配置 -
• 验证 App Secret 正确
问题 3:Cron 任务不执行
症状:
-
• Gateway 正常 -
• Cron 任务不触发
排查:
# 列出 Cron 任务
docker compose exec openclaw openclaw cron list
# 查看任务历史
docker compose exec openclaw openclaw cron runs <jobId>
# 手动触发测试
docker compose exec openclaw openclaw cron run <jobId>
常见原因:
-
• 任务被禁用(enabled: false) -
• 时区配置错误 -
• 会话目标配置错误
问题 4:数据丢失
症状:
-
• 重启容器后配置没了
排查:
# 检查卷挂载
docker inspect openclaw-gateway | grep Mounts -A 20
# 检查主机目录
ls -la ~/openclaw-docker/workspace/
解决方案:
-
• 确认 volumes 配置正确 -
• 检查主机目录权限 -
• 确认配置文件路径
十一、性能优化
11.1 资源限制
deploy:
resources:
limits:
memory: 2G
cpus: '2.0'
reservations:
memory: 512M
cpus: '0.5'
建议:
-
• 内存限制:2G(根据实际调整) -
• CPU 限制:2 核(多 Agent 系统需要)
11.2 日志轮转
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
效果:
-
• 每个日志文件最大 10MB -
• 保留 3 个文件(共 30MB) -
• 自动轮转
11.3 镜像优化
减小镜像体积:
# 多阶段构建
FROM node:20-slim as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
CMD ["node", "server.js"]
使用 Alpine:
-
• 体积:slim ~200MB → Alpine ~50MB -
• 注意:某些 npm 包可能需要额外编译
夜雨聆风