本文记录一次从 Ollama 后端模型服务 到 Open WebUI 前端界面 的完整搭建过程,重点放在 Docker Compose 架构、数据卷持久化、模型管理与常见误区。文中已对主机名、IP、端口等私人信息做统一脱敏处理。
一、目标与前提
目标
- 在同一台 Linux 主机上:
- 运行 Ollama 作为本地大模型后端
- 运行 Open WebUI 作为 Web 访问入口
- 使用 Docker Compose 统一管理
- 模型数据持久化,容器重建不丢模型
- 仅对外暴露 WebUI 端口,Ollama 不直接暴露
前提环境
- Linux 主机
- Docker Engine(较新版本)
- Docker Compose v2+
- 足够的磁盘空间(7B 模型约 4.7GB)
二、关键概念澄清
在开始之前,先澄清几个容易混淆的点。
1️⃣ Ollama 版本 ≠ 模型大小
ollama/ollama:latest:运行时程序版本qwen2.5:7b:模型本体(7 Billion 参数)
二者是完全不同的层级,不要混为一谈。
2️⃣ 7B 是什么
- 7B = 70 亿参数
- 属于 CPU 可勉强运行、GPU 更佳 的模型级别
- 非常适合:
- Bash / Shell 脚本
- Python 运维脚本
- 日常辅助写代码
3️⃣ WebUI 与 Ollama 的关系
- Ollama:只提供 API(默认 11434)
- Open WebUI:前端 + 后端,调用 Ollama API
- 两者同主机部署时:
- 不需要暴露 Ollama 端口
- 使用 Docker 内部网络通信即可
三、Docker Compose 结构设计
设计原则
- Ollama 只在内部网络监听
- WebUI 对外暴露一个端口(供浏览器 / 反代使用)
- 模型数据、WebUI 数据全部持久化
四、最终 Docker Compose 配置(脱敏版)
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
# 外部端口不暴露,Ollama 仅供内部 WebUI 使用
# ports:
# - "<PUBLIC_PORT>:11434"
# 模型与配置持久化(模型不会丢)
volumes:
- ollama:/root/.ollama
# 可选:避免某些情况下的资源争抢
# deploy:
# resources:
# limits:
# memory: 10G
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
environment:
- OLLAMA_BASE_URL=http://ollama:11434
# 对外只暴露 WebUI 端口
ports:
- "<PUBLIC_PORT>:8080"
volumes:
- open-webui:/app/backend/data
depends_on:
- ollama
volumes:
ollama:
open-webui:
五、启动流程
1️⃣ 启动服务
docker compose up -d
确认两个容器均为 Up 状态。
2️⃣ 下载模型(重点)
模型必须通过运行中的 Ollama 容器下载,否则会报错。
docker compose exec ollama ollama pull qwen2.5:7b
下载完成后验证:
docker compose exec ollama ollama list
确认模型已存在。
3️⃣ 模型下载位置说明
- 模型数据实际存放在:
- Docker Volume:
ollama
- Docker Volume:
- 映射路径:
- 容器内:
/root/.ollama
- 容器内:
- 特点:
- 容器删除 ≠ 模型丢失
- 只要 volume 不删,模型永久保留
六、WebUI 访问与验证
1️⃣ 访问 WebUI
在浏览器中打开:
http://<HOST>:<PUBLIC_PORT>
首次访问通常会:
- 创建管理员账号
- 或直接进入聊天界面(视版本而定)
2️⃣ 确认模型已接入
在 WebUI 中:
- 打开模型选择下拉框
- 确认能看到:
qwen2.5:7b
这一步说明:
WebUI → Ollama → 模型 的链路完全打通
七、关于容器显示为 unhealthy
在 docker ps 中可能看到:
open-webui Up (...) (unhealthy)
说明:
- 这是 Docker healthcheck 判定偏严格
- 实际表现是:
- HTTP 已 200
- 页面可访问
- 模型可用
👉 不影响实际使用,可忽略
八、常见误区总结
❌ 使用 docker compose run 拉模型
- 会启动临时容器
- Ollama 服务未启动
- 容易报错
✅ 正确方式:
docker compose exec ollama ollama pull <model>
❌ 混淆端口职责
- Ollama 端口:给程序用
- WebUI 端口:给人用
同主机部署时:
只暴露 WebUI 即可
九、最终状态
至此,系统状态应为:
- ✅ Ollama 后端运行
- ✅ 7B 模型下载并持久化
- ✅ Open WebUI 可访问
- ✅ 前后端通信正常
后续可继续:
- 固定镜像版本(避免 latest 漂移)
- 接入反向代理 / HTTPS
- 增加更多模型