从零把 AI 编程助手部署到服务器:Docker 实战源码版
AI编程 Docker部署教程|附源码
随着大模型技术的快速发展,越来越多开发者开始尝试将 AI 能力集成到自己的应用中,例如:AI 聊天助手、代码生成工具、智能客服、知识库问答系统、自动化脚本生成平台等。
在本地开发阶段,我们通常可以直接运行 Python、Node.js 或 Java 项目;但一旦要部署到服务器,就会遇到一系列问题:
- 服务器环境和本地环境不一致;
- Python 或 Node.js 版本冲突;
- 依赖安装失败;
- 项目迁移困难;
- 多服务部署复杂;
- 更新版本时容易出错。
这时,Docker 就成为 AI 应用部署中非常重要的工具。通过 Docker,我们可以将项目代码、运行环境、依赖包、启动命令统一打包成镜像,在任何支持 Docker 的服务器上快速运行。
本文将以一个简单的 AI 编程助手项目 为例,完整演示如何使用 Docker 进行部署,并附上完整源码示例。
一、项目介绍
本文实现的是一个简单的 AI 编程助手后端服务,主要功能包括:
- 提供 HTTP API 接口;
- 接收用户输入的编程问题;
- 调用大模型 API;
- 返回 AI 生成的代码或解释;
- 使用 Docker 完成容器化部署;
- 使用 Docker Compose 简化运行流程。
为了方便演示,本文使用 Python + FastAPI 构建后端服务。FastAPI 具有性能高、语法简洁、自动生成接口文档等优点,非常适合构建 AI API 服务。
项目最终目录结构如下:
ai-code-assistant/
├── app/
│ ├── main.py
│ ├── ai_service.py
│ └── config.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── .env
└── README.md
二、准备工作
在开始之前,你需要准备以下环境:
1. 本地开发环境
建议安装:
- Python 3.10+
- Docker
- Docker Compose
- Git
- VS Code 或其他代码编辑器
可以通过以下命令检查 Docker 是否安装成功:
docker -v
如果输出类似下面内容,说明安装成功:
Docker version 24.0.0, build xxxxx
检查 Docker Compose:
docker compose version
2. AI API Key
如果你的 AI 项目需要调用第三方大模型服务,例如 OpenAI、通义千问、智谱、DeepSeek、Claude 等,通常都需要配置 API Key。
本文为了通用性,代码中使用环境变量读取 API Key:
AI_API_KEY=你的_API_KEY
AI_BASE_URL=https://api.example.com/v1
AI_MODEL=your-model-name
你可以根据实际使用的大模型服务修改对应地址和模型名称。
三、创建项目目录
首先创建项目目录:
mkdir ai-code-assistant
cd ai-code-assistant
创建 app 目录:
mkdir app
最终我们会把后端核心代码放到 app 目录中。
四、编写配置文件
在 app 目录下创建 config.py:
import os
from dotenv import load_dotenv
load_dotenv()
class Settings:
AI_API_KEY: str = os.getenv("AI_API_KEY", "")
AI_BASE_URL: str = os.getenv("AI_BASE_URL", "")
AI_MODEL: str = os.getenv("AI_MODEL", "gpt-4o-mini")
APP_HOST: str = os.getenv("APP_HOST", "0.0.0.0")
APP_PORT: int = int(os.getenv("APP_PORT", "8000"))
settings = Settings()
这个文件的作用是统一读取环境变量,避免把 API Key 写死在代码中。
在真实项目中,不建议将 API Key 提交到 Git 仓库,否则容易造成密钥泄露。
五、编写 AI 调用服务
继续在 app 目录下创建 ai_service.py:
import requests
from app.config import settings
def generate_code(prompt: str) -> str:
"""
调用大模型接口,根据用户输入生成代码或编程解释。
"""
if not settings.AI_API_KEY:
return "错误:未配置 AI_API_KEY,请在 .env 文件或环境变量中设置。"
url = f"{settings.AI_BASE_URL}/chat/completions"
headers = {
"Authorization": f"Bearer {settings.AI_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": settings.AI_MODEL,
"messages": [
{
"role": "system",
"content": "你是一名资深软件工程师,擅长 Python、JavaScript、Docker、Linux 和后端开发。请用清晰、准确、可运行的方式回答用户的编程问题。"
},
{
"role": "user",
"content": prompt
}
],
"temperature": 0.3
}
try:
response = requests.post(url, json=payload, headers=headers, timeout=60)
response.raise_for_status()
data = response.json()
return data["choices"][0]["message"]["content"]
except requests.exceptions.RequestException as e:
return f"请求 AI 服务失败:{str(e)}"
except Exception as e:
return f"解析 AI 返回结果失败:{str(e)}"
这里使用了类似 OpenAI Chat Completions 的接口格式。如果你使用的是其他平台,需要根据对应平台文档调整请求地址和返回字段。
例如有的平台接口路径不是 /chat/completions,也有的平台鉴权方式不是 Bearer Token,这些都需要按实际情况修改。
六、编写 FastAPI 主程序
在 app 目录下创建 main.py:
from fastapi import FastAPI
from pydantic import BaseModel
from app.ai_service import generate_code
app = FastAPI(
title="AI 编程助手 API",
description="一个基于 FastAPI 和 Docker 部署的 AI 编程助手示例项目",
version="1.0.0"
)
class CodeRequest(BaseModel):
prompt: str
class CodeResponse(BaseModel):
result: str
@app.get("/")
def index():
return {
"message": "AI 编程助手服务运行中",
"docs": "/docs"
}
@app.get("/health")
def health_check():
return {
"status": "ok"
}
@app.post("/api/generate", response_model=CodeResponse)
def generate(request: CodeRequest):
result = generate_code(request.prompt)
return {
"result": result
}
这个文件提供了三个接口:
| 接口 | 方法 | 说明 |
|---|---|---|
/ |
GET | 首页状态 |
/health |
GET | 健康检查 |
/api/generate |
POST | AI 编程生成接口 |
FastAPI 默认会提供 Swagger 文档,访问地址为:
http://localhost:8000/docs
七、编写依赖文件
在项目根目录创建 requirements.txt:
fastapi==0.111.0
uvicorn[standard]==0.30.1
requests==2.32.3
python-dotenv==1.0.1
pydantic==2.7.4
这些依赖分别用于:
fastapi:构建 Web API;uvicorn:ASGI 服务启动器;requests:发送 HTTP 请求;python-dotenv:读取.env环境变量;pydantic:数据校验和模型定义。
八、编写环境变量文件
在项目根目录创建 .env 文件:
AI_API_KEY=你的_API_KEY
AI_BASE_URL=https://api.example.com/v1
AI_MODEL=gpt-4o-mini
APP_HOST=0.0.0.0
APP_PORT=8000
请注意:
- 不要把真实 API Key 上传到公开仓库;
- 可以创建
.gitignore忽略.env文件; - 生产环境更推荐使用服务器环境变量或 Docker Secret。
建议创建 .gitignore:
.env
__pycache__/
*.pyc
.venv/
.idea/
.vscode/
九、本地运行测试
在使用 Docker 之前,我们可以先在本地直接运行项目,确认代码没有问题。
安装依赖:
pip install -r requirements.txt
启动服务:
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
访问浏览器:
http://localhost:8000
如果看到如下返回,说明服务启动成功:
{
"message": "AI 编程助手服务运行中",
"docs": "/docs"
}
访问接口文档:
http://localhost:8000/docs
你可以在 Swagger 页面中测试 /api/generate 接口。
请求示例:
{
"prompt": "请用 Python 写一个快速排序算法,并解释每一步。"
}
返回示例:
{
"result": "下面是一个 Python 快速排序示例..."
}
十、编写 Dockerfile
Dockerfile 是 Docker 构建镜像的核心文件。它描述了镜像如何构建、依赖如何安装、服务如何启动。
在项目根目录创建 Dockerfile:
FROM python:3.11-slim
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
逐行解释如下:
FROM python:3.11-slim
表示使用 Python 3.11 的精简版镜像作为基础镜像。
WORKDIR /app
设置容器内工作目录为 /app。
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
这两个环境变量常用于 Python 容器:
PYTHONDONTWRITEBYTECODE=1:不生成.pyc文件;PYTHONUNBUFFERED=1:让日志实时输出,方便 Docker 查看日志。
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
先复制依赖文件并安装依赖。这样做的好处是可以利用 Docker 构建缓存,只要依赖文件不变,后续构建会更快。
COPY . .
复制项目代码到容器中。
EXPOSE 8000
声明容器服务端口。
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
容器启动后执行的命令。
十一、构建 Docker 镜像
在项目根目录执行:
docker build -t ai-code-assistant:1.0 .
参数说明:
docker build:构建镜像;-t ai-code-assistant:1.0:指定镜像名称和版本;.:表示使用当前目录作为构建上下文。
构建完成后查看镜像:
docker images
你应该能看到类似结果:
REPOSITORY TAG IMAGE ID CREATED SIZE
ai-code-assistant 1.0 xxxxxxxx 1 minute ago 180MB
十二、使用 Docker 运行容器
可以通过以下命令启动容器:
docker run -d \
--name ai-code-assistant \
-p 8000:8000 \
--env-file .env \
ai-code-assistant:1.0
参数说明:
| 参数 | 说明 |
|---|---|
-d |
后台运行 |
--name |
指定容器名称 |
-p 8000:8000 |
将宿主机 8000 端口映射到容器 8000 端口 |
--env-file .env |
加载环境变量文件 |
ai-code-assistant:1.0 |
使用的镜像 |
查看运行状态:
docker ps
查看日志:
docker logs -f ai-code-assistant
测试健康检查:
curl http://localhost:8000/health
如果返回:
{
"status": "ok"
}
说明 Docker 部署成功。
十三、使用 Docker Compose 部署
单独使用 docker run 没问题,但参数较长,不方便维护。实际项目中更推荐使用 Docker Compose。
在项目根目录创建 docker-compose.yml:
services:
ai-code-assistant:
build:
context: .
dockerfile: Dockerfile
container_name: ai-code-assistant
ports:
- "8000:8000"
env_file:
- .env
restart: always
启动服务:
docker compose up -d
查看服务:
docker compose ps
查看日志:
docker compose logs -f
停止服务:
docker compose down
重新构建并启动:
docker compose up -d --build
Docker Compose 的好处是配置清晰,适合管理多个服务。例如后续你要加入 Redis、PostgreSQL、向量数据库、Nginx,都可以写在同一个 docker-compose.yml 中。
十四、完整源码汇总
下面给出完整源码,方便你直接复制使用。
1. app/config.py
import os
from dotenv import load_dotenv
load_dotenv()
class Settings:
AI_API_KEY: str = os.getenv("AI_API_KEY", "")
AI_BASE_URL: str = os.getenv("AI_BASE_URL", "")
AI_MODEL: str = os.getenv("AI_MODEL", "gpt-4o-mini")
APP_HOST: str = os.getenv("APP_HOST", "0.0.0.0")
APP_PORT: int = int(os.getenv("APP_PORT", "8000"))
settings = Settings()
2. app/ai_service.py
import requests
from app.config import settings
def generate_code(prompt: str) -> str:
if not settings.AI_API_KEY:
return "错误:未配置 AI_API_KEY,请在 .env 文件或环境变量中设置。"
url = f"{settings.AI_BASE_URL}/chat/completions"
headers = {
"Authorization": f"Bearer {settings.AI_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"model": settings.AI_MODEL,
"messages": [
{
"role": "system",
"content": "你是一名资深软件工程师,擅长 Python、JavaScript、Docker、Linux 和后端开发。"
},
{
"role": "user",
"content": prompt
}
],
"temperature": 0.3
}
try:
response = requests.post(url, json=payload, headers=headers, timeout=60)
response.raise_for_status()
data = response.json()
return data["choices"][0]["message"]["content"]
except requests.exceptions.RequestException as e:
return f"请求 AI 服务失败:{str(e)}"
except Exception as e:
return f"解析 AI 返回结果失败:{str(e)}"
3. app/main.py
from fastapi import FastAPI
from pydantic import BaseModel
from app.ai_service import generate_code
app = FastAPI(
title="AI 编程助手 API",
description="基于 FastAPI 和 Docker 部署的 AI 编程助手",
version="1.0.0"
)
class CodeRequest(BaseModel):
prompt: str
class CodeResponse(BaseModel):
result: str
@app.get("/")
def index():
return {
"message": "AI 编程助手服务运行中",
"docs": "/docs"
}
@app.get("/health")
def health_check():
return {
"status": "ok"
}
@app.post("/api/generate", response_model=CodeResponse)
def generate(request: CodeRequest):
result = generate_code(request.prompt)
return {
"result": result
}
4. requirements.txt
fastapi==0.111.0
uvicorn[standard]==0.30.1
requests==2.32.3
python-dotenv==1.0.1
pydantic==2.7.4
5. .env
AI_API_KEY=你的_API_KEY
AI_BASE_URL=https://api.example.com/v1
AI_MODEL=gpt-4o-mini
APP_HOST=0.0.0.0
APP_PORT=8000
6. Dockerfile
FROM python:3.11-slim
WORKDIR /app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
7. docker-compose.yml
services:
ai-code-assistant:
build:
context: .
dockerfile: Dockerfile
container_name: ai-code-assistant
ports:
- "8000:8000"
env_file:
- .env
restart: always
十五、部署到云服务器
如果你要部署到云服务器,例如阿里云、腾讯云、华为云、AWS、Vultr 等,可以参考以下流程。
1. 登录服务器
ssh root@你的服务器IP
2. 安装 Docker
以 Ubuntu 为例:
apt update
apt install -y docker.io docker-compose-plugin
systemctl enable docker
systemctl start docker
检查版本:
docker -v
docker compose version
3. 上传项目代码
方式一:使用 Git 拉取:
git clone https://你的仓库地址/ai-code-assistant.git
cd ai-code-assistant
方式二:使用 scp 上传:
scp -r ai-code-assistant root@你的服务器IP:/root/
4. 配置环境变量
进入项目目录后创建 .env:
nano .env
写入:
AI_API_KEY=你的真实_API_KEY
AI_BASE_URL=https://api.example.com/v1
AI_MODEL=gpt-4o-mini
APP_HOST=0.0.0.0
APP_PORT=8000
5. 启动服务
docker compose up -d --build
6. 开放服务器端口
如果使用云服务器,需要在安全组中开放 8000 端口。
然后访问:
http://你的服务器IP:8000
接口文档:
http://你的服务器IP:8000/docs
十六、生产环境优化建议
上面的示例适合入门和小型项目。如果用于生产环境,建议继续做以下优化。
1. 使用 Nginx 反向代理
不要直接暴露 FastAPI 服务端口,可以使用 Nginx 做反向代理,并配置 HTTPS。
例如:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
2. 配置 HTTPS
可以使用 Certbot 免费申请 Let’s Encrypt 证书:
apt install -y certbot python3-certbot-nginx
certbot --nginx
3. 增加接口鉴权
AI 接口通常会消耗费用,因此不能随便公开。可以增加 Token 鉴权、用户登录、接口限流等能力。
简单方式是在请求头中添加自定义 Token,例如:
Authorization: Bearer your-service-token
4. 增加日志系统
生产环境建议记录:
- 请求时间;
- 请求 IP;
- 请求路径;
- AI 模型耗时;
- 错误信息;
- Token 消耗量。
可以接入 ELK、Grafana Loki 或云厂商日志服务。
5. 增加超时和重试机制
调用大模型 API 时,网络波动和服务限流都很常见。建议增加:
- 请求超时;
- 自动重试;
- 指数退避;
- 错误码分类处理。
6. 使用异步请求
如果并发量较高,可以将 requests 替换为 httpx.AsyncClient,并将接口改为异步接口,从而提升并发处理能力。
7. 增加缓存
对于重复问题,可以使用 Redis 缓存结果,减少重复调用模型的成本。
8. 使用多 Worker
生产环境中,可以使用 Gunicorn 管理多个 Uvicorn Worker:
gunicorn app.main:app \
-k uvicorn.workers.UvicornWorker \
-w 4 \
-b 0.0.0.0:8000
对应 Dockerfile 的启动命令也可以改成 Gunicorn。
十七、常见问题排查
1. 容器启动后访问不了
检查容器是否运行:
docker ps
检查日志:
docker logs -f ai-code-assistant
确认端口映射是否正确:
-p 8000:8000
确认云服务器安全组是否开放端口。
2. 提示未配置 API Key
检查 .env 是否存在:
ls -a
检查 Docker Compose 是否加载:
env_file:
- .env
修改 .env 后需要重启:
docker compose down
docker compose up -d
3. AI 接口请求失败
可能原因包括:
AI_BASE_URL填写错误;- API Key 无效;
- 模型名称错误;
- 账户余额不足;
- 网络无法访问对应服务;
- 请求格式与平台不兼容。
可以进入容器测试网络:
docker exec -it ai-code-assistant bash
然后使用:
curl https://api.example.com/v1
4. 修改代码后没有生效
Docker 镜像不会自动包含你修改后的代码,需要重新构建:
docker compose up -d --build
如果仍然不生效,可以清理旧镜像:
docker compose down
docker image prune -f
docker compose up -d --build
十八、总结
本文从零开始完成了一个 AI 编程助手项目,并演示了如何使用 Docker 和 Docker Compose 进行部署。
完整流程包括:
- 使用 FastAPI 编写 AI 后端接口;
- 使用环境变量管理 API Key;
- 编写
requirements.txt管理依赖; - 编写
Dockerfile构建镜像; - 使用
docker run启动容器; - 使用 Docker Compose 简化部署;
- 部署到云服务器;
- 给出生产环境优化方向。
Docker 的核心价值在于:一次构建,到处运行。对于 AI 应用来说,它可以大幅降低环境配置成本,让开发者更专注于模型能力、业务逻辑和产品体验。
如果你正在开发 AI 编程助手、AI 知识库、智能客服、AI Agent 或自动化代码生成平台,那么 Docker 几乎是上线部署过程中不可或缺的一环。通过本文的源码和步骤,你可以快速搭建属于自己的 AI 编程服务,并在此基础上继续扩展前端页面、用户系统、数据库、知识库检索和更多智能化能力。