Docker: ما هو Docker؟

يضمن Docker تشغيل التطبيقات بنفس الطريقة تمامًا في أي بيئة — فهو يحزم "الكود + التبعيات + الإعدادات" في حاوية محمولة، مما يضع حدًا لكابوس "إنها تعمل على جهازي".

1. ما ستتعلمه



2. قصة حقيقية لمطور خلفية

(1) نقطة الألم: كوارث ناتجة عن بيئات غير متسقة

أليس مطورة خلفية. على الرغم من أن مشروعها يعمل بسلاسة على جهازها المحلي، إلا أنها تواجه باستمرار مشكلة "إنها تعمل على جهازي": بيئات Ubuntu لدى زملائها تفتقد التبعيات، وإصدارات المكتبات على خادم الاختبار CentOS غير صحيحة، وبيئة الإنتاج Red Hat تتطلب إعادة تجميع. كل عملية نشر تبدو وكأنها مقامرة — ثلاث بيئات، خمس جولات من التصحيح، ويومان ضائعان في "إعدادات البيئة" بدلاً من كتابة الكود.

(2) الحل باستخدام Docker

أوصاها بوب باستخدام Docker: "بأمر واحد فقط، سيعمل التطبيق بنفس الطريقة تمامًا على أي نظام Linux."

BASH
# ابنِ مرة واحدة، وشغّل في أي مكان
docker build -t myapp:1.0 .
docker run -d -p 8080:80 myapp:1.0

(3) الفائدة: الاتساق البيئي

بعد أن حزمت أليس التطبيق في صورة Docker، تم استخدام نفس الصورة لتشغيل التطبيق في البيئات الثلاث — التطوير والاختبار والإنتاج — مما قلل وقت النشر من يومين إلى 10 دقائق وأزال جميع المشكلات المتعلقة بالبيئة.



3. ما هي تقنية الحاويات؟

تقنية الحاويات هي تقنية محاكاة افتراضية خفيفة الوزن تقوم بحزم التطبيق وجميع تبعياته في بيئة تشغيل معزولة، مما يضمن تنفيذًا متسقًا على أي بنية تحتية.

100%
graph TB
    A["النشر التقليدي<br/>تطبيق + نظام تشغيل + عتاد"] --> B["المحاكاة الافتراضية<br/>تطبيق + نظام تشغيل ضيف + مراقب افتراضي + نظام تشغيل مضيف"]
    B --> C["الحاويات<br/>تطبيق + محرك حاويات + نظام تشغيل مضيف"]
    C --> D["أخف · أسرع · أكثر اتساقًا"]

(1) المفهوم الأساسي لتقنية الحاويات

(2) لماذا تُسمى "حاويات"؟

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

البُعد حاوية النقل حاوية Docker
التوحيد القياسي أبعاد موحدة (20/40 قدمًا) تنسيق صورة موحد (معيار OCI)
العزل لا تداخل بين الحمولات عزل العمليات/الشبكة/نظام الملفات
قابلية النقل يمكن نقلها بالسفينة أو القطار أو الشاحنة تعمل في بيئات التطوير والاختبار والإنتاج
كفاءة عالية لا حاجة لتفريغ الحمولة وتغيير المركبة لا حاجة لإعادة تثبيت التبعيات


4. الحاويات مقابل الآلات الافتراضية

توفر كل من الحاويات والآلات الافتراضية بيئات معزولة، لكنها تُنفذ بطرق مختلفة تمامًا.

100%
graph TB
    subgraph VM["بنية الآلة الافتراضية"]
        VM_APP1["تطبيق 1"] --> VM_OS1["نظام تشغيل ضيف"]
        VM_APP2["تطبيق 2"] --> VM_OS2["نظام تشغيل ضيف"]
        VM_OS1 --> VM_H["مراقب افتراضي"]
        VM_OS2 --> VM_H
        VM_H --> VM_HOST["نظام تشغيل مضيف"]
        VM_HOST --> VM_HW["العتاد"]
    end
    subgraph CT["بنية الحاوية"]
        CT_APP1["تطبيق 1"] --> CT_APP2["تطبيق 2"]
        CT_APP2 --> CT_CE["محرك الحاويات<br/>Docker"]
        CT_CE --> CT_KERNEL["نواة نظام التشغيل المضيف"]
        CT_KERNEL --> CT_HW["العتاد"]
    end

(1) مقارنة الفروق الرئيسية

البُعد الآلة الافتراضية (VM) الحاوية
مستوى العزل عزل على مستوى العتاد (نواة منفصلة) عزل على مستوى العملية (نواة مشتركة)
سرعة البدء دقائق (لتشغيل نظام التشغيل بالكامل) ثوانٍ (لبدء عملية)
استخدام الموارد مستوى الجيجابايت (بما في ذلك نظام التشغيل الضيف) مستوى الميجابايت (تبعيات التطبيق فقط)
حجم الصورة 1–20 جيجابايت 5–500 ميجابايت
العبء على الأداء 5–15% (عبء المحاكاة الافتراضية) ≈0% (قريب من الأداء الأصلي)
الكثافة 5–10 آلات افتراضية لكل جهاز 100–1,000 حاوية لكل جهاز

(2) مقارنة حالات الاستخدام

السيناريو الآلة الافتراضية موصى بها الحاوية موصى بها
يتطلب أنوية أنظمة تشغيل مختلفة ✅ (مثلاً: Windows و Linux يعملان بالتوازي)
الخدمات المصغرة/التطبيقات عديمة الحالة ✅ (خفيفة، توسع سريع)
متطلبات أمان بعزل قوي ✅ (عزل على مستوى النواة) ⚠️ (يتطلب تحصينًا إضافيًا)
بيئة بناء CI/CD ✅ (تبدأ وتتوقف في ثوانٍ)
اتساق بيئة التطوير ✅ (الصورة هي البيئة)
تشغيل تطبيقات GUI التقليدية ⚠️ (يتطلب إعدادات إضافية)
💡 نصيحة: الحاويات ليست بديلاً عن الآلات الافتراضية، بل هي تقنية مكملة. استخدم الآلات الافتراضية للسيناريوهات التي تتطلب عزلًا كاملاً للنواة، والحاويات للعزل على مستوى التطبيق.



5. بنية Docker

يستخدم Docker بنية العميل-الخادم ويتكون من ثلاثة مكونات أساسية.

100%
graph TB
    CLI["عميل Docker<br/>docker build/run/pull"]
    CLI -->|REST API| D["خادم Docker الخلفي<br/>dockerd"]
    D -->|pull/push| R["مستودع Docker<br/>Docker Hub / خاص"]
    D -->|create/start| C["الحاويات<br/>نسخ قيد التشغيل"]
    D -->|build/cache| I["الصور<br/>قوالب للقراءة فقط"]
    I -->|docker run| C
    R -->|docker pull| I

(1) شرح مفصل للبنية ثلاثية الطبقات

المكون الوظيفة الأوامر الشائعة
عميل Docker واجهة سطر الأوامر التي يستخدمها المستخدمون للتفاعل مع Docker docker run / docker build / docker pull
خادم Docker الخلفي خدمة خلفية تدير الصور والحاويات والشبكات ووحدات التخزين systemctl start docker / dockerd
مستودع Docker مستودع لتخزين وتوزيع الصور docker pull / docker push

(2) العلاقة بين الصور والحاويات

الصورة هي قالب للقراءة فقط، والحاوية هي نسخة قيد التشغيل من الصورة. للتشبيه بالبرمجة كائنية التوجه:

المفهوم التشبيه بـ OOP الوصف
الصورة الصنف (Class) قالب للقراءة فقط يحدد كل ما هو مطلوب لتشغيل التطبيق
الحاوية الكائن (Instance) حالة التشغيل للصورة؛ قابلة للقراءة والكتابة؛ لها دورة حياة
Dockerfile الكود المصدري ملف تعليمات لبناء الصور

(3) معيار OCI

يلتزم Docker بمعيار OCI (مبادرة الحاويات المفتوحة) لضمان قابلية نقل الحاويات:

📌 نقطة أساسية: يعني معيار OCI أن الصور المبنية باستخدام Docker يمكن تشغيلها أيضًا على محركات حاويات أخرى، مثل Podman و containerd.



6. حالات الاستخدام الرئيسية لـ Docker

(1) نظرة عامة على السيناريوهات

السيناريو الوصف مثال
توحيد بيئة التطوير بيئة تطوير موحدة للفريق يمكن للأعضاء الجدد إعداد مجموعة التطوير الكاملة في 10 دقائق
نشر الخدمات المصغرة كل خدمة تعمل في حاويتها الخاصة API وقاعدة البيانات وذاكرة التخزين المؤقت كل منها في حاوية منفصلة
خط أنابيب CI/CD بيئة بناء متسقة وقابلة للتكرار GitHub Actions + Docker للنشر الآلي
التوسع السريع نسخ تبدأ/تتوقف في ثوانٍ 1←10 نسخ أثناء ذروة المرور، 10←1 خارج أوقات الذروة
تحويل التطبيقات القديمة إلى حاويات ترحيل التطبيقات القديمة دون تعديل حزم مشروع PHP 5.4 من عام 2015 في حاوية

(2) عملية بدء تشغيل الحاوية

عند تشغيل docker run hello-world، تحدث الخطوات التالية داخل Docker:

100%
graph LR
    A["docker run<br/>hello-world"] --> B{"هل توجد صورة<br/>محلية؟"}
    B -->|لا| C["docker pull<br/>تنزيل من المستودع"]
    B -->|نعم| D["إنشاء حاوية<br/>طبقة قابلة للكتابة"]
    C --> D
    D --> E["بدء الحاوية<br/>تنفيذ CMD"]
    E --> F["عرض النتائج<br/>Hello from Docker!"]


7. تجربة عملية مع Docker

▶ مثال: تشغيل "hello-world" (الصعوبة: ⭐)

أبسط طريقة لتجربة Docker — التحقق من تثبيت Docker بشكل صحيح.

BASH
# تنزيل وتشغيل صورة hello-world
docker run hello-world
💻 المخرجات:

TEXT 📖 للعرض فقط
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
e6590344b1a5: Pull complete
Digest: sha256:7be1...2c2d
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

▶ مثال: عرض معلومات إعدادات Docker (الصعوبة: ⭐)

يعرض docker info الإعدادات الكاملة لخادم Docker الخلفي.

BASH
# عرض معلومات Docker على مستوى النظام
docker info
💻 المخرجات (مقتطف):

TEXT 📖 للعرض فقط
Client: Docker Engine - Community
 Version:    24.0.7
 Context:    default

Server:
 Containers: 3
  Running: 1
  Paused: 0
  Stopped: 2
 Images: 5
 Server Version: 24.0.7
 Storage Driver: overlay2
 Kernel Version: 5.15.0-91-generic
 Operating System: Ubuntu 22.04

▶ مثال: تصفح فئات أوامر Docker (الصعوبة: ⭐)

تصنف واجهة أوامر Docker حسب كائنات الإدارة لتسهيل الحفظ.

BASH
# عرض جميع أوامر إدارة Docker
docker --help
💻 المخرجات (مقتطف):

TEXT 📖 للعرض فقط
Management Commands:
  builder     Manage builds
  container   Manage containers
  image       Manage images
  network     Manage networks
  volume      Manage volumes
  system      Manage Docker

Commands:
  run         Create and run a new container
  ps          List containers
  images      List images
  build       Build an image from a Dockerfile
  pull        Pull an image from a registry

▶ مثال: تجربة تشغيل خادم الويب Nginx (الصعوبة: ⭐⭐)

ابدأ خادم ويب بأمر Docker واحد — لا حاجة لتثبيت Nginx.

BASH
# تشغيل Nginx في وضع الخلفية، ربط المنفذ 8080 بالمنفذ 80 للحاوية
docker run -d -p 8080:80 --name my-nginx nginx:latest

# التحقق من أن الحاوية قيد التشغيل
docker ps
💻 المخرجات:

TEXT 📖 للعرض فقط
CONTAINER ID   IMAGE          STATUS         PORTS                  NAMES
a1b2c3d4e5f6   nginx:latest   Up 10 seconds  0.0.0.0:8080->80/tcp   my-nginx

افتح متصفحك وانتقل إلى http://localhost:8080 لرؤية صفحة ترحيب Nginx.

▶ مثال: عرض قائمة الحاويات قيد التشغيل (الصعوبة: ⭐)

BASH
# عرض جميع الحاويات قيد التشغيل
docker ps

# عرض جميع الحاويات (بما في ذلك المتوقفة)
docker ps -a
💻 المخرجات:

TEXT 📖 للعرض فقط
CONTAINER ID   IMAGE           STATUS                    PORTS       NAMES
a1b2c3d4e5f6   nginx:latest    Up 5 minutes              8080->80    my-nginx
f7e8d9c0b1a2   hello-world     Exited (0) 3 minutes ago              hungry_einstein
⚠️ ملاحظة: تخرج حاوية hello-world تلقائيًا بعد التشغيل (الحالة: Exited). هذا ليس خطأ — إنها حاوية توضيحية مصممة للخروج بمجرد انتهاء التشغيل.



8. التحقق من إصدار Docker وتثبيته

(1) نظام إصدارات Docker

الإصدار التموضع وتيرة التحديث حالات الاستخدام
Docker Desktop إصدار سطح المكتب للمطورين تحديثات ربع سنوية بيئة تطوير Windows / Mac
Docker Engine إصدار الخادم تحديثات ربع سنوية بيئة إنتاج Linux
Docker CE الإصدار المجتمعي (مجاني) تحديث مستمر الأفراد والفرق الصغيرة
Docker EE الإصدار المؤسسي (مدفوع) تحديث مستمر الشركات الكبيرة + دعم تجاري

(2) التحقق من نجاح التثبيت

BASH
# التحقق من إصدارات عميل وخادم Docker
docker version

# تحقق سريع: تشغيل hello-world
docker run hello-world

إذا عرض docker version معلومات كل من العميل (Client) والخادم (Server)، فهذا يعني أن التثبيت تم بنجاح.



9. مثال كامل: دليل خطوة بخطوة للبدء مع Docker

BASH
# ============================================
# شرح كامل: أول تجربة مع Docker
# يغطي: التحقق من الإصدار، info، run، ps، التنظيف
# ============================================

# 1. التحقق من تثبيت Docker وتشغيله
docker version

# 2. عرض معلومات نظام Docker
docker info

# 3. تشغيل حاوية hello-world (تنزيل أولاً ثم تشغيل)
docker run hello-world

# 4. تشغيل خادم ويب Nginx
docker run -d -p 8080:80 --name web nginx:latest

# 5. عرض الحاويات قيد التشغيل
docker ps

# 6. إيقاف وإزالة حاوية Nginx
docker stop web
docker rm web

# 7. عرض جميع الحاويات (بما في ذلك المتوقفة)
docker ps -a

# 8. تنظيف: إزالة حاوية hello-world المتوقفة
docker rm $(docker ps -a -q --filter "ancestor=hello-world")
💻 المخرجات (مقتطف):

TEXT 📖 للعرض فقط
# docker version
Client: Docker Engine - Community
 Version:    24.0.7
Server: Docker Engine - Community
 Version:    24.0.7

# docker run hello-world
Hello from Docker!

# docker ps (أثناء تشغيل Nginx)
CONTAINER ID   IMAGE          STATUS         PORTS                  NAMES
a1b2c3d4e5f6   nginx:latest   Up 10 seconds  0.0.0.0:8080->80/tcp   web

❓ أسئلة شائعة

س ما الفرق بين Docker و VirtualBox؟
ج VirtualBox يحاكي نظام تشغيل كامل (بما في ذلك النواة)، ويستغرق دقائق للتشغيل، ويستهلك جيجابايت من الموارد. Docker يشارك نواة المضيف ويعزل العمليات فقط؛ يبدأ في ثوانٍ ويستهلك ميجابايت من الموارد. Docker أخف وأسرع، لكنه لا يدعم تشغيل حاويات Windows على مضيف Linux (والعكس صحيح).
س هل تشغل الحاوية نظام تشغيل؟
ج لا. الحاويات تشارك نواة المضيف؛ ليس لديها نواة خاصة بها. "Ubuntu" داخل الحاوية هو مجرد مجموعة من أدوات مساحة المستخدم (مثل bash و apt)، وليس نظام تشغيل كامل. هذا هو السبب الأساسي في أن الحاويات أخف من الآلات الافتراضية.
س هل يمكن استخدام Docker فقط على Linux؟
ج تعتمد حاويات Docker على ميزات نواة Linux (namespaces/cgroups)، لذا تعمل بشكل أصلي على Linux. Docker Desktop على Windows و Mac يشغل الحاويات بشكل غير مباشر من خلال آلات افتراضية Linux مدمجة (WSL2/Hypervisor)، وهذا شفاف بالنسبة للمستخدم.
س كيف أثبت Docker على Windows؟
ج ثبّت Docker Desktop for Windows؛ سيستخدم تلقائيًا WSL2 كخلفية. يتطلب ذلك Windows 10 64-bit (الإصدار 1903 أو أحدث) مع تفعيل WSL2. بعد التثبيت، افتح Docker Desktop وشغّل docker run hello-world في الطرفية للتحقق من أنه يعمل.
س هل يمكن للحاويات تسريب بيانات المضيف؟
ج افتراضيًا، لا. تستخدم الحاويات namespaces في Linux لعزل أنظمة الملفات والشبكات والعمليات، لذا لا يمكنها الوصول مباشرة إلى ملفات المضيف. ما لم يتم تركيب دليل مضيف بشكل صريح (باستخدام المعامل -v)، تكون الحاويات معزولة عن المضيف. ومع ذلك، فإن تشغيل حاوية بخيار --privileged يكسر هذا العزل؛ يجب تعطيله في بيئات الإنتاج.
س ما العلاقة بين Docker و Kubernetes؟
ج Docker هو محرك تشغيل حاويات (مسؤول عن بناء وتشغيل الحاويات الفردية)، بينما Kubernetes هو منصة تنسيق حاويات (مسؤولة عن إدارة جدولة وتوسع وإصلاح مئات أو آلاف الحاويات). يستخدم K8s containerd (محرك تشغيل منشق عن Docker) لتشغيل الحاويات ولم يعد يعتمد مباشرة على Docker.
س هل أحتاج إلى معرفة Linux لتعلم Docker؟
ج ستحتاج إلى مهارات أساسية في سطر أوامر Linux (ls، cd، mkdir، cat، grep)، لكنك لست بحاجة إلى أن تكون خبيرًا في Linux. العمليات الأساسية لـ Docker تُنفذ جميعها باستخدام الأمر docker. يبدأ هذا البرنامج التعليمي من الصفر، وسيتم شرح أي مفاهيم Linux ضرورية أثناء التقدم.

📖 ملخص


📝 تمارين

  1. تمرين أساسي (الصعوبة: ⭐): ثبّت Docker Desktop وشغّل docker run hello-world، ثم التقط لقطة شاشة أو انسخ المخرجات.
  2. تمرين متقدم (الصعوبة: ⭐⭐): شغّل docker info لعرض إعدادات Docker المحلية، وسجّل قيم الحقول الثلاثة: عدد الحاويات، Storage Driver، وإصدار النواة (Kernel Version).
  3. سؤال تحدي (الصعوبة: ⭐⭐⭐): اذكر ثلاث مزايا وثلاث عيوب لكل من الحاويات والآلات الافتراضية، واشرح في أي سيناريوهات يجب اختيار الحاويات وفي أي سيناريوهات يجب اختيار الآلات الافتراضية.
Web-Tutorial.com

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

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

100%