Docker 打包与部署
- [一、Docker 介绍](#一、Docker 介绍)
- 二、我们要做什么
- 三、项目结构
- [四、第一步:写 requirements.txt(必须)](#四、第一步:写 requirements.txt(必须))
- [五、第二步:写 Dockerfile(核心)](#五、第二步:写 Dockerfile(核心))
- [六、第三步:你的 main.py(RAG + FastAPI)](#六、第三步:你的 main.py(RAG + FastAPI))
- [七、第四步:构建 Docker 镜像(本地)](#七、第四步:构建 Docker 镜像(本地))
- 八、第五步:本地运行测试
- 九、第六步:部署到服务器(最关键)
-
- [1. 把项目文件夹传到服务器](#1. 把项目文件夹传到服务器)
- [2. 服务器里执行构建(同上)](#2. 服务器里执行构建(同上))
- [3. 后台启动](#3. 后台启动)
- [4. 访问(服务器IP + 端口)](#4. 访问(服务器IP + 端口))
- [十、Docker 常用命令](#十、Docker 常用命令)
一、Docker 介绍
Docker = 把你的代码 + 环境 + 依赖全部打包成一个"压缩包"(镜像)
- 在哪都能跑
- 不用装 Python、不用装库
- 服务器/本地/云端完全一致
- 答辩、部署、展示零环境问题
二、我们要做什么
把你之前的 RAG 文档问答 + FastAPI 接口 打包成 Docker,部署到服务器,任何人都能调用。
三、项目结构
your_project/
├── main.py # 你的 FastAPI + RAG/Agent 代码
├── requirements.txt # 依赖清单
└── Dockerfile # 打包配置(我们写)
四、第一步:写 requirements.txt(必须)
创建文件 requirements.txt,写入:
fastapi
uvicorn
langchain
langchain-openai
langchain-community
chromadb
pypdf
python-multipart
beautifulsoup4
requests
huggingface-hub
五、第二步:写 Dockerfile(核心)
创建文件 Dockerfile(无后缀),直接复制:
dockerfile
# 1. 基础 Python 环境
FROM python:3.11-slim
# 2. 设置工作目录
WORKDIR /app
# 3. 复制依赖文件
COPY requirements.txt .
# 4. 安装依赖
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 5. 复制全部代码
COPY . .
# 6. 暴露端口
EXPOSE 8000
# 7. 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
六、第三步:你的 main.py(RAG + FastAPI)
python
# main.py
from fastapi import FastAPI, UploadFile, File
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
import tempfile
import os
app = FastAPI(title="RAG 文档问答 API")
# 配置 LLM
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.1,
api_key="你的API_KEY",
base_url="https://api.chatanywhere.tech/v1"
)
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh")
vector_store = None
# 1. 上传文档构建知识库
@app.post("/upload")
async def upload(files: list[UploadFile] = File(...)):
global vector_store
docs = []
for file in files:
suffix = file.filename.split(".")[-1]
with tempfile.NamedTemporaryFile(delete=False, suffix=f".{suffix}") as tmp:
tmp.write(await file.read())
loader = PyPDFLoader(tmp.name)
docs.extend(loader.load())
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
vector_store = Chroma.from_documents(chunks, embeddings)
return {"status": "ok", "chunks": len(chunks)}
# 2. 提问接口
@app.get("/ask")
def ask(question: str):
if not vector_store:
return {"answer": "请先上传文档"}
qa = RetrievalQA.from_chain_type(
llm=llm,
retriever=vector_store.as_retriever(search_kwargs={"k": 3})
)
return {"answer": qa.run(question)}
# 3. 健康检查
@app.get("/")
def home():
return {"status": "running", "project": "RAG Docker 部署"}
七、第四步:构建 Docker 镜像(本地)
进入项目目录,运行:
bash
docker build -t rag-app .
等待 2--5 分钟,构建完成!
八、第五步:本地运行测试
bash
docker run -d -p 8000:8000 rag-app
打开浏览器访问:
- 👉 http://localhost:8000/docs
API 界面直接出现!
九、第六步:部署到服务器(最关键)
1. 把项目文件夹传到服务器
2. 服务器里执行构建(同上)
bash
docker build -t rag-app .
3. 后台启动
bash
docker run -d \
--restart always \
-p 8000:8000 \
--name rag-app \
rag-app
4. 访问(服务器IP + 端口)
http://你的服务器IP:8000/docs
部署完成!全世界都能调用你的 AI 接口!
十、Docker 常用命令
bash
docker build -t 名字 . # 构建镜像
docker run -d -p 8000:8000 名字 # 运行
docker ps # 查看运行中容器
docker logs 容器ID # 查看日志
docker stop 容器ID # 停止
docker restart 容器ID # 重启