Skip to content

以下是使用 docker-compose 部署 Ollama 的完整方案,适用于 麒麟服务器(Kylin OS) 或其他 Linux 系统,可避免 GLIBCXX 依赖问题:


1. 安装 Docker 和 Docker-Compose

(1)安装 Docker

bash
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker

(2)安装 Docker-Compose

bash
sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version  # 验证安装
sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version  # 验证安装

2. 创建 docker-compose.yml 文件

yaml
version: '3.8'

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"  # Ollama 默认端口
    volumes:
      - ./ollama_data:/root/.ollama  # 持久化模型数据
    restart: unless-stopped
    environment:
      - OLLAMA_HOST=0.0.0.0  # 允许外部访问
    deploy:
      resources:
        limits:
          cpus: '4'  # 限制 CPU 核心数
          memory: 16G  # 限制内存
version: '3.8'

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"  # Ollama 默认端口
    volumes:
      - ./ollama_data:/root/.ollama  # 持久化模型数据
    restart: unless-stopped
    environment:
      - OLLAMA_HOST=0.0.0.0  # 允许外部访问
    deploy:
      resources:
        limits:
          cpus: '4'  # 限制 CPU 核心数
          memory: 16G  # 限制内存

关键配置说明

  • volumes:将模型数据持久化到本地目录 ./ollama_data,避免容器重启后丢失。
  • resources:根据服务器资源调整 CPU 和内存限制(如 qwen2.5vl:32b 需要至少 16GB 内存)。
  • OLLAMA_HOST=0.0.0.0:允许通过 IP 访问 Ollama API。

3. 启动 Ollama 服务

bash
docker-compose up -d  # 后台运行
docker-compose up -d  # 后台运行

查看日志:

bash
docker-compose logs -f
docker-compose logs -f

4. 使用 Ollama

(1)进入容器交互模式:

bash
docker exec -it ollama ollama run qwen2.5vl:32b
docker exec -it ollama ollama run qwen2.5vl:32b

(2)通过 HTTP API 调用:

bash
curl http://localhost:11434/api/generate -d '{
  "model": "qwen2.5vl:32b",
  "prompt": "你好,介绍一下你自己"
}'
curl http://localhost:11434/api/generate -d '{
  "model": "qwen2.5vl:32b",
  "prompt": "你好,介绍一下你自己"
}'

5. 管理模型

(1)下载新模型:

bash
docker exec -it ollama ollama pull llama3
docker exec -it ollama ollama pull llama3

(2)列出已下载模型:

bash
docker exec -it ollama ollama list
docker exec -it ollama ollama list

6. 高级配置(可选)

(1)GPU 加速(需 NVIDIA 驱动和 nvidia-container-toolkit

修改 docker-compose.yml

yaml
services:
  ollama:
    runtime: nvidia  # 启用 GPU 支持
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
services:
  ollama:
    runtime: nvidia  # 启用 GPU 支持
    environment:
      - NVIDIA_VISIBLE_DEVICES=all

(2)自定义模型存储路径

yaml
volumes:
  - /data/ollama:/root/.ollama  # 指定绝对路径
volumes:
  - /data/ollama:/root/.ollama  # 指定绝对路径

7. 常见问题解决

问题1:端口冲突

如果 11434 端口被占用,修改 docker-compose.yml 中的端口映射:

yaml
ports:
  - "11435:11434"  # 主机端口:容器端口
ports:
  - "11435:11434"  # 主机端口:容器端口

问题2:权限错误

确保数据目录可写:

bash
mkdir -p ./ollama_data
chmod 777 ./ollama_data
mkdir -p ./ollama_data
chmod 777 ./ollama_data

8. 卸载 Ollama

bash
docker-compose down  # 停止服务
rm -rf ./ollama_data  # 删除模型数据(谨慎操作!)
docker-compose down  # 停止服务
rm -rf ./ollama_data  # 删除模型数据(谨慎操作!)

方案优势

  1. 隔离依赖:完全绕过系统 libstdc++ 版本问题。
  2. 一键启停:通过 docker-compose 统一管理服务。
  3. 持久化存储:模型数据保存在本地,升级容器不影响已有模型。
  4. 资源可控:可限制 CPU/内存,避免服务器过载。

如果需要更复杂的配置(如多模型负载均衡),可以进一步扩展 docker-compose.yml

您的服务器已正确安装 NVIDIA 驱动(v570.172.08)和 CUDA 12.8,并且检测到 RTX A6000 GPU。现在只需正确配置 NVIDIA Container Toolkit 即可让 Docker 容器使用 GPU 加速运行 Ollama。


完整解决方案

1. 安装 NVIDIA Container Toolkit

bash
# 添加 NVIDIA 仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

# 安装工具包
sudo yum install -y nvidia-container-toolkit

# 配置 Docker 使用 NVIDIA 运行时
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# 添加 NVIDIA 仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

# 安装工具包
sudo yum install -y nvidia-container-toolkit

# 配置 Docker 使用 NVIDIA 运行时
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

2. 验证 NVIDIA 运行时是否生效

bash
docker info | grep -i runtime
docker info | grep -i runtime

输出应包含 nvidia,例如:

Runtimes: nvidia runc
Runtimes: nvidia runc

3. 修正 docker-compose.yml

yaml
version: "3.9"
services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ./ollama/data:/root/.ollama
    restart: always
    environment:
      - NVIDIA_VISIBLE_DEVICES=all  # 允许容器访问所有 GPU
      - OLLAMA_HOST=0.0.0.0        # 开放 API 访问
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1              # 使用 1 块 GPU
              capabilities: [gpu]   # 启用 GPU 支持
version: "3.9"
services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ./ollama/data:/root/.ollama
    restart: always
    environment:
      - NVIDIA_VISIBLE_DEVICES=all  # 允许容器访问所有 GPU
      - OLLAMA_HOST=0.0.0.0        # 开放 API 访问
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1              # 使用 1 块 GPU
              capabilities: [gpu]   # 启用 GPU 支持

关键改动

  • 移除 privileged: true(除非必要,否则不安全)。
  • 移除 runtime: nvidia(已通过全局配置生效)。
  • 添加 deploy.resources 显式声明 GPU 资源(兼容性更好)。

4. 启动服务并验证 GPU

bash
docker-compose up -d
docker exec -it ollama nvidia-smi
docker-compose up -d
docker exec -it ollama nvidia-smi

应输出与宿主机相同的 GPU 信息(RTX A6000)。


常见问题排查

问题1:nvidia-ctk 命令未找到

bash
sudo yum reinstall nvidia-container-toolkit
sudo yum reinstall nvidia-container-toolkit

问题2:麒麟系统兼容性

如果报错 libnvidia-container not compatible with Kylin,需手动安装适配版本:

bash
# 下载麒麟适配的包(需从厂商获取)
wget https://example.com/kylin/nvidia-container-toolkit.rpm
sudo rpm -ivh nvidia-container-toolkit.rpm
# 下载麒麟适配的包(需从厂商获取)
wget https://example.com/kylin/nvidia-container-toolkit.rpm
sudo rpm -ivh nvidia-container-toolkit.rpm

问题3:Ollama 未使用 GPU

在容器内运行:

bash
docker exec -it ollama bash
ollama run qwen2.5vl:32b
docker exec -it ollama bash
ollama run qwen2.5vl:32b

输入 /info 检查是否显示 GPU 信息。


性能优化建议

  1. 启用 CUDA 加速
    确保模型加载时显示 Using CUDA GPU
  2. 限制 GPU 内存
    docker-compose.yml 中添加:
    yaml
    environment:
      - NVIDIA_DRIVER_CAPABILITIES=compute,utility
      - NVIDIA_REQUIRE_CUDA="cuda>=12.8"
    environment:
      - NVIDIA_DRIVER_CAPABILITIES=compute,utility
      - NVIDIA_REQUIRE_CUDA="cuda>=12.8"
  3. 多 GPU 分配
    修改 count: 1 为实际 GPU 数量。

最终验证

bash
# 查看容器日志
docker-compose logs -f ollama

# 测试模型推理速度
curl http://localhost:11434/api/generate -d '{
  "model": "qwen2.5vl:32b",
  "prompt": "GPU 是否正常工作?"
}'
# 查看容器日志
docker-compose logs -f ollama

# 测试模型推理速度
curl http://localhost:11434/api/generate -d '{
  "model": "qwen2.5vl:32b",
  "prompt": "GPU 是否正常工作?"
}'

如果响应速度显著快于 CPU 模式,则 GPU 加速成功!