🐳
Docker & Containers
تغليف التطبيقات في حاويات محمولة وقابلة للتكرار. ثورة في طريقة بناء ونشر البرمجيات.
متوسط
Open Source
أساس Kubernetes
📖 ما هو Docker؟
الحاويات (Containers)
Docker يتيح لك تغليف التطبيق مع كل اعتمادياته (مكتبات، إعدادات، كود) في "حاوية" واحدة تعمل على أي نظام. بخلاف الآلات الافتراضية، الحاويات تشارك نفس نواة النظام أخف وأسرع.
📦
Image (الصورة)
قالب جاهز يحتوي التطبيق والاعتماديات. يُبنى من Dockerfile.
🏃
Container (الحاوية)
نسخة قيد التشغيل من الصورة. يمكن تشغيل عدة حاويات من صورة واحدة.
📋
Dockerfile
ملف نصي يحتوي تعليمات بناء الصورة خطوة بخطوة.
🎼
Docker Compose
ملف YAML لتشغيل عدة حاويات معاً كخدمة متكاملة.
🔧 الأوامر الأساسية
docker run -d -p 8080:80 --name myapp nginx
docker ps
docker ps -a
docker stop myapp
docker rm myapp
docker images
docker rmi nginx
docker logs -f myapp
docker exec -it myapp /bin/bash
📋 كتابة Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
docker build -t myapp:latest .
docker run -d -p 3000:3000 --name app myapp:latest
docker images myapp
⚠️
استخدم صور Alpine الصغيرة لتقليل الحجم. node:20-alpine أصغر بـ 10x من node:20.
🎼 Docker Compose
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DB_HOST=database
- DB_PASSWORD=secret
depends_on:
- database
volumes:
- ./src:/app/src
database:
image: postgres:16-alpine
environment:
- POSTGRES_PASSWORD=secret
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
pgdata:
docker compose up -d
docker compose ps
docker compose logs -f app
docker compose down
docker compose down -v
💾 Volumes و Networks
💿
Volumes (التخزين)
حفظ البيانات خارج الحاوية. تبقى حتى بعد حذف الحاوية. مثال: قواعد البيانات.
🔗
Networks (الشبكات)
عزل الحاويات عن بعضها. الحاويات في نفس الشبكة تتواصل بالأسماء.
docker volume create mydata
docker run -v mydata:/data nginx
docker network create mynet
docker run --network mynet --name web nginx
✅ أفضل الممارسات
🎯
1. استخدم صور Alpine لتقليل الحجم
2. استخدم Multi-stage builds للفصل بين البناء والتشغيل
3. لا تشغل الحاوية كـ root — استخدم USER
4. استخدم .dockerignore مثل .gitignore
5. ثبّت إصدارات محددة: node:20-alpine وليس node:latest
6. استخدم Docker Compose للبيئة المحلية