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 的开发之路上走得更远。如果有任何问题,欢迎回到首页探索更多资源!