乐于分享
好东西不私藏

OpenClaw 多 Agent 系统完整容器化实战

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 包可能需要额外编译