Docker: ما هو Docker؟
يضمن Docker تشغيل التطبيقات بنفس الطريقة تمامًا في أي بيئة — فهو يحزم "الكود + التبعيات + الإعدادات" في حاوية محمولة، مما يضع حدًا لكابوس "إنها تعمل على جهازي".
1. ما ستتعلمه
- الفرق الأساسي بين الحاويات والآلات الافتراضية
- بنية Docker ثلاثية الطبقات (العميل / الخادم الخلفي / المستودع)
- العلاقة بين الصور والحاويات
- حالات الاستخدام الرئيسية لـ Docker
- عملية بدء تشغيل الحاوية
2. قصة حقيقية لمطور خلفية
(1) نقطة الألم: كوارث ناتجة عن بيئات غير متسقة
أليس مطورة خلفية. على الرغم من أن مشروعها يعمل بسلاسة على جهازها المحلي، إلا أنها تواجه باستمرار مشكلة "إنها تعمل على جهازي": بيئات Ubuntu لدى زملائها تفتقد التبعيات، وإصدارات المكتبات على خادم الاختبار CentOS غير صحيحة، وبيئة الإنتاج Red Hat تتطلب إعادة تجميع. كل عملية نشر تبدو وكأنها مقامرة — ثلاث بيئات، خمس جولات من التصحيح، ويومان ضائعان في "إعدادات البيئة" بدلاً من كتابة الكود.
(2) الحل باستخدام Docker
أوصاها بوب باستخدام Docker: "بأمر واحد فقط، سيعمل التطبيق بنفس الطريقة تمامًا على أي نظام Linux."
# ابنِ مرة واحدة، وشغّل في أي مكان
docker build -t myapp:1.0 .
docker run -d -p 8080:80 myapp:1.0
(3) الفائدة: الاتساق البيئي
بعد أن حزمت أليس التطبيق في صورة Docker، تم استخدام نفس الصورة لتشغيل التطبيق في البيئات الثلاث — التطوير والاختبار والإنتاج — مما قلل وقت النشر من يومين إلى 10 دقائق وأزال جميع المشكلات المتعلقة بالبيئة.
3. ما هي تقنية الحاويات؟
تقنية الحاويات هي تقنية محاكاة افتراضية خفيفة الوزن تقوم بحزم التطبيق وجميع تبعياته في بيئة تشغيل معزولة، مما يضمن تنفيذًا متسقًا على أي بنية تحتية.
graph TB
A["النشر التقليدي<br/>تطبيق + نظام تشغيل + عتاد"] --> B["المحاكاة الافتراضية<br/>تطبيق + نظام تشغيل ضيف + مراقب افتراضي + نظام تشغيل مضيف"]
B --> C["الحاويات<br/>تطبيق + محرك حاويات + نظام تشغيل مضيف"]
C --> D["أخف · أسرع · أكثر اتساقًا"]
(1) المفهوم الأساسي لتقنية الحاويات
- البناء والنشر: تطبيق + تبعيات + إعدادات = صورة واحدة؛ أينما ذهبت الصورة، يذهب التطبيق
- عزل غير افتراضي: تشارك نواة المضيف؛ لا تحاكي نظام تشغيل كامل
- ابنِ مرة واحدة، وشغّل في أي مكان: يمكن استخدام الصور المبنية في بيئة التطوير مباشرة في بيئة الإنتاج
(2) لماذا تُسمى "حاويات"؟
فكّر في حاويات صناعة النقل: بغض النظر عما إذا كانت مليئة بالسيارات أو الملابس أو المواد الغذائية، فإن السفن والقطارات والشاحنات التي تنقلها لا تحتاج إلى معرفة ذلك — فهي ببساطة تنقل حاويات ذات حجم قياسي. حاويات Docker هي حاويات عالم البرمجيات:
| البُعد | حاوية النقل | حاوية Docker |
|---|---|---|
| التوحيد القياسي | أبعاد موحدة (20/40 قدمًا) | تنسيق صورة موحد (معيار OCI) |
| العزل | لا تداخل بين الحمولات | عزل العمليات/الشبكة/نظام الملفات |
| قابلية النقل | يمكن نقلها بالسفينة أو القطار أو الشاحنة | تعمل في بيئات التطوير والاختبار والإنتاج |
| كفاءة عالية | لا حاجة لتفريغ الحمولة وتغيير المركبة | لا حاجة لإعادة تثبيت التبعيات |
4. الحاويات مقابل الآلات الافتراضية
توفر كل من الحاويات والآلات الافتراضية بيئات معزولة، لكنها تُنفذ بطرق مختلفة تمامًا.
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 بنية العميل-الخادم ويتكون من ثلاثة مكونات أساسية.
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 (مبادرة الحاويات المفتوحة) لضمان قابلية نقل الحاويات:
- مواصفات الصورة: تحدد تنسيق الصورة وتخطيطها
- مواصفة وقت التشغيل: تحدد بيئة تشغيل الحاوية
- مواصفة التوزيع: تحدد بروتوكول توزيع الصورة
6. حالات الاستخدام الرئيسية لـ Docker
(1) نظرة عامة على السيناريوهات
| السيناريو | الوصف | مثال |
|---|---|---|
| توحيد بيئة التطوير | بيئة تطوير موحدة للفريق | يمكن للأعضاء الجدد إعداد مجموعة التطوير الكاملة في 10 دقائق |
| نشر الخدمات المصغرة | كل خدمة تعمل في حاويتها الخاصة | API وقاعدة البيانات وذاكرة التخزين المؤقت كل منها في حاوية منفصلة |
| خط أنابيب CI/CD | بيئة بناء متسقة وقابلة للتكرار | GitHub Actions + Docker للنشر الآلي |
| التوسع السريع | نسخ تبدأ/تتوقف في ثوانٍ | 1←10 نسخ أثناء ذروة المرور، 10←1 خارج أوقات الذروة |
| تحويل التطبيقات القديمة إلى حاويات | ترحيل التطبيقات القديمة دون تعديل | حزم مشروع PHP 5.4 من عام 2015 في حاوية |
(2) عملية بدء تشغيل الحاوية
عند تشغيل docker run hello-world، تحدث الخطوات التالية داخل Docker:
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 بشكل صحيح.
# تنزيل وتشغيل صورة hello-world
docker run hello-world
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 الخلفي.
# عرض معلومات Docker على مستوى النظام
docker info
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 حسب كائنات الإدارة لتسهيل الحفظ.
# عرض جميع أوامر إدارة Docker
docker --help
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.
# تشغيل Nginx في وضع الخلفية، ربط المنفذ 8080 بالمنفذ 80 للحاوية
docker run -d -p 8080:80 --name my-nginx nginx:latest
# التحقق من أن الحاوية قيد التشغيل
docker ps
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.
▶ مثال: عرض قائمة الحاويات قيد التشغيل (الصعوبة: ⭐)
# عرض جميع الحاويات قيد التشغيل
docker ps
# عرض جميع الحاويات (بما في ذلك المتوقفة)
docker ps -a
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) التحقق من نجاح التثبيت
# التحقق من إصدارات عميل وخادم Docker
docker version
# تحقق سريع: تشغيل hello-world
docker run hello-world
إذا عرض docker version معلومات كل من العميل (Client) والخادم (Server)، فهذا يعني أن التثبيت تم بنجاح.
9. مثال كامل: دليل خطوة بخطوة للبدء مع Docker
# ============================================
# شرح كامل: أول تجربة مع 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")
# 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 run hello-world في الطرفية للتحقق من أنه يعمل.docker. يبدأ هذا البرنامج التعليمي من الصفر، وسيتم شرح أي مفاهيم Linux ضرورية أثناء التقدم.📖 ملخص
- تقنية الحاويات هي تقنية محاكاة افتراضية خفيفة الوزن تشارك النواة وتوفر عزل العمليات؛ وهي أخف وأسرع من الآلات الافتراضية.
- الفروق الرئيسية بين الحاويات والآلات الافتراضية: الحاويات تشارك نواة المضيف، وتبدأ في ثوانٍ، وتستخدم بضعة ميجابايت فقط من الذاكرة
- بنية Docker ثلاثية الطبقات: العميل (CLI) → الخادم الخلفي (خدمة خلفية) → المستودع (مستودع الصور)
- الصورة هي قالب للقراءة فقط، والحاوية هي نسخة قيد التشغيل من الصورة (تشبيه: الصنف مقابل الكائن)
- حالات الاستخدام الرئيسية لـ Docker: توحيد البيئة، نشر الخدمات المصغرة، CI/CD، التوسع السريع
docker run hello-worldهو الخطوة الأولى للتحقق من تثبيت Docker
📝 تمارين
- تمرين أساسي (الصعوبة: ⭐): ثبّت Docker Desktop وشغّل
docker run hello-world، ثم التقط لقطة شاشة أو انسخ المخرجات. - تمرين متقدم (الصعوبة: ⭐⭐): شغّل
docker infoلعرض إعدادات Docker المحلية، وسجّل قيم الحقول الثلاثة: عدد الحاويات، Storage Driver، وإصدار النواة (Kernel Version). - سؤال تحدي (الصعوبة: ⭐⭐⭐): اذكر ثلاث مزايا وثلاث عيوب لكل من الحاويات والآلات الافتراضية، واشرح في أي سيناريوهات يجب اختيار الحاويات وفي أي سيناريوهات يجب اختيار الآلات الافتراضية.