一句话总结:三个容器、一个 compose 文件,就能搭出「模型本地跑、界面像 ChatGPT、知识库有地方存」的环境。这篇给可直接粘贴的配置、拉模型和建知识库的顺序,以及五个必然踩到的坑。
先说这套东西解决什么。你可能有这几个需求:不想把公司文档传到别人服务器、想离线用、想随便换模型测效果、想给团队一个统一入口。
现有的选择要么太重(Kubernetes + vLLM + 向量库),要么太散(Ollama 命令行 + 自己写脚本)。Compose 这套刚好在中间:一条命令起来,一条命令停掉。
前置
- Docker Desktop(Windows/macOS)或 docker + compose 插件(Linux)
- 内存 8GB 起步,16GB 舒服(模型权重吃内存)
- 有 NVIDIA 显卡的话装 Container Toolkit,能快好几倍
- 磁盘留 30GB 以上(模型很占地方)
检查一下环境:
docker --veRSIon
docker compose version
三个服务,各管一件事
| 服务 | 镜像 | 端口 | 作用 |
|---|---|---|---|
| ollama | ollama/ollama | 11434 | 模型运行时,提供 OpenAI 兼容接口 |
| open-webui | ghcr.io/open-webui/open-webui:main | 8080 | 聊天界面、知识库、多模型切换 |
| db | pgvector/pgvector:pg17 | 5432 | 存向量,给知识库做检索 |
docker-compose.yml:
services:
ollama:
image: ollama/ollama
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
restart: unless-stopped
# 有 N 卡时取消下面注释
# deploy:
# resources:
# reseRVAtions:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "8080:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- DATABASE_URL=postgresql://ai:ai_pass@db:5432/ai
- WEBUI_SECRET_KEY=换成你自己的随机串
volumes:
- webui_data:/app/backend/data
depends_on:
- ollama
- db
restart: unless-stopped
db:
image: pgvector/pgvector:pg17
container_name: pgvector
environment:
- POSTGRES_USER=ai
- POSTGRES_PASSWORD=ai_pass
- POSTGRES_DB=ai
volumes:
- pg_data:/var/lib/postgresql/data
restart: unless-stopped
volumes:
ollama_data:
webui_data:
pg_data:
三个卷是重点。没有卷,docker compose down 一次模型和对话记录全没了,这是新手最常见的损失。
WEBUI_SECRET_KEY 记得换掉,它决定登录会话的加密。
起服务与拉模型
docker compose up -d
docker compose ps # 三个都是 running 才对
拉模型走 Ollama 容器内部:
docker exec -it ollama ollama pull qwen3:4b
docker exec -it ollama ollama list
模型选多大要看机器。8GB 内存建议 4B 量化版(约 2.5GB),16GB 可以上 7B 到 9B(约 5GB)。别一上来拉 32B,加载会直接 OOM。
验证运行时通不通:
curl http://localhost:11434/API/tags
curl http://localhost:11434/api/generate -d '{"model":"qwen3:4b","prompt":"说一句话","stream":false}'
两条都返回 JSON 就说明模型层没问题。
建知识库前先开扩展
这一步最容易漏。pgvector 镜像只装了扩展文件,数据库里还得手动执行一次 CREATE EXTENSION,否则建向量表会报类型不存在。
docker exec -it pgvector psql -U ai -d ai -c "CREATE EXTENSION IF NOT EXISTS vector;"
docker exec -it pgvector psql -U ai -d ai -c "\dx"
看到 vector 出现在扩展列表里就对了。
之后打开 http://localhost:8080,注册第一个账号(第一个注册的账号自动成为管理员),进「工作空间 → 知识库 → 新建」,上传文档即可。
配置上的几个判断
为什么用 Open WebUI 而不是自己写前端? 因为它已经做了你要的大部分事:多模型切换、对话历史、文档上传、RAG 检索、用户管理。省下的时间够你把模型调好。
为什么接 pgvector 而不是用内置的向量存储? 如果只是自己用,内置的够。多人共用、文档量大、想自己查向量数据时,独立数据库更好管。
要不要加 vLLM? 单人用不必。vLLM 的优势是并发吞吐,本地这套的瓶颈是模型加载和内存,换 vLLM 收益有限,还多一层复杂度。
能对外提供服务吗? 别直接把 8080 暴露到公网。这套配置没有 TLS、没有限流、默认密码策略也弱。要给团队用,前面加一层反向代理和身份认证。
坑清单
坑一:忘了挂卷,重启后模型全丢。 重新拉一遍 5GB 权重,网速慢的话一晚上就过去了。配置里那三个 volumes 是保命的。
坑二:pgvector 没建扩展就上传文档。 表现是知识库一直转圈或者报 500,容器日志里有 type "vector" does not exist。
坑三:Windows 上 WSL2 内存吃满。 默认 WSL 最多用一半物理内存,模型加载时容易触发 OOM 杀进程。在 %UserProfile%\.wslconfig 里限制:
[wsl2]
memory=12GB
swap=4GB
坑四:GPU 没直通,速度差十倍。 有 N 卡但没装 Container Toolkit 时,Ollama 会静默用 CPU。判断方法:docker exec -it ollama ollama ps 看 PROCESSOR 列是 GPU 还是 100% CPU。
坑五:端口冲突。 11434、8080、5432 都是常用端口。本机已有 PostgreSQL 的话 5432 会起不来,改成 "5433:5432" 即可(容器内端口不变)。
图 1:WebUI 只做界面与编排,模型和向量各在自己的容器里
FAQ
必须用 Docker 吗?
不必须,但强烈建议。直接装在宿主机上会污染 Python 环境,换模型版本时容易互相打架。
数据真的不出本机吗?
用这套配置是的,所有请求都在本机容器网络内。前提是你没有在 WebUI 里额外配置外部 API。
能跑多大模型?
取决于内存和显存。参考值:8GB 内存到 4B(量化),16GB 到 9B,32GB 到 14B 到 32B 之间。显存够的话优先用 GPU。
和 LM Studio 比怎么样?
LM Studio 更简单(点几下就好),但只有单人单机。Compose 这套适合多人共用、需要知识库、需要长期运行的场景。
怎么备份?
三个卷对应三份数据。docker run --rm -v ollama_data:/data -v $(pwd):/backup alpine tar czf /backup/ollama.tgz -C /data . 这类命令可以打包,但更省事的做法是记住模型列表,需要时重拉。
结语
这套栈的价值不是「省钱」,是把试错成本降到几乎为零。想试新模型,拉下来切一下;想试新的 RAG 策略,重建知识库就行。
把基础设施做轻,才有精力做真正的活儿。
参考资料
- Ollama 官方文档 - 容器部署与 API 参考
- Open WebUI 文档 - Docker 部署与环境变量
- pgvector 仓库 - 安装扩展与索引类型
- 本站 sqlite-vec 本地语义搜索 - 更轻量的替代方案
- 参考资料

发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。