الفرق بين Docker Images وContainers بأمثلة عملية


صور Docker والحاويات مرحلتان مختلفتان في تشغيل التطبيق. الصورة تحتوي الملفات والإعدادات الأساسية لإنشاء البيئة، والحاوية تجمع هذه الصورة مع إعدادات التشغيل وطبقة ملفات قابلة للكتابة. يمكن إنشاء عدة حاويات من صورة واحدة، ولكل منها حالتها واسمها ومنافذها.
في هذا الدرس ستفصل بين ما تبنيه وما تشغّله وما تحذفه. ابدأ من مقدمة Docker وتشغيل Nginx إذا لم تستخدم الأوامر من قبل. الأمثلة مخصصة للتعلم المحلي، ولم تُنفّذ في بيئة Docker خلال إعداد المقال.
ما صورة Docker؟
صورة Docker حزمة ذات طبقات تتضمن ملفات التطبيق واعتمادياته وإعدادات افتراضية لتشغيله. تُستخدم الصورة لإنشاء الحاويات، ولا تصبح خادمًا يعمل بمجرد تنزيلها.
عند تنزيل صورة Nginx تحصل على ما يلزم لإنشاء حاوية لهذا الخادم، لكنك لم تحدد بعد اسم الحاوية أو منفذ الجهاز المرتبط بها. وتبقى الصورة متاحة لإنشاء حاويات أخرى لاحقًا، حتى بعد حذف حاوية سابقة.
docker pull nginx:stable
docker image ls
يعرض الأمر الثاني الصور المحلية. انتبه إلى عمود الوسم Tag ومعرّف الصورة Image ID. قد تشير أسماء متعددة إلى المحتوى نفسه، ولا يعني عدد الأسماء بالضرورة عدد نسخ الملفات المستقلة على القرص.
ما الحاوية؟ وهل يجب أن تكون عاملة؟
الحاوية كيان يُنشأ من صورة ويملك إعدادات وحالة وطبقة كتابة خاصة به. قد تكون حالته Created أو Running أو Exited؛ لذلك فعبارة «الحاوية نسخة تعمل من الصورة» مفيدة كبداية، لكنها لا تغطي الحاويات المتوقفة.
يمكنك إنشاء حاوية دون تشغيلها:
docker create --name g4a-created nginx:stable
docker ps -a
docker start g4a-created
لا يربط هذا المثال منفذًا بالمتصفح. هدفه توضيح الفصل بين الإنشاء والتشغيل، وليس عرض صفحة الويب. وجود عملية تعمل داخل الحاوية لا يعني تلقائيًا وجود منفذ منشور على الجهاز.
مقارنة صور Docker والحاويات
| السؤال | الصورة | الحاوية |
|---|---|---|
| ما دورها؟ | توفير محتوى الإنشاء | تنفيذ التطبيق بإعدادات محددة |
| هل لها حالة تشغيل؟ | لا | نعم، مثل عاملة أو متوقفة |
| هل تستقبل ملفات جديدة أثناء التشغيل؟ | طبقاتها غير قابلة للكتابة | لها طبقة كتابة خاصة |
| هل يمكن إعادة استخدامها؟ | لإنشاء حاويات متعددة | يمكن إيقاف الحاوية وبدؤها |
| ما أمر عرضها؟ | docker image ls | docker ps -a |
تثبيت حزمة داخل حاوية لا يغيّر الصورة التي أنشأتها منها. إذا احتجت إلى توزيع التغيير بشكل متكرر، صفه في Dockerfile وابنِ صورة جديدة. الاعتماد على تعديلات يدوية داخل حاوية يجعل إعادة إنتاج البيئة أصعب.
كيف تنشئ حاويتين من الصورة نفسها؟
استخدم اسمين مختلفين ومنفذين محليين مختلفين. تبقى الصورة مشتركة، بينما تختلف إعدادات كل حاوية.
docker run --name g4a-web-one -d -p 127.0.0.1:8083:80 nginx:stable
docker run --name g4a-web-two -d -p 127.0.0.1:8084:80 nginx:stable
docker ps
افتح http://localhost:8083 ثم http://localhost:8084. المتوقع ظهور صفحة Nginx في الحالتين إذا اكتمل التشغيل. أوقف الأولى وافحص القائمة مجددًا:
docker stop g4a-web-one
docker ps
docker ps -a
تستمر الثانية مستقلة عن إيقاف الأولى. الاستقلال هنا يتعلق بعمليات الحاويات وحالتها، ولا يعني أنها لا تتنافس على موارد الجهاز أو أنها لا تستطيع مشاركة تخزين أو شبكة عند ضبط ذلك.
ما طبقة الكتابة؟
طبقة الكتابة هي الجزء الذي تستقبل فيه الحاوية تغييرات الملفات غير المحفوظة في وحدات تخزين خارجها. إيقاف الحاوية لا يحذف هذه الطبقة، لكن إزالة الحاوية تزيلها.
يمكن إنشاء ملف تجريبي ثم رؤيته بعد إعادة التشغيل:
docker exec g4a-web-two sh -c 'echo training > /tmp/g4a-note.txt'
docker stop g4a-web-two
docker start g4a-web-two
docker exec g4a-web-two cat /tmp/g4a-note.txt
الملف تجريبي داخل /tmp في هذه الحاوية. لا تستخدم هذا الأسلوب لحفظ بيانات مهمة؛ فالحاوية ليست نسخة احتياطية. لحفظ البيانات بعد استبدال الحاويات تحتاج عادةً إلى Volume أو Bind mount مع خطة نسخ احتياطي مناسبة.
ماذا تعني الوسوم والمعرّفات؟
الوسم اسم قابل للتغيير يشير إلى صورة، مثل stable أو 1.0. لا تفترض أن إعادة سحب الوسم نفسه بعد أشهر تعطي الملفات نفسها. ويمكن تحديد محتوى بعينه عبر digest عند الحاجة إلى تثبيت أدق.
كذلك لا يعني الوسم latest أنه أحدث إصدار زمنيًا في كل مستودع. صاحب الصورة يحدد كيفية استخدام الوسوم. في بيئة الإنتاج راجع سياسة التحديث والتحقق من مصدر الصورة، بدل الاعتماد على اسم مطمئن وحده.
الفرق بين stop وrm وimage rm
يوقف stop العمليات في الحاوية دون حذف كيانها. ويزيل rm الحاوية المحددة بعد إيقافها. أما image rm فيتعامل مع الصورة أو وسمها، وقد يرفض العملية إذا كانت هناك حاويات تعتمد عليها.
docker stop g4a-created g4a-web-two
docker rm g4a-created g4a-web-one g4a-web-two
هذه الأوامر تنظف حاويات الدرس المسماة فقط. لن ننفذ تنظيفًا عامًا لكل الصور والحاويات؛ فقد تضم بيئتك مشاريع أخرى. تستطيع الإبقاء على صورة Nginx لاستخدامها في الدرس التالي.
اختبر فهمك قبل المتابعة
إذا حذفت حاوية ثم أنشأت أخرى من الصورة نفسها، فهل تعود الملفات التي كتبتها داخل الأولى؟ لا، إلا إذا حُفظت في تخزين دائم وأُعيد ربطه. وإذا أوقفت الحاوية ثم بدأت الحاوية نفسها، فهل أعدت إنشاءها؟ لا، لقد غيّرت حالتها.
تمييز صور Docker والحاويات يساعدك على بناء خطة تحديث واضحة: ابنِ صورة، أنشئ حاوية بإعداداتها، واحفظ البيانات خارج دورة استبدال الحاوية. هذا الفصل أساس العمل مع Dockerfile وCompose لاحقًا.
أسئلة شائعة
هل تنزيل الصورة يشغّل التطبيق؟
لا. التنزيل يوفّر الصورة محليًا؛ التشغيل يحتاج إلى إنشاء حاوية وبدء عمليتها.
هل كل حاوية تحتاج صورة مستقلة؟
لا. يمكن لعدة حاويات الاعتماد على الصورة نفسها، مع طبقات كتابة وإعدادات تشغيل مستقلة.
هل الحاوية المتوقفة موجودة؟
نعم. يعرضها docker ps -a ويمكن بدء الحاوية نفسها ما لم تُحذف.
هل تعديل ملف داخل الحاوية يعدل الصورة؟
لا. التعديل المعتاد يقع في طبقة الحاوية القابلة للكتابة أو التخزين المرتبط بها.
المصادر والمراجعة التقنية
استُلهم ترتيب موضوعات السلسلة من ملاحظات Narayan Prasad (@code.withnarayan). الشرح العربي والأمثلة والرسوم هنا إعداد مستقل، مع الرجوع إلى الوثائق الرسمية لتصحيح وتوسيع المفاهيم.


