Ollama: النشر الحاوي باستخدام دوكر

يحوّل دوكر Ollama إلى قطع ليغو — اسحب الصور، نسّق التوليفات، انشر بأمر واحد.

⚠️ ملاحظة: حاويات دوكر لا تحفظ البيانات افتراضيًا — حذف حاوية يفقد جميع ملفات النماذج (غالبًا عدة جيجابايت). يجب استخدام تحميل Volume (-v ollama_data:/root/.ollama) لحفظ بيانات النماذج على المضيف. يجب عدم حذف هذا أبدًا في الإنتاج.

📋 المتطلبات المسبقة: يجب أن تتقن أولاً ما يلي

1. ما ستتعلمه


2. قصة حقيقية من رائدة أعمال SaaS

(1) المشكلة: التثبيت اليدوي لـ Ollama على كل خادم

تحتاج Alice إلى نشر SupportBot على 3 خوادم، كل منها يتطلب تثبيت Ollama يدويًا، وسحب النماذج، وإعدادات البيئة. عدم اتساق الإصدارات، والتكوينات المفقودة، واختلافات البيئة تسبب مشاكل متنوعة.

(2) الحل: نشر دوكر بأمر واحد

BASH
# One command to run Ollama in container
docker run -d --gpus all -v ollama_data:/root/.ollama ollama/ollama

# Or with Docker Compose for full stack
docker compose up -d

3. صورة Ollama الرسمية

(1) متغيرات الصورة

الصورة الحجم الغرض
ollama/ollama ~800 ميجابايت وحدة المعالجة المركزية + GPU (اكتشاف تلقائي)
ollama/ollama:rocm ~1.2 جيجابايت AMD GPU فقط

(2) أوامر التشغيل الأساسية

السيناريو الأمر
وحدة المعالجة المركزية فقط docker run -d -p 11434:11434 ollama/ollama
NVIDIA GPU docker run -d --gpus all -p 11434:11434 ollama/ollama
تخزين دائم docker run -d -v ollama_data:/root/.ollama -p 11434:11434 ollama/ollama
منفذ مخصص docker run -d -p 8080:11434 ollama/ollama
100%
flowchart TD
    A[صورة ollama/ollama] --> B{GPU متاح؟}
    B -->|NVIDIA| C[nvidia-container-toolkit<br/>--gpus all]
    B -->|AMD| D[صورة rocm<br/>--device /dev/kfd]
    B -->|لا يوجد| E[وضع وحدة المعالجة المركزية فقط]
    C --> F[خادم Ollama :11434]
    D --> F
    E --> F

(1) ▶ مثال: تشغيل حاوية وحدة المعالجة المركزية

⚠️ تحذير: تشغيل حاوية بدون تحميل Volume (-v ollama_data:/root/.ollama) يخزن بيانات النماذج داخل الحاوية. بمجرد حذف الحاوية، تفقد جميع النماذج ويجب إعادة تنزيلها (غالبًا عدة جيجابايت). بيئات الإنتاج يجب تحميل تخزين دائم.

BASH
# Run Ollama in container (CPU mode)
docker run -d \
  --name ollama \
  -p 11434:11434 \
  -v ollama_data:/root/.ollama \
  ollama/ollama

# Verify it's running
docker ps | grep ollama

# Pull a model inside the container
docker exec ollama ollama pull qwen2.5

# Test the API
curl http://localhost:11434/api/tags

الإخراج:

TEXT
I'm a helpful AI assistant running locally on your machine...

4. إعدادات حاوية GPU

(1) متطلبات حاوية NVIDIA GPU المسبقة

الخطوة الأمر الوصف
1 تثبيت تعريفات NVIDIA nvidia-smi يجب أن يعمل
2 تثبيت nvidia-container-toolkit مطلوب لتمرير GPU
3 إعادة تشغيل دوكر sudo systemctl restart docker
4 التحقق من توفر GPU docker run --rm --gpus all nvidia/cuda:12.0.0-runtime-ubuntu22.04 nvidia-smi

(2) تثبيت nvidia-container-toolkit

المنصة أمر التثبيت
Ubuntu/Debian `curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey
CentOS/RHEL `curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo
إعدادات دوكر sudo nvidia-ctk runtime configure --runtime=docker && sudo systemctl restart docker

(2) ▶ مثال: تشغيل حاوية NVIDIA GPU

BASH
# Run Ollama with GPU support
docker run -d \
  --name ollama-gpu \
  --gpus all \
  -p 11434:11434 \
  -v ollama_data:/root/.ollama \
  ollama/ollama

# Verify GPU is visible inside container
docker exec ollama-gpu nvidia-smi

# Test GPU inference speed
docker exec ollama-gpu ollama run --verbose llama3.2 "Hello"

# Specify which GPUs to use
docker run -d \
  --gpus '"device=0,1"' \
  -p 11434:11434 \
  -v ollama_data:/root/.ollama \
  ollama/ollama

الإخراج:

TEXT
I'm a helpful AI assistant running locally on your machine...

(3) ▶ مثال: حاوية AMD ROCm

BASH
# Run Ollama with AMD GPU (ROCm)
docker run -d \
  --name ollama-rocm \
  --device /dev/kfd \
  --device /dev/dri \
  -p 11434:11434 \
  -v ollama_data:/root/.ollama \
  ollama/ollama:rocm

الإخراج:

TEXT
I'm a helpful AI assistant running locally on your machine...

5. تنسيق متعدد الخدمات باستخدام Docker Compose

💡 نصيحة: يمكن لـ Docker Compose تنسيق خدمات متعددة بأمر واحد (Ollama + Chroma + WebUI + FastAPI). استخدام healthcheck + depends_on.condition: service_healthy يضمن أن الخدمات التابعة جاهزة حقًا قبل بدء الخدمات النهائية، مما هو أكثر موثوقية من ترتيب البدء البسيط.

💡 نصيحة: healthcheck الخاص بـ Docker Compose + depends_on.condition: service_healthy يضمن أن الخدمات التابعة جاهزة حقًا قبل بدء الخدمات النهائية، مما هو أكثر موثوقية من ترتيب البدء البسيط. يحتاج Ollama لبضع ثوانٍ بعد البدء قبل أن يستطيع الاستجابة لطلبات API.

(1) بنية متعدد الخدمات نموذجية

100%
flowchart TD
    A[Nginx<br/>:80 وكيل عكسي] --> B[تطبيق FastAPI<br/>:8000]
    B --> C[Ollama<br/>:11434]
    B --> D[Chroma DB<br/>:8001 مخزن متجهي]
    C --> E[Volume النماذج]
    D --> F[Volume Chroma]

(2) قالب docker-compose.yml

الخدمة الصورة المنفذ التبعيات
ollama ollama/ollama 11434 وقت تشغيل GPU
webui open-webui/open-webui 3000 ollama
chroma chromadb/chroma 8000
app fastapi مخصص 8001 ollama, chroma

(4) ▶ مثال: إعدادات Docker Compose الكاملة

⚠️ تحذير: في إعدادات الإنتاج، OLLAMA_HOST=0.0.0.0:11434 يجعل Ollama يستمع على جميع واجهات الشبكة. هذا آمن داخل شبكة دوكر الداخلية، لكنه خطير للغاية إذا تم تعيين المنفذ إلى IP العام للمضيف. استخدم هذا دائمًا مع مصادقة Nginx أو قواعد الجدار الناري.

YAML
# docker-compose.yml
version: "3.8"

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    restart: unless-stopped

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    volumes:
      - webui_data:/app/backend/data
    depends_on:
      - ollama
    restart: unless-stopped

  chroma:
    image: chromadb/chroma
    container_name: chroma
    ports:
      - "8001:8000"
    volumes:
      - chroma_data:/chroma/chroma
    environment:
      - ANONYMIZED_TELEMETRY=FALSE
    restart: unless-stopped

volumes:
  ollama_data:
  webui_data:
  chroma_data:
BASH
# Start all services
docker compose up -d

# Pull model inside ollama container
docker exec ollama ollama pull qwen2.5
docker exec ollama ollama pull nomic-embed-text

# Check all services
docker compose ps

# View logs
docker compose logs -f ollama

الإخراج:

TEXT
[+] Running 4/4
 ✔ Network ollama_default  Created
 ✔ Container ollama        Started
 ✔ Container open-webui    Started
 ✔ Container chroma        Started

(1) مقارنة تحميل Volume

الطريقة الأمر الثبات الأداء
Volume مسمى -v ollama_data:/root/.ollama ✅ يُدار بواسطة دوكر جيد
تحميل ربط -v /data/ollama:/root/.ollama ✅ يُدار بواسطة المضيف الأفضل
tmpfs --tmpfs /root/.ollama ❌ الذاكرة الأسرع

(2) مقارنة أوضاع الشبكة

الوضع الأمر حالة الاستخدام الوصف
bridge افتراضي التواصل بين الحاويات يتطلب تعيين المنفذ
host --network host زمن انتقال منخفض يشارك شبكة المضيف
شبكة مخصصة docker network create mynet متعدد الخدمات حل DNS تلقائي

(5) ▶ مثال: Docker Compose بدرجة الإنتاج

YAML
# docker-compose.prod.yml
version: "3.8"

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - /data/ollama/models:/root/.ollama
    environment:
      - OLLAMA_HOST=0.0.0.0:11434
      - OLLAMA_KEEP_ALIVE=30m
      - OLLAMA_NUM_PARALLEL=4
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
        limits:
          memory: 16G
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
      interval: 30s
      timeout: 10s
      retries: 3

  app:
    build: ./app
    container_name: supportbot
    ports:
      - "8000:8000"
    environment:
      - OLLAMA_HOST=http://ollama:11434
    depends_on:
      ollama:
        condition: service_healthy
    restart: unless-stopped

networks:
  default:
    name: supportbot-net

الإخراج:

TEXT
# Verify configuration file syntax
docker compose config --quiet && echo "✅ Configuration file syntax is correct"
# Output: ✅ Configuration file syntax is correct

7. مثال شامل: نشر المكدس الكامل لـ SupportBot باستخدام دوكر

ℹ️ معلومة: حاوية init-models تستخدم نمط "مهمة لمرة واحدة" — تسحب النماذج المطلوبة تلقائيًا بعد نجاح فحص صحة Ollama، ثم تخرج. هذا يلغي الحاجة إلى الدخول يدويًا إلى الحاوية لتشغيل ollama pull، محققًا "نشر بأمر واحد" حقًا.

YAML
# ============================================
# Comprehensive: SupportBot full-stack Docker
# Ollama + FastAPI + Chroma + Open WebUI
# ============================================

# docker-compose.yml
version: "3.8"

services:
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - "11434:11434"
    volumes:
      - ollama_models:/root/.ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost:11434/api/tags || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 5
    restart: unless-stopped

  init-models:
    image: curlimages/curl
    container_name: init-models
    depends_on:
      ollama:
        condition: service_healthy
    command: >
      sh -c "
        curl -s http://ollama:11434/api/pull -d '{\"name\":\"qwen2.5\"}' &&
        curl -s http://ollama:11434/api/pull -d '{\"name\":\"nomic-embed-text\"}' &&
        curl -s http://ollama:11434/api/pull -d '{\"name\":\"llava\"}'
      "

  chroma:
    image: chromadb/chroma
    container_name: chroma
    ports:
      - "8001:8000"
    volumes:
      - chroma_data:/chroma/chroma
    environment:
      - ANONYMIZED_TELEMETRY=FALSE
    restart: unless-stopped

  supportbot:
    build:
      context: ./app
      dockerfile: Dockerfile
    container_name: supportbot
    ports:
      - "8000:8000"
    environment:
      - OLLAMA_HOST=http://ollama:11434
      - CHROMA_HOST=http://chroma:8000
      - EMBED_MODEL=nomic-embed-text
      - CHAT_MODEL=qwen2.5
    depends_on:
      ollama:
        condition: service_healthy
      chroma:
        condition: service_started
    restart: unless-stopped

  webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: webui
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    volumes:
      - webui_data:/app/backend/data
    depends_on:
      - ollama
    restart: unless-stopped

volumes:
  ollama_models:
  chroma_data:
  webui_data:
BASH
#!/bin/bash
# Deploy SupportBot stack

# Start all services
docker compose up -d

# Wait for Ollama to be healthy
echo "Waiting for Ollama to be ready..."
until curl -s http://localhost:11434/api/tags > /dev/null 2>&1; do
    sleep 2
done
echo "Ollama is ready!"

# Pull required models
docker exec ollama ollama pull qwen2.5
docker exec ollama ollama pull nomic-embed-text

# Verify all services
docker compose ps
echo "SupportBot stack deployed!"
echo "  Ollama API:  http://localhost:11434"
echo "  SupportBot:  http://localhost:8000"
echo "  WebUI:       http://localhost:3000"
echo "  Chroma:      http://localhost:8001"

الإخراج:

TEXT
Waiting for Ollama to be ready...
Ollama is ready!
NAME                IMAGE                              STATUS
ollama              ollama/ollama                      Up (healthy)
chroma              chromadb/chroma                    Up
supportbot          custom/app                         Up
webui               ghcr.io/open-webui/open-webui      Up
SupportBot stack deployed!
  Ollama API:  http://localhost:11434
  SupportBot:  http://localhost:8000
  WebUI:       http://localhost:3000
  Chroma:      http://localhost:8001

❓ أسئلة شائعة

س هل استنتاج GPU داخل حاويات دوكر أبطأ من التثبيت المباشر؟
ج لا يجب أن يكون هناك فرق في الظروف العادية. تحقق من: 1) هل --gpus all فعال؛ 2) هل nvidia-container-toolkit مثبت؛ 3) هل وقت تشغيل دوكر مُعد كـ nvidia.
س هل النماذج لا تزال موجودة بعد إعادة تشغيل الحاوية؟
ج إذا قمت بتحميل Volume على /root/.ollama، فإن بيانات النماذج دائمة ومحفوظة. بدون Volume، تفقد النماذج ويجب إعادة سحبها.
س كيف أدخل حاوية لتشغيل أوامر ollama؟
ج استخدم docker exec -it ollama bash أو docker exec ollama ollama pull model_name للعمل داخل الحاوية.
س هل يضمن depends_on الخاص بـ Docker Compose جاهزية الخدمة؟
ج لا. depends_on يضمن فقط ترتيب البدء. أضف healthcheck + condition: service_healthy لضمان أن الخدمات التابعة جاهزة حقًا.
س ما هو Open WebUI؟
ج واجهة ويب مفتوحة المصدر على طراز ChatGPT تتصل مباشرة بـ Ollama. مناسبة للمستخدمين غير التقنيين وللعروض التوضيحية. نشر دوكر بأمر واحد.
س كيف تتشارك حاويات متعددة GPU؟
ج استخدم --gpus all للسماح لجميع الحاويات بمشاركة GPU. يصطف Ollama الطلبات داخليًا. للعزل، استخدم --gpus '"device=0"' و--gpus '"device=1"' لتعيين وحدات GPU مختلفة.

📖 ملخص


📝 تمارين

  1. أساسي (⭐): شغّل حاوية Ollama باستخدام دوكر، واسحب نموذجًا، واختبر محادثة عبر API.
  2. متوسط (⭐⭐): اكتب إعدادات Docker Compose لبدء Ollama + Open WebUI، وأكمل محادثة في WebUI.
  3. متقدم (⭐⭐⭐): انشر المكدس الكامل لـ SupportBot (Ollama + FastAPI + Chroma + WebUI)، ونفذ أسئلة وأجوبة بتوليد معزز بالاسترجاع، وتحقق من الثبات.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%