从单机到团队:基于Docker Compose的Ollama+Open WebUI企业级部署实战
最近在帮几个中小型技术团队搭建内部AI对话平台时,我发现了一个普遍现象:大家往往从简单的单机测试开始,但当需要将服务扩展到团队共享时,就会遇到各种环境配置、资源管理和访问控制的问题。特别是那些还在使用CentOS 7这类稳定但软件源相对陈旧系统的团队,既要保证服务的稳定性,又要兼顾部署的便捷性,确实需要一套经过验证的解决方案。
经过多次实践和优化,我总结出了一套基于Docker Compose的完整部署方案,不仅解决了从单机到团队的平滑升级问题,还融入了GPU资源分配、Nginx反向代理、数据持久化等企业级功能。今天我就把这套方案分享出来,希望能帮助更多团队快速落地自己的AI应用。
1. 环境准备与系统优化
在CentOS 7上部署现代AI应用,首先要解决的是系统环境兼容性问题。很多团队遇到的第一个坑就是glibc版本过低——Ollama官方二进制包要求glibc 2.27以上,而CentOS 7默认只有2.17。与其冒险升级系统库(可能破坏yum等核心工具),不如直接采用Docker容器化方案,完美绕过环境依赖问题。
1.1 系统基础检查与资源评估
部署前,先用几个简单命令确认系统状态:
# 确认CentOS 7版本
cat /etc/redhat-release
# 检查CPU核心数(大模型推理依赖多核并行)
lscpu | grep "CPU(s):"
# 查看内存情况(7B量级模型至少需要4GB,建议8GB以上)
free -h
# 检查磁盘空间(模型文件通常数百MB到数GB)
df -h /var/lib/docker
注意:如果系统内存不足,可以考虑添加swap空间。对于16GB内存的服务器,我通常配置8GB的swap:
# 创建swap文件
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
1.2 Docker环境部署与优化
CentOS 7的默认yum源中Docker版本较旧,我们需要添加官方源:
# 安装必要依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker官方源(使用阿里云镜像加速)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装Docker CE
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
sudo docker --version
国内环境拉取镜像速度可能较慢,配置镜像加速器至关重要。我测试过多个镜像源,下面这个配置组合在实际项目中表现最稳定:
{
"registry-mirrors": [
"https://docker.1ms.run/",
"https://mirror.aliyuncs.com/",
"https://docker.mirrors.ustc.edu.cn/"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
将上述配置保存到/etc/docker/daemon.json,然后重启Docker服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证镜像源生效
docker info | grep -A 5 "Registry Mirrors"
1.3 Docker Compose安装
虽然可以通过docker-compose-plugin安装,但我更推荐独立安装方式,便于版本管理和离线部署:
# 下载最新稳定版(截至2025年1月为v2.24.5)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname%20-s)-$(uname%20-m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建软链接(兼容旧命令)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 验证安装
docker-compose --version
如果服务器无法访问GitHub,可以提前在能联网的机器下载好,然后通过scp传输到服务器。
2. Docker Compose编排架构设计
单容器部署简单,但缺乏扩展性和可维护性。Docker Compose让我们能够用声明式的方式定义整个服务栈,实现一键部署和统一管理。下面是我在实际项目中打磨出的生产级配置。
2.1 基础服务编排配置
创建项目目录并编写docker-compose.yml:
version: '3.8'
services:
ollama:
image: ollama/ollama:0.3.0
container_name: ollama
ports:
- "11434:11434"
volumes:
- ollama_data:/root/.ollama
- ./models:/models # 外部模型挂载点
environment:
- OLLAMA_HOST=0.0.0.0:11434
- OLLAMA_NUM_THREADS=${OLLAMA_THREADS:-4}
- OLLAMA_GPU=${OLLAMA_GPU:-0}
deploy:
resources:
limits:
cpus: '${OLLAMA_CPU_LIMIT:-4.0}'
memory: ${OLLAMA_MEM_LIMIT:-8G}
reservations:
memory: ${OLLAMA_MEM_RESERVE:-4G}
restart: unless-stopped
networks:
- ai-network
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "18089:8080"
volumes:
- webui_data:/app/backend/data
- ./uploads:/app/backend/data/uploads # 用户上传文件持久化
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY:-your-secret-key-change-me}
- ENABLE_SIGNUP=${ENABLE_SIGNUP:-false} # 生产环境建议关闭自助注册
depends_on:
- ollama
restart: unless-stopped
networks:
- ai-network
volumes:
ollama_data:
driver: local
webui_data:
driver: local
networks:
ai-network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
这个配置有几个关键设计点:
- 版本固定:明确指定Ollama版本(0.3.0),避免自动升级带来的不兼容问题
- 资源限制:通过deploy.resources限制容器资源使用,防止单个服务耗尽系统资源
- 环境变量配置:使用环境变量文件管理敏感配置,便于不同环境部署
- 独立网络:创建专用网络,增强服务隔离性和安全性
2.2 环境变量配置文件
创建.env文件管理配置参数:
# Ollama配置
OLLAMA_THREADS=8
OLLAMA_GPU=0 # 0=CPU only, 1=启用GPU
OLLAMA_CPU_LIMIT=6.0
OLLAMA_MEM_LIMIT=12G
OLLAMA_MEM_RESERVE=6G
# Open WebUI配置
WEBUI_SECRET_KEY=your-production-secret-key-here
ENABLE_SIGNUP=false
DEFAULT_MODEL=qwen:7b-chat
# 网络配置
WEBUI_PORT=18089
OLLAMA_PORT=11434
# 路径配置
MODELS_DIR=/data/ollama/models
UPLOADS_DIR=/data/webui/uploads
安全提示:
WEBUI_

232

被折叠的 条评论
为什么被折叠?



