Ollama: النشر الحاوي باستخدام دوكر
يحوّل دوكر Ollama إلى قطع ليغو — اسحب الصور، نسّق التوليفات، انشر بأمر واحد.
⚠️ ملاحظة: حاويات دوكر لا تحفظ البيانات افتراضيًا — حذف حاوية يفقد جميع ملفات النماذج (غالبًا عدة جيجابايت). يجب استخدام تحميل Volume (
-v ollama_data:/root/.ollama) لحفظ بيانات النماذج على المضيف. يجب عدم حذف هذا أبدًا في الإنتاج.
📋 المتطلبات المسبقة: يجب أن تتقن أولاً ما يلي
- الدرس 2: تثبيت Ollama وإعداد البيئة
1. ما ستتعلمه
- تفاصيل صورة Ollama الرسمية
- إعدادات حاوية GPU: nvidia-container-toolkit
- تنسيق متعدد الخدمات باستخدام Docker Compose
- التخزين الدائم وتحميل Volume
- إعدادات الشبكة والتواصل بين الحاويات
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 |
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) بنية متعدد الخدمات نموذجية
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 مختلفة.📖 ملخص
- صورة Ollama الرسمية تدعم الاكتشاف التلقائي لوحدة المعالجة المركزية وGPU
- NVIDIA GPU يتطلب nvidia-container-toolkit ومعامل
--gpus all - Docker Compose ينسق Ollama + WebUI + Chroma + خدمات التطبيق
- Volumes المسمية تحفظ بيانات النماذج؛ تحميلات الربط توفر إدارة مسار مرنة
- فحوصات الصحة تضمن أن الخدمات التابعة جاهزة حقًا قبل بدء الخدمات النهائية
- استخدمت Alice Docker Compose لنشر المكدس الكامل لـ SupportBot بأمر واحد
📝 تمارين
- أساسي (⭐): شغّل حاوية Ollama باستخدام دوكر، واسحب نموذجًا، واختبر محادثة عبر API.
- متوسط (⭐⭐): اكتب إعدادات Docker Compose لبدء Ollama + Open WebUI، وأكمل محادثة في WebUI.
- متقدم (⭐⭐⭐): انشر المكدس الكامل لـ SupportBot (Ollama + FastAPI + Chroma + WebUI)، ونفذ أسئلة وأجوبة بتوليد معزز بالاسترجاع، وتحقق من الثبات.