使用ollama docker调用大模型

背景

本机为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)