0.3البنية : الصورة والحاوية والسجل والمحرك
الأساسي في 30 ثانية
- العميل يأمر، والمحرك يُنفِّذ : لا تخاطب سوى العميل (docker)، ومحرك الخلفية يفعل العمل.
- الصورة قالب ثابت، والحاوية قطعة حية : صورة واحدة ← N حاويات مستقلة، لكل واحدة طبقتها القابلة للكتابة.
- يخزِّن السجل الصور المُنسخَنة بالوسوم : pull يُنزِّل وpush ينشر — ودائما وسم صريح، وأبدا latest في الإنتاج.
حالة مستمرة — إدير يُشغِّل ثلاثة خوادم ويب متطابقة في الجزائر
إدير، مهندس DevOps مبتدئ في الجزائر، يجب أن يختبر توزيع الحمل : بدلا من إعادة تثبيت nginx ثلاث مرات، يطبِّق البنية. يُنزِّل الصورة مرة واحدة عبر docker pull nginx:1.27 (سجل Docker Hub، ووسم صريح)، ثم يُشغِّل ثلاث حاويات مسماة web1 وweb2 وweb3 من الصورة نفسها. عبر docker ps يرى الصورة نفسها وثلاث حيوات مستقلة. يحذف web2 : تبقى الصورة والحاويات الأخرى — الدليل الحي أن القالب لا يتغير أبدا عندما تختفي قطعة.
حالة مستقلة لهذا القسم : تعود في الدرس والمخطط والنص الجاهز وتحدي 48 ساعة للقسم 0.3.
1. الفاعلون الخمسة
يرسل العميل (Client) (docker) الأوامر إلى المحرك (Daemon) (محرك الخلفية). يبني المحرك الصور، ويخزنها محليا، ويُنزِّلها من السجل (Registre) (Docker Hub) ويُشغِّلها في حاويات. لا تخاطب سوى العميل ؛ والمحرك يفعل العمل. يرى إدير العميل كجهاز التحكم والمحرك كالخادم.
2. الصورة مقابل الحاوية : القالب والقطعة
الصورة (Image) نموذج ثابت (تكديس طبقات (Couche) للقراءة فقط). والحاوية نسخة حية من هذا النموذج، مع طبقة رقيقة قابلة للكتابة فوقها. يمكن تشغيل عشر حاويات من الصورة نفسها دون مضاعفتها : كل واحدة تعيش حياتها، والصورة لا تتغير أبدا. يحفظ إدير : حذف حاوية لا يمس الصورة ولا جيرانها.
3. السجل، المكتبة العالمية
يخزِّن السجل الصور المُنسخَنة بالوسوم (Tag) (nginx:1.27 وpostgres:16). يُنزِّل docker pull وينشر docker push. وDocker Hub هو السجل العام الافتراضي ؛ وتضيف الشركات غالبا سجلا خاصا (GHCR أو Harbor). يحدد إدير دائما وسمه : فـ latest لا يُجمِّد أي إصدار.
🔎 مثال ملموس — 🔎 مثال ملموس — ثلاثة خوادم ويب متطابقة
يُشغِّل إدير ثلاث خدمات nginx مستقلة من صورة واحدة مُنزَّلة مرة واحدة.
docker pull nginx:1.27
docker run -d --name web1 nginx:1.27
docker run -d --name web2 nginx:1.27
docker run -d --name web3 nginx:1.27
القراءة : صورة واحدة مُنزَّلة، وثلاث حاويات مستقلة.
الدرس : احذف web2 : تبقى الصورة والحاويات الأخرى.
مفردات القسم
- العميل
- واجهة docker : ترسل الأوامر ولا تُنفِّذها.
مثال بسيط: يكتب إدير docker pull nginx:1.27 : العميل ينقل إلى المحرك.
ما ليس كذلك: المحرك الذي يُشغِّل الحاويات.
رد فعل: العميل يأمر، والمحرك يُنفِّذ.
- المحرك
- المحرك dockerd الذي يبني ويُشغِّل فعلا.
مثال بسيط: يعرف إدير أن خدمات الويب الثلاث تعمل بفضل المحرك.
ما ليس كذلك: الأمر المكتوب على لوحة المفاتيح.
رد فعل: لا شيء يُقلع إذا توقف المحرك.
- الصورة
- نموذج ثابت بطبقات، يُعرَّف عبر اسم:وسم.
مثال بسيط: يُجمِّد إدير nginx:1.27 : ثلاث حاويات، وصورة واحدة سليمة.
ما ليس كذلك: حاوية حية وقابلة للتعديل.
رد فعل: دائما اسم:وسم صريح.
- الحاوية
- نسخة حية من صورة، بطبقتها القابلة للكتابة.
مثال بسيط: يحذف إدير web2 : تستمر web1 وweb3، وتبقى الصورة.
ما ليس كذلك: القالب المخزَّن في السجل.
رد فعل: --name لتمييز الجيران.
- الوسم
- لافتة إصدار الصورة (1.27 و16 وlatest).
مثال بسيط: يختار إدير nginx:1.27 بدلا من latest لتجميد إصداره.
ما ليس كذلك: اسم حاوية.
رد فعل: latest للاختبار فقط، وأبدا في الإنتاج.
في التطبيق — عمليا — رؤية الفاعلين يعملون
- نزِّل nginx:1.27 عبر pull واسرد صورك، مثل إدير.
- شغِّل حاويتين من هذه الصورة بأسماء --name مختلفة.
- اسردهما عبر docker ps : الصورة نفسها، وحياتان.
- احذف واحدة : تحقق أن الصورة والأخرى تبقيان.
نص جاهز — صورة واحدة وثلاث حاويات مثل إدير (5 دقائق)
1) اكتب docker pull nginx:1.27 ثم docker images : حدِّد الصورة المُنزَّلة. 2) اكتب docker run -d --name web1 nginx:1.27 ثم docker run -d --name web2 nginx:1.27 : حياتان من القالب نفسه. 3) اكتب docker ps : تحقق من الصورة نفسها والحاويتين. 4) اكتب docker rm -f web2 ثم docker ps وdocker images : مثل إدير، لاحظ أن web1 والصورة تبقيان.
يُنزِّل run وحدها الصورة المفقودة : فـ pull الصريح هنا لرؤية السجل يعمل.
قالب جاهز للنسخ — مذكرة الفاعلين الخمسة
docker pull nginx:1.27 # السجل ← المحلي (وسم صريح)
docker images # مخزون المحرك المحلي
docker run -d --name web1 nginx:1.27 # القالب ← قطعة حية
docker ps # الصورة نفسها، حيوات مستقلة
docker rm -f web2 # حذف قطعة، والاحتفاظ بالقالب
# العميل = جهاز التحكم / المحرك = الخادم / السجل = المكتبة.
ويب ثلاثي
يختبر إدير التوزيع : web1 وweb2 وweb3 من nginx:1.27 — صورة واحدة، وثلاث حيوات.
قاعدة مُنسخَنة
يُجمِّد إدير postgres:16 لتجاربه : الوسم نفسه في كل مكان، وسلوك قابل لإعادة الإنتاج.
سجل خاص
في الشركة سيضيف إدير GHCR أو Harbor إلى Hub العام : pull نفسه، ومكتبة أخرى.
حاوية متوقفة
الحاوية المتوقفة تشغل القرص (الطبقة + السجلات) دون استهلاك CPU/RAM : يُنظِّف إدير عبر rm وprune.
✓ ممارسات جيدة
- حدِّد دائما وسم إصدار صريحا.
- سمِّ حاوياتك (--name) لتمييزها.
- انظر إلى المحرك كـ « الخادم » والعميل كـ « جهاز التحكم ».
✗ أخطاء شائعة
- الخلط بين الصورة والحاوية (حذف أحدهما مكان الآخر).
- استعمال latest ظنا أنه يُجمِّد إصدارا.
- الاعتقاد أن pull إجباري (فـ run تفعله وحدها).
النقاط الأساسية
- العميل يأمر، والمحرك يُنفِّذ.
- الصورة ثابتة، والحاوية حية.
- يخزِّن السجل الصور المُنسخَنة.
- صورة واحدة ← N حاويات مستقلة.
تحدي 48 ساعة — طبِّق غدا
أعد ثلاثية إدير : تنزيل nginx:1.27 عبر pull، وحاويتين مسماتين، وps لرؤية الحياتين — ثم احذف واحدة وأثبت أن الصورة والأخرى تبقيان.
- أستطيع ذكر الفاعلين الخمسة ودور كل واحد دون مصطلحات.
- شغَّلت N حاويات من صورة واحدة موسومة.
- أعرف ما يبقى عند حذف حاوية (الصورة + الجيران).
أسئلة شائعة
أين تُخزَّن صوري؟
محليا، في فضاء المحرك (docker images). وتبقى النسخة المرجعية في السجل البعيد ما لم نُنزِّلها عبر pull — يتحقق إدير محليا بعد كل pull.
هل تستهلك الحاوية المتوقفة موارد؟
تكاد لا تستهلك CPU/RAM، لكنها تشغل القرص (طبقتها + سجلاتها). نُنظِّف عبر rm وprune — فيزيل إدير القشور بدلا من تكديسها.
أي صورة تصف أفضل ثنائي الصورة / الحاوية؟