上一篇 下一篇 分享链接 返回 返回顶部

实战复盘:用 Docker 把 AI Agent 稳稳部署到生产环境

发布人:慈云数据-客服中心 发布时间:3小时前 阅读量:2

AI Agent Docker部署教程|生产环境实测

随着大模型能力的持续提升,越来越多企业开始将 AI Agent(智能体) 引入客服、知识库问答、自动化运维、数据分析、代码辅助、内容生成等业务场景。相比单纯调用大模型接口,AI Agent 往往具备工具调用、任务规划、上下文记忆、知识库检索、多轮执行等能力,因此系统架构会更复杂,对部署环境、服务稳定性、安全性和可维护性也提出了更高要求。

在实际生产环境中,直接使用源码方式部署 AI Agent 虽然灵活,但容易遇到依赖冲突、环境不一致、迁移困难、升级复杂等问题。相比之下,使用 Docker 容器化部署 可以显著降低环境差异带来的风险,让开发、测试、生产环境保持一致,也更便于后续扩容、回滚和自动化运维。

本文将以生产环境实测的角度,系统讲解 AI Agent 的 Docker 部署流程,包括服务器准备、Docker 安装、项目结构设计、环境变量配置、镜像构建、容器运行、反向代理、HTTPS、日志管理、安全加固、数据持久化以及常见问题排查。


一、为什么推荐用 Docker 部署 AI Agent?

AI Agent 项目通常并不是一个简单的 Web 服务,它可能包含以下模块:

  • 后端 API 服务
  • 前端管理页面
  • 向量数据库
  • Redis 缓存
  • PostgreSQL / MySQL 数据库
  • 文件存储服务
  • 定时任务服务
  • 大模型 API 调用模块
  • 工具调用模块
  • Agent 执行队列
  • 日志与监控组件

如果直接在服务器上手动安装这些依赖,维护成本会非常高。例如 Python 版本不一致、Node.js 版本不匹配、系统依赖缺失、数据库版本差异,都可能导致部署失败。

Docker 的优势主要体现在以下几个方面:

1. 环境一致性

开发环境、测试环境、生产环境都可以使用同一份镜像,避免“本地能跑,服务器不能跑”的问题。

2. 部署简单

通过 docker compose up -d 即可启动多个服务,不需要手动逐个安装依赖。

3. 方便迁移

将项目代码、Dockerfile、docker-compose.yml 和数据卷配置好之后,可以快速迁移到另一台服务器。

4. 易于扩展

后续如果需要增加 Worker、队列服务、向量库或监控系统,可以通过 Compose 或 Kubernetes 进行扩展。

5. 便于回滚

如果新版本出现问题,可以快速切换回旧镜像,降低生产事故影响。


二、生产环境部署前的准备

本文以一台 Linux 服务器为例,推荐使用 Ubuntu 22.04 LTS 或 Debian 12。CentOS、Rocky Linux、AlmaLinux 也可以,但部分命令需要相应调整。

1. 推荐服务器配置

如果只是个人测试,2 核 4G 内存即可运行较轻量的 AI Agent 服务。但生产环境建议至少:

业务规模 CPU 内存 磁盘 说明
个人/测试环境 2核 4GB 40GB 适合 Demo 和小规模测试
小型生产环境 4核 8GB 100GB SSD 适合内部工具、知识库问答
中型生产环境 8核 16GB+ 200GB SSD 适合多人并发、复杂 Agent
高并发环境 16核+ 32GB+ 500GB+ 建议配合负载均衡和集群

如果 AI Agent 需要本地部署大模型,比如运行 Qwen、Llama、DeepSeek 等模型,则还需要 GPU 资源。本文主要讨论调用外部大模型 API 或使用独立模型服务的部署方式。

2. 域名与端口规划

生产环境不建议直接通过 IP + 端口访问服务,推荐使用域名,并通过 Nginx 或 Caddy 做反向代理。

例如:

https://agent.example.com

常用端口规划:

服务 内部端口 外部暴露
AI Agent API 8000 不直接暴露
Web 前端 3000 不直接暴露
Nginx 80 / 443 对外暴露
PostgreSQL 5432 不对外暴露
Redis 6379 不对外暴露
向量数据库 6333 / 19530 不对外暴露

生产环境原则:数据库、Redis、向量库不要直接暴露到公网


三、安装 Docker 和 Docker Compose

登录服务器后,先更新系统:

sudo apt update
sudo apt upgrade -y

安装必要工具:

sudo apt install -y ca-certificates curl gnupg lsb-release

安装 Docker 官方 GPG Key:

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

添加 Docker 软件源:

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker:

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

验证安装:

docker version
docker compose version

设置 Docker 开机自启:

sudo systemctl enable docker
sudo systemctl start docker

如果希望当前用户不用每次都输入 sudo,可以执行:

sudo usermod -aG docker $USER

然后退出 SSH 重新登录即可。


四、AI Agent 项目目录结构设计

一个生产环境更推荐使用清晰的目录结构,例如:

ai-agent/
├── backend/
│   ├── app/
│   ├── requirements.txt
│   ├── Dockerfile
│   └── gunicorn_conf.py
├── frontend/
│   ├── src/
│   ├── package.json
│   ├── Dockerfile
│   └── nginx.conf
├── nginx/
│   └── default.conf
├── data/
│   ├── postgres/
│   ├── redis/
│   └── qdrant/
├── logs/
│   ├── backend/
│   └── nginx/
├── .env
└── docker-compose.yml

其中:

  • backend/:后端服务,通常是 FastAPI、Flask、Django、Node.js 等;
  • frontend/:前端页面,通常是 React、Vue、Next.js 等;
  • nginx/:反向代理配置;
  • data/:数据库、缓存、向量库持久化数据;
  • logs/:日志文件;
  • .env:环境变量配置;
  • docker-compose.yml:核心编排文件。

五、编写后端 Dockerfile

假设后端使用 Python + FastAPI,入口文件是 app/main.py,服务对象是 app.main:app

backend/Dockerfile 中写入:

FROM python:3.11-slim

WORKDIR /app

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

RUN apt-get update && apt-get install -y \
    gcc \
    curl \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt /app/requirements.txt

RUN pip install --no-cache-dir --upgrade pip \
    && pip install --no-cache-dir -r requirements.txt

COPY . /app

EXPOSE 8000

CMD ["gunicorn", "app.main:app", "-k", "uvicorn.workers.UvicornWorker", "-c", "gunicorn_conf.py"]

生产环境不建议直接使用:

uvicorn app.main:app --host 0.0.0.0 --port 8000

因为 Uvicorn 单进程在生产环境下的稳定性和并发能力有限。更推荐使用 Gunicorn + Uvicorn Worker。

示例 gunicorn_conf.py

import multiprocessing

bind = "0.0.0.0:8000"
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = "uvicorn.workers.UvicornWorker"
timeout = 120
keepalive = 5
accesslog = "-"
errorlog = "-"

如果 Agent 执行任务较慢,例如需要调用多个工具、访问知识库、执行长链路推理,可以适当增加 timeout


六、编写前端 Dockerfile

如果前端是 Vue 或 React 项目,可以使用多阶段构建。

frontend/Dockerfile 示例:

FROM node:20-alpine AS builder

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

FROM nginx:1.25-alpine

COPY --from=builder /app/dist /usr/share/nginx/html

COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

如果是 Next.js 项目,则部署方式会有所不同,可以使用 Node.js 运行服务端渲染,也可以导出静态站点后使用 Nginx 托管。


七、配置环境变量 .env

.env 文件用于存放敏感配置和运行参数。生产环境一定不要把 .env 提交到 Git 仓库。

示例:

APP_ENV=production
APP_NAME=AI_AGENT

BACKEND_PORT=8000

POSTGRES_DB=agent_db
POSTGRES_USER=agent_user
POSTGRES_PASSWORD=请替换为强密码
POSTGRES_HOST=postgres
POSTGRES_PORT=5432

REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=请替换为强密码

QDRANT_HOST=qdrant
QDRANT_PORT=6333

OPENAI_API_KEY=sk-xxxx
OPENAI_BASE_URL=https://api.openai.com/v1
MODEL_NAME=gpt-4o-mini

JWT_SECRET=请替换为随机长字符串

生产环境中,至少需要注意以下几点:

  1. API Key 不要写死在代码里;
  2. 数据库密码使用强密码;
  3. JWT_SECRET 不要使用默认值;
  4. .env 文件权限建议设置为 600
  5. 如果有条件,可以使用 Vault、阿里云 KMS、腾讯云 KMS 等密钥管理系统。

设置权限:

chmod 600 .env

八、编写 docker-compose.yml

下面是一个相对完整的生产环境 Compose 示例,包含后端、前端、PostgreSQL、Redis、Qdrant 向量数据库和 Nginx。

services:
  backend:
    build:
      context: ./backend
    container_name: ai-agent-backend
    env_file:
      - .env
    depends_on:
      - postgres
      - redis
      - qdrant
    networks:
      - agent-net
    volumes:
      - ./logs/backend:/app/logs
    restart: always

  frontend:
    build:
      context: ./frontend
    container_name: ai-agent-frontend
    networks:
      - agent-net
    restart: always

  postgres:
    image: postgres:16-alpine
    container_name: ai-agent-postgres
    env_file:
      - .env
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    networks:
      - agent-net
    restart: always

  redis:
    image: redis:7-alpine
    container_name: ai-agent-redis
    command: >
      redis-server
      --requirepass ${REDIS_PASSWORD}
      --appendonly yes
    volumes:
      - ./data/redis:/data
    networks:
      - agent-net
    restart: always

  qdrant:
    image: qdrant/qdrant:latest
    container_name: ai-agent-qdrant
    volumes:
      - ./data/qdrant:/qdrant/storage
    networks:
      - agent-net
    restart: always

  nginx:
    image: nginx:1.25-alpine
    container_name: ai-agent-nginx
    depends_on:
      - backend
      - frontend
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./logs/nginx:/var/log/nginx
      - ./certs:/etc/nginx/certs
    networks:
      - agent-net
    restart: always

networks:
  agent-net:
    driver: bridge

这里没有把 PostgreSQL、Redis、Qdrant 的端口映射到宿主机,目的是避免公网访问。容器之间通过 Docker 内部网络通信即可。


九、配置 Nginx 反向代理

nginx/default.conf 示例:

server {
    listen 80;
    server_name agent.example.com;

    client_max_body_size 50m;

    location /api/ {
        proxy_pass http://backend:8000/api/;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 60s;
        proxy_send_timeout 120s;
        proxy_read_timeout 120s;
    }

    location / {
        proxy_pass http://frontend:80;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

如果 AI Agent 支持流式输出,比如 SSE 或 WebSocket,需要额外配置。

SSE 流式输出配置

location /api/chat/stream {
    proxy_pass http://backend:8000/api/chat/stream;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_buffering off;
    proxy_cache off;
    proxy_read_timeout 300s;
}

WebSocket 配置

location /ws/ {
    proxy_pass http://backend:8000/ws/;
    proxy_http_version 1.1;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;

    proxy_read_timeout 300s;
}

对于 AI Agent 来说,流式输出体验非常重要。如果 Nginx 开启缓冲,用户可能会感觉模型一直不返回,直到最后一次性输出。因此 SSE 场景一定要注意 proxy_buffering off


十、启动服务

进入项目根目录:

cd ai-agent

首次构建并启动:

docker compose up -d --build

查看容器状态:

docker compose ps

查看后端日志:

docker logs -f ai-agent-backend

查看 Nginx 日志:

docker logs -f ai-agent-nginx

如果一切正常,访问:

http://agent.example.com

即可看到 AI Agent 前端页面。


十一、配置 HTTPS 证书

生产环境强烈建议启用 HTTPS,特别是 AI Agent 涉及用户输入、企业知识库、API Key、登录态等敏感数据。

方案一:使用 Certbot 申请证书

如果 Nginx 运行在容器中,可以先在宿主机上使用 Certbot 申请证书,再挂载到 Nginx 容器。

安装 Certbot:

sudo apt install -y certbot

申请证书:

sudo certbot certonly --standalone -d agent.example.com

申请成功后,证书一般位于:

/etc/letsencrypt/live/agent.example.com/

可以将证书复制到项目的 certs 目录:

mkdir -p certs
sudo cp /etc/letsencrypt/live/agent.example.com/fullchain.pem certs/
sudo cp /etc/letsencrypt/live/agent.example.com/privkey.pem certs/
sudo chown -R $USER:$USER certs

然后修改 Nginx 配置:

server {
    listen 80;
    server_name agent.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name agent.example.com;

    ssl_certificate /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;

    client_max_body_size 50m;

    location /api/ {
        proxy_pass http://backend:8000/api/;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;

        proxy_read_timeout 120s;
    }

    location / {
        proxy_pass http://frontend:80;
        proxy_http_version 1.1;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

重启 Nginx:

docker compose restart nginx

方案二:使用 Caddy 自动 HTTPS

如果你不想手动管理证书,也可以使用 Caddy 替代 Nginx。Caddy 可以自动申请和续期 Let’s Encrypt 证书,非常适合中小型项目。


十二、数据库初始化与迁移

如果后端使用 ORM,比如 SQLAlchemy、Django ORM、Prisma 等,生产环境启动后通常需要执行数据库迁移。

以 Alembic 为例:

docker compose exec backend alembic upgrade head

以 Django 为例:

docker compose exec backend python manage.py migrate

创建管理员账号:

docker compose exec backend python manage.py createsuperuser

如果你使用的是自定义初始化脚本,也可以执行:

docker compose exec backend python scripts/init_db.py

生产环境要注意:数据库迁移前最好先备份,尤其是结构变更比较大的版本。


十三、数据持久化策略

Docker 容器本身是临时的,如果容器被删除,容器内部数据也可能丢失。因此生产环境必须做好数据持久化。

本文示例中:

volumes:
  - ./data/postgres:/var/lib/postgresql/data

这表示 PostgreSQL 数据存放在宿主机的 ./data/postgres 目录中。

同理:

./data/redis:/data
./data/qdrant:/qdrant/storage

分别对应 Redis 和 Qdrant 的持久化目录。

建议生产环境定期备份:

mkdir -p backups
docker compose exec postgres pg_dump -U agent_user agent_db > backups/agent_db_$(date +%F).sql

恢复数据库:

cat backups/agent_db_2026-01-01.sql | docker compose exec -T postgres psql -U agent_user agent_db

如果业务数据重要,建议采用:

  • 每日自动备份;
  • 备份文件上传到对象存储;
  • 保留最近 7 天、30 天或 90 天版本;
  • 定期演练恢复流程。

只做备份但不测试恢复,等于没有真正可用的备份。


十四、日志管理与排查

AI Agent 在生产环境中常见问题包括:

  • 大模型接口超时;
  • 工具调用失败;
  • 向量检索无结果;
  • Agent 多步推理中断;
  • Token 消耗异常;
  • 用户请求并发过高;
  • Redis 连接失败;
  • 数据库连接池耗尽。

查看所有容器日志:

docker compose logs -f

查看指定服务日志:

docker compose logs -f backend

查看最近 100 行日志:

docker compose logs --tail=100 backend

进入容器调试:

docker compose exec backend sh

如果容器内有 Bash:

docker compose exec backend bash

查看容器资源占用:

docker stats

如果发现某个 Agent 请求耗时特别长,需要重点检查:

  1. 模型 API 是否超时;
  2. 工具函数是否阻塞;
  3. 向量数据库检索是否慢;
  4. 是否存在无限循环的 Agent 规划;
  5. 是否缺少最大执行步数限制;
  6. 是否没有设置请求超时时间。

十五、生产环境安全加固

AI Agent 的安全问题非常重要,因为它不仅会接收用户输入,还可能调用工具、访问数据库、读取文档、执行自动化任务。生产环境至少应该做好以下安全措施。

1. 不暴露内部服务端口

PostgreSQL、Redis、Qdrant 不要映射到公网端口。只允许容器内部网络访问。

2. 设置强密码

数据库、Redis、后台管理员账号都必须使用强密码。不要使用 123456adminpassword 等弱口令。

3. 限制 Agent 工具权限

如果 Agent 可以调用工具,例如执行 Shell、访问内部 API、读取文件,必须限制权限。不要让 Agent 拥有不受控的系统执行能力。

4. 设置请求频率限制

可以在 Nginx 中加入限流配置,避免接口被滥用。

示例:

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;

server {
    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;
        proxy_pass http://backend:8000/api/;
    }
}

5. 对用户输入做安全过滤

对于 Prompt Injection、越权访问、敏感信息泄露等问题,需要在业务层做防护。例如:

  • 不允许用户通过提示词读取系统配置;
  • 不允许 Agent 返回 API Key;
  • 不允许普通用户访问其他用户知识库;
  • 工具调用前进行权限校验;
  • 对高风险操作增加人工确认。

6. 定期更新镜像

基础镜像可能存在安全漏洞,建议定期更新:

docker compose pull
docker compose up -d --build

十六、升级与回滚方案

生产环境上线新版本时,不建议直接覆盖部署。推荐流程:

  1. 本地或测试环境完成验证;
  2. 构建新镜像;
  3. 备份数据库;
  4. 停止旧服务或滚动更新;
  5. 启动新服务;
  6. 检查日志和健康接口;
  7. 如有异常,快速回滚。

如果使用镜像标签,可以这样管理:

ai-agent-backend:v1.0.0
ai-agent-backend:v1.0.1
ai-agent-backend:v1.1.0

回滚时只需要修改 Compose 中的镜像版本,然后重启:

docker compose up -d

对于数据库结构变更,回滚会更复杂,因此迁移脚本需要谨慎设计,最好支持降级。


十七、健康检查配置

建议为后端提供健康检查接口,例如:

GET /api/health

返回:

{
  "status": "ok"
}

在 Compose 中可以配置 healthcheck:

backend:
  build:
    context: ./backend
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:8000/api/health"]
    interval: 30s
    timeout: 10s
    retries: 3

这样可以及时发现服务异常。如果配合监控系统,还可以实现自动告警。


十八、生产环境实测经验总结

根据实际部署经验,AI Agent 生产环境最容易踩坑的地方主要有以下几个。

1. 流式输出被 Nginx 缓冲

表现为前端一直等待,最后一次性显示全部内容。解决方式是在 SSE 接口配置:

proxy_buffering off;

2. Agent 执行时间超过网关超时

复杂 Agent 可能需要多轮工具调用,耗时超过 60 秒很常见。需要同时调整:

  • 后端请求超时;
  • Gunicorn timeout;
  • Nginx proxy_read_timeout;
  • 前端请求超时;
  • 大模型 API 超时。

3. Redis 密码配置不一致

很多项目在本地 Redis 无密码,生产环境加密码后忘记修改连接字符串,导致任务队列无法启动。

4. 向量数据库没有持久化

如果 Qdrant、Milvus、Weaviate 没有正确挂载数据目录,容器重建后知识库数据可能丢失。

5. API Key 泄露风险

日志中不要打印完整 API Key,也不要把 .env 上传到代码仓库。尤其是多人协作项目,一定要设置 .gitignore

6. Agent 缺少最大步数限制

如果 Agent 规划逻辑不完善,可能会陷入循环调用工具,造成 Token 大量消耗。因此需要设置最大执行步数,例如最多 5 步、10 步或 20 步。

7. 没有做成本监控

调用商业大模型 API 时,成本可能在高并发或异常循环中迅速上升。建议记录:

  • 每次请求 Token 消耗;
  • 每个用户调用次数;
  • 每个 Agent 任务成本;
  • 每日总消耗;
  • 异常调用告警。

十九、常用 Docker 运维命令

查看容器:

docker ps

查看所有容器:

docker ps -a

停止服务:

docker compose down

启动服务:

docker compose up -d

重新构建:

docker compose up -d --build

查看日志:

docker compose logs -f

进入容器:

docker compose exec backend sh

清理无用镜像:

docker image prune -f

清理无用容器、网络、镜像缓存:

docker system prune -f

注意:不要随意执行带 --volumes 的清理命令,否则可能删除数据卷。


二十、结语

使用 Docker 部署 AI Agent,是当前生产环境中非常实用且成熟的方案。它可以帮助我们解决环境一致性、依赖隔离、快速迁移、持续交付和服务扩展等问题。对于一个真正投入生产的 AI Agent 系统来说,部署并不只是“能跑起来”,还需要考虑安全、稳定、日志、监控、备份、升级、回滚和成本控制。

如果是小型项目,可以先使用 Docker Compose 快速落地;如果后续并发量提升、服务模块增多,可以逐步迁移到 Kubernetes、云原生网关、集中日志系统和自动化 CI/CD 流程。

最后总结一下生产环境部署 AI Agent 的核心原则:

  • 内部服务不要暴露公网;
  • 数据必须持久化并定期备份;
  • API Key 和密码必须通过环境变量或密钥系统管理;
  • Nginx 要正确配置 SSE/WebSocket;
  • Agent 要限制最大执行步数和工具权限;
  • 上线前必须验证健康检查、日志和回滚方案;
  • 生产环境不仅要能运行,更要可维护、可观测、可恢复。

按照本文的流程完成部署后,你就可以获得一个结构清晰、稳定可靠、便于扩展的 AI Agent Docker 生产环境基础架构。

目录结构
全文