Docker والحاويات: من الصفر إلى النشر الاحترافي
Docker أحدث ثورة في عالم تطوير البرمجيات ونشر التطبيقات. يسمح لك بتغليف تطبيقك مع جميع تبعياته في حاوية (Container) موحدة تعمل على أي نظام. في هذا الدليل الشامل، سنتعلم كل ما تحتاجه لإتقان Docker من التثبيت حتى النشر الاحترافي في الإنتاج.
تقنية الحاويات - ثورة في عالم تطوير ونشر التطبيقات
🔍 الجزء الأول: ما هي الحاويات ولماذا Docker؟
1.1 الفرق بين الحاويات والآلات الافتراضية
الحاويات تختلف جذرياً عن الآلات الافتراضية (VMs). بينما تحتاج VM إلى نظام تشغيل كامل، الحاوية تشارك نواة نظام التشغيل المضيف، مما يجعلها:
- أخف وزناً: حجمها MBs بدلاً من GBs.
- أسرع: تبدأ في ثوانٍ بدلاً من دقائق.
- أكثر كفاءة: استهلاك أقل للذاكرة والمعالج.
- محمولة: تعمل على أي نظام يدعم Docker.
الفرق بين الحاويات والآلات الافتراضية في البنية والأداء
1.2 مكونات Docker الأساسية
Docker Engine
البرنامج الأساسي الذي يدير الحاويات على جهازك.
Image
قالب للقراءة فقط يحتوي على التطبيق والتبعيات.
Container
نسخة قابلة للتنفيذ من الـ Image.
Dockerfile
ملف نصي يحتوي على تعليمات بناء الـ Image.
Docker Hub
مستودع مركزي للـ Images الجاهزة.
Volume
تخزين دائم للبيانات خارج الحاوية.
🚀 الجزء الثاني: التثبيت والإعداد الأولي
2.1 تثبيت Docker على مختلف الأنظمة
🪟 نظام Windows
قم بتنزيل Docker Desktop for Windows من الموقع الرسمي. يتطلب:
- Windows 10/11 Pro أو Enterprise (64-bit)
- تفعيل Hyper-V و WSL 2
- 4GB RAM كحد أدنى (8GB موصى به)
# تحقق من التثبيت
docker --version
docker run hello-world 🐧 نظام Linux (Ubuntu)
# تحديث النظام
sudo apt update
# تثبيت المتطلبات
sudo apt install ca-certificates curl gnupg
# إضافة مفتاح GPG الرسمي
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# إضافة المستودع
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# تثبيت Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
# إضافة المستخدم لمجموعة docker (لتجنب sudo)
sudo usermod -aG docker $USER
# التحقق
docker --version 🍎 نظام macOS
قم بتنزيل Docker Desktop for Mac من الموقع الرسمي. يتطلب macOS 11 أو أحدث.
2.2 الإعدادات الموصى بها
# تمكين Docker عند بدء التشغيل (Linux)
sudo systemctl enable docker
sudo systemctl start docker
# التحقق من حالة الخدمة
sudo systemctl status docker
# عرض معلومات النظام
docker info تثبيت Docker على مختلف الأنظمة - خطوات بسيطة لبدء العمل
📦 الجزء الثالث: العمل مع الـ Images
3.1 تنزيل Images من Docker Hub
# تنزيل Image (مثال: Nginx)
docker pull nginx
# تنزيل Image بإصدار محدد
docker pull nginx:alpine
# تنزيل Image من Docker Hub
docker pull python:3.11-slim
# عرض جميع الـ Images المحلية
docker images
docker image ls
# عرض معلومات Image
docker inspect nginx 3.2 البحث عن Images
# البحث عن Images
docker search nginx
docker search python
# البحث مع تصفية النتائج
docker search --filter is-official=true python 3.3 إدارة Images
# حذف Image
docker rmi nginx
# حذف جميع Images غير المستخدمة
docker image prune -a
# حفظ Image كملف
docker save -o nginx.tar nginx
# تحميل Image من ملف
docker load -i nginx.tar
# إعادة تسمية Image
docker tag nginx:latest my-nginx:v1 إدارة Images - تنزيل، بحث، وحفظ الحاويات الجاهزة
🎯 الجزء الرابع: تشغيل وإدارة الحاويات
4.1 تشغيل حاوية بسيطة
# تشغيل حاوية Nginx
docker run nginx
# تشغيل في الخلفية (Detached mode)
docker run -d nginx
# تشغيل مع تعيين اسم
docker run -d --name my-nginx nginx
# تشغيل مع تعيين منفذ
docker run -d -p 8080:80 nginx
# تشغيل مع متغير بيئة
docker run -d -e MYSQL_ROOT_PASSWORD=secret mysql
# تشغيل مع Volume
docker run -d -v /host/path:/container/path nginx 4.2 إدارة الحاويات
# عرض الحاويات العاملة
docker ps
# عرض جميع الحاويات (بما فيها المتوقفة)
docker ps -a
# إيقاف حاوية
docker stop my-nginx
# بدء حاوية متوقفة
docker start my-nginx
# إعادة تشغيل
docker restart my-nginx
# حذف حاوية
docker rm my-nginx
# حذف جميع الحاويات المتوقفة
docker container prune
# الدخول إلى حاوية
docker exec -it my-nginx bash
# عرض السجلات (Logs)
docker logs my-nginx
docker logs -f my-nginx # متابعة مباشرة 4.3 مراقبة الأداء
# عرض استخدام الموارد
docker stats
# عرض تفاصيل حاوية
docker inspect my-nginx
# عرض العمليات داخل الحاوية
docker top my-nginx إدارة الحاويات - تشغيل، إيقاف، ومراقبة الأداء
🛠️ الجزء الخامس: بناء Images مخصصة
5.1 كتابة Dockerfile
مثال على Dockerfile لتطبيق Node.js:
# استخدام Image أساسي
FROM node:18-alpine
# تعيين مجلد العمل
WORKDIR /app
# نسخ package files
COPY package*.json ./
# تثبيت التبعيات
RUN npm ci --only=production
# نسخ الكود
COPY . .
# تعريض المنفذ
EXPOSE 3000
# أمر التشغيل
CMD ["node", "server.js"] 5.2 بناء Image من Dockerfile
# بناء Image
docker build -t my-app .
# بناء مع تحديد Dockerfile
docker build -t my-app -f Dockerfile.prod .
# بناء بدون cache
docker build --no-cache -t my-app .
# عرض سجل البناء
docker build --progress=plain -t my-app . 5.3 أفضل ممارسات Dockerfile
• استخدم Images رسمية ومحدثة
• قلل عدد الطبقات (Layers) بدمج الأوامر
• استخدم .dockerignore لاستبعاد الملفات غير الضرورية
• استخدم Alpine Images للحجم الأصغر
• لا تخزن أسرار (Secrets) في Image
• استخدم USER غير root للأمان
بناء Images مخصصة - كتابة Dockerfile احترافي
🔄 الجزء السادس: Docker Compose للتطبيقات المتعددة
6.1 ما هو Docker Compose؟
Docker Compose أداة لتعريف وتشغيل تطبيقات متعددة الحاويات باستخدام ملف YAML واحد.
6.2 كتابة docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
depends_on:
- db
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data: 6.3 أوامر Docker Compose
# بدء الخدمات
docker-compose up
# بدء في الخلفية
docker-compose up -d
# إيقاف الخدمات
docker-compose down
# عرض الحالة
docker-compose ps
# عرض السجلات
docker-compose logs -f
# إعادة بناء
docker-compose up --build
# تنفيذ أمر في خدمة
docker-compose exec web bash Docker Compose - إدارة تطبيقات متعددة الحاويات بسهولة
💾 الجزء السابع: إدارة البيانات والتخزين
7.1 أنواع التخزين في Docker
Volumes
تخزين مُدار بواسطة Docker، الأفضل للإنتاج.
Bind Mounts
ربط مجلد من المضيف، مثالي للتطوير.
tmpfs
تخزين مؤقت في الذاكرة فقط.
7.2 العمل مع Volumes
# إنشاء Volume
docker volume create my-volume
# عرض Volumes
docker volume ls
# فحص Volume
docker volume inspect my-volume
# حذف Volume
docker volume rm my-volume
# حذف Volumes غير المستخدمة
docker volume prune
# استخدام Volume
docker run -d -v my-volume:/data nginx 7.3 نسخ احتياطي للبيانات
# نسخ احتياطي
docker run --rm -v my-volume:/source -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /source .
# استعادة
docker run --rm -v my-volume:/target -v $(pwd):/backup alpine tar xzf /backup/backup.tar.gz -C /target 🌐 الجزء الثامن: الشبكات في Docker
8.1 أنواع الشبكات
# عرض الشبكات
docker network ls
# إنشاء شبكة
docker network create my-network
# تشغيل حاوية في شبكة
docker run -d --network my-network --name web nginx
# ربط حاوية بشبكة
docker network connect my-network my-container
# فصل حاوية عن شبكة
docker network disconnect my-network my-container 8.2 التواصل بين الحاويات
الحاويات في نفس الشبكة يمكنها التواصل باستخدام أسماء الحاويات كـ DNS:
# إنشاء شبكة
docker network create app-network
# تشغيل قاعدة البيانات
docker run -d --network app-network --name db postgres
# تشغيل التطبيق (يمكنه الاتصال بـ db)
docker run -d --network app-network --name app my-app الشبكات في Docker - تواصل آمن بين الحاويات
🚀 الجزء التاسع: النشر في الإنتاج
9.1 تحسين Images للإنتاج
# Multi-stage build
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"] 9.2 الأمان في الإنتاج
• لا تشغل كـ root داخل الحاوية
• استخدم Secrets Management (لا تضع كلمات مرور في Images)
• حدّث Images بانتظام
• استخدم Security Scanning
• قلل الصلاحيات (Capabilities)
9.3 Docker Swarm (Orchestration)
# تهيئة Swarm
docker swarm init
# نشر خدمة
docker service create --name web --replicas 3 -p 80:80 nginx
# عرض الخدمات
docker service ls
# تحديث خدمة
docker service update --image nginx:alpine web
# Scale خدمة
docker service scale web=5 🛠️ الجزء العاشر: نصائح وحلول للمشاكل الشائعة
10.1 مشاكل شائعة وحلولها
الحاوية تتوقف فوراً
الحل: تأكد أن العملية الرئيسية (PID 1) تبقى عاملة.
مشاكل صلاحيات الملفات
الحل: استخدم USER مناسب أو عدل الصلاحيات.
الحاوية تستهلك موارد كثيرة
الحل: استخدم --memory و --cpus لتحديد الموارد.
فشل الاتصال بين الحاويات
الحل: تأكد أنها في نفس الشبكة واستخدم الأسماء.
10.2 تنظيف Docker
# تنظيف شامل (احذر!)
docker system prune -a --volumes
# تنظيف Images غير مستخدمة
docker image prune -a
# تنظيف الحاويات المتوقفة
docker container prune
# تنظيف Volumes غير مستخدمة
docker volume prune
# عرض استخدام القرص
docker system df النشر في الإنتاج - تحسين، أمان، وإدارة الحاويات
💡 الخلاصة الهندسية الشاملة:
- ✅ الحاويات أخف وأسرع من VMs - استخدمها لتطوير ونشر أسرع.
- ✅ Dockerfile جيد = Images أصغر وأكثر أماناً.
- ✅ Compose يسهل إدارة التطبيقات المتعددة.
- ✅ Volumes ضرورية للحفاظ على البيانات.
- ✅ الأمان في الإنتاج ليس خياراً - اتبع أفضل الممارسات.
- ✅ المراقبة والتنظيف المستمر يحافظ على أداء النظام.
Docker ليس مجرد أداة، بل منهجية عمل حديثة! ✨