使用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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值