背景
本机为windows环境,并且已经安装了ollama,并将ollama的guff大模型保存在本地:D:\OllamaModels,下面为两个文件夹blobs和manifests,同时安装了WSL2并且有docker环境。
目标:要使用ollama docker的方式启动调用模型,并调用模型回答问题
配置
进入wsl环境,拉取ollama 镜像:docker pull ollama/ollama
启动ollama docker 并挂在本地已经下载的ollama模型:
docker run -d -v /mnt/d/OllamaModels/:/root/.ollama -p 11434:11434 --name my_ollama ollama/ollama
验证:
查看绑定的模型列表:docker exec -it my_ollama ollama list
测试调用api:curl http://localhost:11434/api/tags
查看日志:docker logs my_ollama
进入容器:docker exec -it my_ollama /bin/sh
检查容器内服务状态:docker exec my_ollama ps aux | grep ollama
注意:
1. docker run 命令要在wsl环境中运行,所以路径要使用Linux的。
2. 之前本机安装ollama,下载的模型文件blobs和manifests直接放在了D:\OllamaModels下,但是ollama docker挂在模型路径要将这两个文件夹放在D:\OllamaModels下models文件夹内才能识别到,即需要在D:\OllamaModels下新建一个models文件夹,同时可修改环境变量中OLLAMA_MODELS修改为D:\OllamaModels\models,这样本机启动ollama也可以识别到之前的模型了,在ollama设置中也要修改。

调用测试
新建测试文件夹:

生成docker-compose.yaml启动文件
版本一:
services:
ollama:
image: ollama/ollama
container_name: my_ollama
volumes: # 挂载你的本地模型目录
- /mnt/d/OllamaModels:/root/.ollama
ports:
- "11434:11434"
restart: unless-stopped
deploy:
resources: # 启用 GPU 支持(可选,无 GPU 可删除)
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
healthcheck: # 确保服务就绪后才标记为健康
test: ["CMD", "curl", "-f", "http://localhost:11434"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60sb
版本二
services:
ollama:
image: ollama/ollama
container_name: my_ollama
volumes: # 挂载你的本地模型目录
- /mnt/d/OllamaModels:/root/.ollama
ports:
- "11434:11434"
restart: unless-stopped
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
healthcheck: # 确保服务就绪后才标记为健康
test: ["CMD", "curl", "-f", "http://localhost:11434"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
两种配置都能启用 GPU,但底层机制、兼容性和适用场景不同:
runtime: nvidia
```yaml
services:
ollama:
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
```
- **作用**:直接告诉 Docker "这个容器用 nvidia 运行时启动"
- **等价命令**:`docker run --runtime=nvidia ...`
- **特点**:
- 由 `nvidia-container-toolkit` 提供运行时支持
- 容器内自动挂载 NVIDIA 驱动、CUDA 库
- 配置简单,兼容性好
deploy.resources.reservations.devices
```yaml
services:
ollama:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
```
- **作用**:声明"这个服务需要 GPU 资源",由 Docker 调度分配
- **等价命令**:`docker run --gpus all ...`
- **特点**:
- 基于 Docker 的 Generic Resource 机制
- 支持更精细的 GPU 选择(如指定 UUID、数量)
- 是 Docker 官方推荐的标准方式
- 但在 WSL2 中有时因运行时配置问题报错
推荐用法
开发/测试环境(WSL2、单节点)
```yaml
services:
ollama:
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
```
生产环境 / 多 GPU 精细控制
```yaml
services:
ollama:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1 # 只分配 1 张 GPU
device_ids: ["0"] # 指定 GPU 0
capabilities: [gpu]
```
兼容两种写法
```yaml
services:
ollama:
# 优先使用标准方式,失败时回退
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
# 环境变量确保 GPU 可见
environment:
- NVIDIA_VISIBLE_DEVICES=all
```
WSL2 环境用 `runtime: nvidia` 更稳定,如迁移到纯 Linux 服务器,可以改用标准方式。
代码测试
import json
import requests
OLLAMA_URL = "http://localhost:11434"
def chat(model: str, message: str, system: str = "") -> str:
"""调用 Ollama 聊天接口"""
payload = {
"model": model,
"messages": [],
"stream": False,
"options": {
"temperature": 0.7,
"num_predict": 512
}
}
if system:
payload["messages"].append({"role": "system", "content": system})
payload["messages"].append({"role": "user", "content": message})
response = requests.post(f"{OLLAMA_URL}/api/chat", json=payload)
response.raise_for_status()
return response.json()["message"]["content"]
model_name = "qwen3:8b"
# 聊天模式
answer = chat(
model=model_name,
message="Docker 和 Kubernetes 有什么区别?",
system="你是一个云计算专家,用简洁的中文回答"
)
print("=== 聊天模式 ===")
print(answer)

341

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



