Docker容器化部署

当你开发完成了一个功能完善的 AI Agent 应用后,下一步就是将它部署到生产环境中。Docker 容器化是目前最主流的应用部署方式,它能确保你的 Agent 在任何环境中都能一致地运行,彻底解决"在我电脑上能跑"的问题。本教程将带你从零开始,完成 OpenClaw Agent 应用的 Docker 容器化部署,包括编写 Dockerfile、使用 docker-compose 编排多 Agent 系统,以及生产环境的最佳实践。

为什么选择 Docker?

Docker 为 AI Agent 应用提供了理想的部署环境:环境一致性(开发、测试、生产环境完全相同)、资源隔离(每个 Agent 运行在独立的容器中,互不干扰)、快速扩缩容(可以根据负载动态增减容器实例)、依赖管理(所有依赖打包在镜像中,无需担心环境差异)。对于需要同时运行多个 Agent 的场景,Docker 的优势尤为明显。

编写 Dockerfile

Dockerfile 是构建 Docker 镜像的蓝图。一个优化良好的 Dockerfile 可以显著减小镜像体积、加快构建速度、提高安全性。下面是为 OpenClaw Agent 应用设计的多阶段构建 Dockerfile。

# Dockerfile - OpenClaw Agent 应用
# 使用多阶段构建优化镜像大小

# ===== 第一阶段:构建阶段 =====
FROM python:3.11-slim AS builder

WORKDIR /build

# 先复制依赖文件,利用 Docker 缓存层
COPY requirements.txt .

# 安装构建依赖
RUN pip install --no-cache-dir --prefix=/install \
    -r requirements.txt

# ===== 第二阶段:运行阶段 =====
FROM python:3.11-slim AS runtime

# 设置环境变量
ENV PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    OPENCLAW_HOME=/app \
    OPENCLAW_LOG_LEVEL=info

# 创建非 root 用户(安全最佳实践)
RUN groupadd -r openclaw && useradd -r -g openclaw openclaw

WORKDIR /app

# 从构建阶段复制已安装的依赖
COPY --from=builder /install /usr/local

# 复制应用代码
COPY . .

# 复制配置文件
COPY config.yaml /app/config.yaml

# 设置文件权限
RUN chown -R openclaw:openclaw /app

# 切换到非 root 用户
USER openclaw

# 暴露端口(Web Dashboard 和 API)
EXPOSE 8080 8443

# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \
    CMD python -c "import urllib.request; \
    urllib.request.urlopen('http://localhost:8080/health')"

# 启动命令
CMD ["openclaw", "run", "--config", "/app/config.yaml"]

这个 Dockerfile 有几个值得注意的设计要点:首先,使用多阶段构建将编译环境和运行环境分离,最终镜像中不包含编译工具和中间文件,大幅减小了镜像体积。其次,使用非 root 用户运行应用,这是容器安全的基本要求。第三,添加了健康检查配置,让 Docker 能够自动检测容器是否正常运行。

docker-compose 编排多 Agent 系统

在实际生产环境中,通常需要同时运行多个 Agent,它们可能需要共享数据库、缓存等基础设施服务。docker-compose 让你可以在一个配置文件中定义和编排所有服务,一键启动整个系统。

# docker-compose.yaml - 多Agent系统编排
version: "3.9"

services:
  # 基础设施服务
  redis:
    image: redis:7-alpine
    container_name: openclaw-redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    command: redis-server --appendonly yes
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - openclaw-net

  postgres:
    image: postgres:16-alpine
    container_name: openclaw-db
    environment:
      POSTGRES_DB: openclaw
      POSTGRES_USER: ${DB_USER:-openclaw}
      POSTGRES_PASSWORD: ${DB_PASSWORD:?请设置数据库密码}
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U openclaw"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - openclaw-net

  # Agent 服务
  researcher:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: openclaw-researcher
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - SEARCH_API_KEY=${SEARCH_API_KEY}
      - DB_HOST=postgres
      - REDIS_URL=redis://redis:6379/0
      - OPENCLAW_AGENT_NAME=研究员
    volumes:
      - agent-logs:/app/logs
      - ./agents/researcher.py:/app/agents/researcher.py:ro
    depends_on:
      redis:
        condition: service_healthy
      postgres:
        condition: service_healthy
    networks:
      - openclaw-net
    deploy:
      resources:
        limits:
          memory: 1G
          cpus: "1.0"

  writer:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: openclaw-writer
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - REDIS_URL=redis://redis:6379/0
      - OPENCLAW_AGENT_NAME=写作者
    volumes:
      - agent-logs:/app/logs
      - ./agents/writer.py:/app/agents/writer.py:ro
    depends_on:
      redis:
        condition: service_healthy
    networks:
      - openclaw-net
    deploy:
      resources:
        limits:
          memory: 1G
          cpus: "1.0"

  reviewer:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: openclaw-reviewer
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - REDIS_URL=redis://redis:6379/0
      - OPENCLAW_AGENT_NAME=审查员
    volumes:
      - agent-logs:/app/logs
      - ./agents/reviewer.py:/app/agents/reviewer.py:ro
    depends_on:
      redis:
        condition: service_healthy
    networks:
      - openclaw-net
    deploy:
      resources:
        limits:
          memory: 512M
          cpus: "0.5"

  # Web 管理台
  dashboard:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: openclaw-dashboard
    command: ["openclaw", "dashboard", "--host", "0.0.0.0"]
    environment:
      - REDIS_URL=redis://redis:6379/0
      - DB_HOST=postgres
    ports:
      - "8080:8080"
    depends_on:
      - redis
      - postgres
      - researcher
      - writer
      - reviewer
    networks:
      - openclaw-net

# 网络配置
networks:
  openclaw-net:
    driver: bridge

# 持久化卷
volumes:
  redis-data:
  postgres-data:
  agent-logs:

安全注意事项

在生产环境中,请注意以下安全事项:第一,永远不要在 docker-compose 文件中硬编码 API 密钥或数据库密码,使用 .env 文件或密钥管理服务来管理敏感信息。第二,确保 .env 文件已添加到 .gitignore 中,避免提交到代码仓库。第三,限制容器的资源使用(deploy.resources.limits),防止某个 Agent 消耗过多资源影响其他服务。第四,使用只读挂载(:ro)来挂载不需要修改的文件。

生产环境部署最佳实践

将 OpenClaw Agent 系统部署到生产环境时,除了基本的容器化配置,还需要考虑以下几个关键方面:监控告警、日志管理、数据备份和自动扩缩容。

在监控方面,建议在 docker-compose 中添加 Prometheus 和 Grafana 服务。Prometheus 负责收集各个 Agent 容器的运行指标(CPU、内存、请求延迟、错误率等),Grafana 负责可视化展示这些数据并配置告警规则。

# docker-compose.prod.yaml - 生产环境扩展配置
# 在基础配置上添加监控和日志服务

services:
  # 日志收集
  loki:
    image: grafana/loki:latest
    container_name: openclaw-loki
    ports:
      - "3100:3100"
    volumes:
      - loki-data:/loki
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - openclaw-net

  # 监控面板
  grafana:
    image: grafana/grafana:latest
    container_name: openclaw-grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}
    volumes:
      - grafana-data:/var/lib/grafana
      - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards
    depends_on:
      - loki
    networks:
      - openclaw-net

  # Prometheus 指标收集
  prometheus:
    image: prom/prometheus:latest
    container_name: openclaw-prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    networks:
      - openclaw-net

volumes:
  loki-data:
  grafana-data:
  prometheus-data:

部署与运维命令

完成配置后,使用以下命令进行部署和日常运维。这些命令覆盖了从构建到监控的完整运维流程。

# 1. 创建环境变量文件
cat > .env << 'EOF'
OPENAI_API_KEY=sk-your-key-here
SEARCH_API_KEY=your-search-key
DB_PASSWORD=your-secure-password
GRAFANA_PASSWORD=admin-secure-pass
EOF

# 2. 构建镜像
docker compose build

# 3. 启动所有服务
docker compose up -d

# 4. 查看服务状态
docker compose ps

# 5. 查看实时日志
docker compose logs -f researcher writer reviewer

# 6. 重启某个 Agent
docker compose restart researcher

# 7. 更新部署(修改代码后)
docker compose build researcher
docker compose up -d --no-deps researcher

# 8. 停止所有服务
docker compose down

# 9. 停止并清除数据(慎用)
docker compose down -v

数据备份建议

定期备份 Docker 卷中的数据是生产运维的重要环节。PostgreSQL 数据库可以使用 pg_dump 命令进行逻辑备份,Redis 数据可以通过 RDB 快照或 AOF 文件进行备份。建议将备份脚本设置为 cron 定时任务,并将备份文件上传到远程存储(如 S3、OSS)。同时,定期进行备份恢复演练,确保备份数据确实可用。

性能优化与资源规划

在生产环境中运行多个 AI Agent 容器时,合理的资源规划至关重要。每个 Agent 容器的资源消耗主要取决于它使用的模型(本地模型还是远程 API)、并发请求量和工具调用频率。对于使用远程 API(如 OpenAI)的 Agent,容器本身的资源消耗较低(主要是网络 I/O 等待),可以分配较少的 CPU 和内存。对于运行本地模型的 Agent,则需要根据模型大小分配足够的内存和 GPU 资源。

建议为每个 Agent 容器设置资源限制(limits)和资源请求(reservations),确保在高负载情况下系统仍能稳定运行。同时,使用 Docker 的自动重启策略(restart: unless-stopped)来提高系统的容错能力。

小结

Docker 容器化部署是将 OpenClaw Agent 应用推向生产环境的关键一步。通过精心设计的 Dockerfile、docker-compose 编排和完善的监控体系,你可以构建一个稳定、可扩展、易于运维的 AI Agent 生产系统。至此,你已经完成了 OpenClaw 实战教程系列的全部学习——从快速入门到工作流编排、工具集成、多 Agent 协作、Prompt 工程,再到容器化部署。希望这些教程能帮助你在 AI Agent 的开发之路上走得更远。如果有任何问题,欢迎回到首页探索更多资源!