这篇文章写给开发好了 AI 应用,想快速上线给别人用,但不会容器化部署的开发者。用 FastAPI 写接口,Docker 打包,五分钟就能上线,新手也能看懂。
痛点场景
你辛辛苦苦把 AI 应用开发好了,模型调通了,效果也不错,现在想给别人用——怎么部署?
直接在本地跑,别人访问不到;扔到服务器上,环境不对跑不起来;手工装依赖,装一下午还各种报错。
其实用 FastAPI + Docker 一套下来,五分钟就能打包上线,不管搬到哪台服务器,一键就能跑起来。我把完整流程整理出来,你照着做就行。
适用场景:
- 你开发好了 AI 模型/问答/RAG 应用,想上线给用户用
- 不想折腾环境配置,希望一次打包到处运行
- 新手第一次部署,想要一个简单能跑通的流程
项目结构
我们先看一下最简单的项目结构:
my-ai-app/
├── main.py # FastAPI 入口
├── requirements.txt # 依赖列表
├── Dockerfile # Docker 配置
└── .dockerignore # Docker 忽略文件
第一步:用 FastAPI 写接口
FastAPI 非常适合写 AI 服务接口,异步性能好,自动生成文档,上手简单。
main.py 示例(以问答接口为例):
from fastapi import FastAPI
from pydantic import BaseModel
import openai
app = FastAPI(title="AI 问答 API")
# 定义请求体
class QuestionRequest(BaseModel):
question: str
@app.get("/")
def read_root():
return {"status": "ok", "message": "AI API is running"}
@app.post("/ask")
def ask_question(request: QuestionRequest):
# 这里替换成你的 AI 逻辑
response = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": request.question}]
)
answer = response.choices[0].message.content
return {
"question": request.question,
"answer": answer
}
if name == "main":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
requirements.txt 把你项目依赖列进去:
fastapi>=0.100.0
uvicorn>=0.23.2
pydantic>=2.0.0
openai>=1.0.0
python-multipart>=0.0.6
第二步:编写 Dockerfile
Dockerfile 告诉 Docker 怎么打包你的镜像:
# 用官方 Python 基础镜像
FROM python:3.10-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 复制项目代码
COPY . .
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
.dockerignore 把不需要打包的文件排除掉,减小镜像体积:
pycache
*.pyc
*.pyo
*.pyd
.env
venv
.git
.gitignore
*.log
第三步:本地构建测试
构建镜像:
# 打标签叫 my-ai-app:v1
docker build -t my-ai-app:v1 .
运行容器测试:
docker run -d \
-p 8000:8000 \
--name my-ai-app \
my-ai-app:v1
测试一下是否正常运行:
# 测试根路径
curl http://localhost:8000
# 应该返回 {"status": "ok", "message": "AI API is running"}
# 测试问答接口
curl -X POST http://localhost:8000/ask \
-H "Content-Type: application/json" \
-d '{"question": "你好"}'
打开浏览器访问 http://localhost:8000/docs,FastAPI 自动生成了 Swagger 文档,你可以在这里在线调试接口:
第四步:推送到镜像仓库(可选)
如果你要部署到其他服务器,可以把镜像推到 Docker Hub 或者阿里云镜像服务:
# 打标签
docker tag my-ai-app:v1 your-username/my-ai-app:v1
# 推送
docker push your-username/my-ai-app:v1
第五步:服务器上线
在服务器上拉取镜像然后运行:
# 拉取镜像
docker pull your-username/my-ai-app:v1
# 运行
docker run -d \
-p 8000:8000 \
--restart always \
--name my-ai-app \
your-username/my-ai-app:v1
--restart always 让容器随服务器启动自动重启,很方便。
用 Nginx 反向代理(可选)
如果你有域名,想通过 HTTPS 访问,加一层 Nginx 反向代理:
/etc/nginx/sites-available/ai-api.your-domain.com:
server {
listen 80;
server_name ai-api.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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
启用配置:
sudo ln -s /etc/nginx/sites-available/ai-api.your-domain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
申请 SSL 证书(用 Let's Encrypt):
sudo certbot --nginx -d ai-api.your-domain.com
搞定,现在你可以通过 https://ai-api.your-domain.com 访问你的 AI 接口了。
避坑指南
坑 1:镜像体积太大,拉取慢
解决方法:
- 用 python:3.10-slim 基础镜像,比完整版本小很多
- .dockerignore 排除掉不需要的文件,比如 venv、.git
- 如果模型文件很大,可以考虑用数据卷挂载,不要打进镜像
坑 2:容器里能访问,宿主机器访问不了
原因:FastAPI 绑定地址错了,应该绑定 0.0.0.0 不是 127.0.0.1
解决:启动命令改成:
uvicorn main:app --host 0.0.0.0 --port 8000
坑 3:GPU 模型在容器里用不了 CUDA
如果你要运行本地大模型,需要用 NVIDIA Docker 而非普通 Docker:
解决:
- 1. 服务器装好 NVIDIA 驱动和 nvidia-docker2
- 2. 基础镜像用 nvidia/cuda:12.1.0-cudnn8-runtime-ubuntu22.04
- 3. 运行的时候加 --gpus all:
docker run -d --gpus all -p 8000:8000 my-ai-app:v1
坑 4:依赖安装慢
解决:Dockerfile 里换国内 pip 镜像:
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
坑 5:环境变量(比如 API Key)怎么放
不要把 API Key 写进 Docker 镜像,运行的时候传进去:
docker run -d \
-p 8000:8000 \
-e OPENAI_API_KEY=your-key-here \
--name my-ai-app \
my-ai-app:v1
代码里直接读就行:
import os
api_key = os.getenv("OPENAI_API_KEY")