7.3 容器化与集群部署


7.3 容器化与集群部署

本节摘要:单机 Ollama 服务化之后,下一步是可复制、可弹性伸缩的部署形态。本节覆盖:官方镜像的单容器上手(重点是模型卷与 GPU 直通)、用 Docker Compose 固化整套拓扑、多实例加负载均衡的横向扩容思路,以及 K8s 环境的关键调度配置。

单容器:五分钟与五个坑

docker run -d --name ollama -p 11434:11434 -v ollama:/root/.ollama ollama/ollama # NVIDIA GPU 版本 docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 ollama/ollama

第一条命令跑通不难,难的是别踩这五个坑。坑一:不挂卷——容器一删模型全没,务必用具名卷或宿主目录挂 /root/.ollama。坑二:GPU 驱动与 nvidia-container-toolkit 缺失,容器里探测不到卡;宿主先跑 nvidia-smi,再装 toolkit 并 docker run --gpus=all nvidia-smi 验证。坑三:内网环境拉不动模型——-e HTTPS_PROXY=... 给容器配代理。坑四:忘了 OLLAMA_ORIGINS,网页前端 CORS 报错。坑五:容器内执行 ollama pull 要用 docker exec -it ollama ollama pull llama3,模型进的是卷,不是宿主目录(除非你挂的就是宿主目录)。

预热镜像也是常见诉求——构建阶段就把模型烧进镜像或初始化容器,服务起来即用:

FROM ollama/ollama # 启动后自动拉取(首次构建/启动时执行) COPY pull.sh /pull.sh ENTRYPOINT ["/bin/sh", "/pull.sh"]

Compose:把拓扑固化成文件

单容器之上的标准形态是 Compose:Ollama 之外再挂 Open WebUI,组成一个自带界面的小型服务栈:

services: ollama: image: ollama/ollama restart: unless-stopped volumes: - ./models:/root/.ollama deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] webui: image: ghcr.io/open-webui/open-webui:main restart: unless-stopped ports: ["3000:8080"] environment: - OLLAMA_BASE_URL=http://ollama:11434 volumes: - ./webui:/app/backend/data depends_on: [ollama]
docker compose up -d docker compose exec ollama ollama pull qwen2.5:7b # 浏览器打开 http://<host>:3000 即得带用户系统的聊天界面

这套组合适合十人级团队:模型在卷里持久化、界面与后端同栈升级、配置全在一个 YAML 里可版本管理。

横向扩容:多实例加调度

单实例对同一模型的解码是串行的(5.2 病症四),并发上来后的正解是"多实例 + 前置分发"。单机多卡或单卡多实例(小模型可行)用 Nginx 加 least_conn 分流:

upstream ollama_pool { least_conn; server 127.0.0.1:11434; server 127.0.0.1:11435; server 127.0.0.1:11436; } server { listen 8080; location / { proxy_pass http://ollama_pool; proxy_buffering off; proxy_read_timeout 3600s; } }
# 三个实例,各自常驻同一个模型,共享同一个模型目录省磁盘 for p in 11434 11435 11436; do docker run -d --gpus all -p $p:11434 \ -v /data/ollama:/root/.ollama \ -e OLLAMA_KEEP_ALIVE=-1 ollama/ollama done

要注意纯 round-robin 会打散"同一用户的连续对话"到不同实例——对话状态在调用方手里(4.2 节),所以任何实例都能接,但若你用了有状态组件(会话缓存、缓存前缀),就要按用户哈希做粘性路由。容量规划回到 5.1 的账:每个实例 = 一份权重 + 一份 KV 缓存,N 个实例就是 N 倍显存,卡不够时缩模型或缩并发,别硬开实例。

K8s 环境:调度与运维要点

已有 K8s 集群的团队,把 Ollama 做成 Deployment 需要照顾四件事。GPU 声明用 nvidia.com/gpu: 1 资源限制;模型用 PVC 或 hostPath 持久化并设置 readOnlyRootFilesystem 的例外;健康检查探针指向 GET /(返回 200 文本);模型预热用 initContainer 或 Job 提前 pull 到共享卷。社区还有 Ollama Operator 提供 OllamaModel CRD,把"拉取模型"变成声明式资源。无 GPU 的 K8s 节点上跑 CPU 实例做低负载嵌入任务,与 GPU 实例分区混部,也是常见的省资源做法。

运维清单收尾:容器日志接入采集(docker logs ollama 或 fluent-bit);镜像版本固定 digest 避免意外升级;模型卷纳入备份但注意 7.2 的数据定级;升级流程先滚动新实例再摘旧实例。至此,从单机到小集群的部署路径已经完整——最后一章看看围绕 Ollama 生长出的生态工具与它的未来走向。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U