أساسيات الحاويات (Docker) والعمل مع Linux Images
أساسيات الحاويات (Docker) والعمل مع Linux Images
أصبحت الحاويات اليوم جزءاً أساسياً من بيئات التطوير الحديثة، لأنها تقدم طريقة سريعة وموحدة لتشغيل التطبيقات مع جميع اعتمادياتها دون الحاجة إلى إعداد النظام يدوياً في كل مرة. وعند الحديث عن Docker، فنحن نتحدث عن طبقة عملية فوق مفاهيم لينكس المتعلقة بالعزل، العمليات، الشبكات، وأنظمة الملفات، لذلك يفيد كثيراً فهم الخلفية التي تناولناها سابقاً في مقدمة إلى عالم لينكس: التاريخ، الفلسفة، وفهم النواة (Kernel).
في هذا المقال سنتعرف على معنى الحاويات، وما الفرق بينها وبين الأجهزة الافتراضية، وكيف تعمل Linux Images داخل Docker، ثم نستعرض أهم الأوامر الأساسية لإنشاء الصور وتشغيل الحاويات وإدارتها عملياً. الهدف ليس الحفظ النظري فقط، بل تكوين تصور تقني صحيح يساعدك لاحقاً في بناء بيئة تطوير أو نشر تطبيقات أكثر استقراراً وقابلية للتكرار.
ما هي الحاويات ولماذا Docker مهم؟
الحاوية هي بيئة تشغيل معزولة نسبياً تضم التطبيق وما يحتاجه من مكتبات وأدوات، لكنها تشارك نواة النظام المضيف بدلاً من تشغيل نظام تشغيل كامل كما يحدث في الأجهزة الافتراضية. هذا يجعلها أخف وزناً وأسرع في الإقلاع وأكثر كفاءة في استهلاك الموارد.
يعتمد Docker على مفاهيم لينكس مثل namespaces و cgroups لعزل العمليات وإدارة الموارد. ومن هنا تظهر أهمية فهم فهم العمليات (Processes) ومراقبة استهلاك الموارد (top, htop, ps, kill)، لأن الحاوية في النهاية ليست شيئاً سحرياً، بل مجموعة عمليات تعمل بطريقة منظمة ومحددة الصلاحيات.
الفرق بين الحاويات والأجهزة الافتراضية
- الحاويات: تشارك نواة النظام المضيف، لذلك هي أسرع وأخف.
- الأجهزة الافتراضية: تشغل نظام تشغيل كاملاً فوق hypervisor، لذلك تستهلك موارد أكبر.
- الحاويات: مناسبة جداً للتطوير، CI/CD، المايكروسيرفس، والتشغيل السريع.
- الأجهزة الافتراضية: مفيدة عندما تحتاج عزلاً كاملاً على مستوى نظام التشغيل.
ما المقصود بـ Linux Images في Docker؟
الصورة أو Image هي قالب ثابت يحتوي على نظام ملفات جاهز وتعليمات تشغيل أولية للتطبيق. عند تشغيل الصورة، ينشئ Docker منها حاوية قابلة للتنفيذ. يمكن اعتبار الصورة بمثابة “وصفة”، بينما الحاوية هي “الطبق الجاهز” الناتج عن هذه الوصفة.
غالباً ما تُبنى الصور فوق توزيعات لينكس خفيفة مثل Ubuntu أو Alpine أو Debian. وهنا يفيد الرجوع إلى اختيار التوزيعة المناسبة (Distros) وطرق التثبيت لفهم الفروق بين البيئات الأساسية التي قد تعتمد عليها داخل الحاوية.
ممَّ تتكون الصورة؟
- طبقات Layers متراكبة لتقليل الحجم وإعادة الاستخدام.
- نظام ملفات يحتوي على الأدوات والحزم المطلوبة.
- إعدادات مثل متغيرات البيئة، مجلد العمل، وأمر التشغيل الافتراضي.
- اعتماديات التطبيق مثل Python أو Node.js أو Nginx.
هذه الطبقات تجعل Docker فعالاً جداً، لأنه لا يعيد تنزيل أو بناء كل شيء من الصفر في كل مرة، بل يعيد استخدام الطبقات المشتركة متى أمكن.
تثبيت Docker والتحقق من الجاهزية
بعد تثبيت Docker على توزيعتك، يمكنك التأكد من عمله عبر سطر الأوامر. إذا كنت لا تزال في بداية التعامل مع بيئة لينكس، فستجد أساسيات مهمة في الدخول الأول إلى الطرفية (Terminal): الأوامر الأساسية والمساعدة، لأن إدارة Docker تتم غالباً من خلال الطرفية.
docker --version
docker info
يعرض الأمر الأول إصدار Docker، بينما يقدم الثاني معلومات أوسع عن المحرك، برامج التشغيل، ومساحة التخزين. إذا ظهر خطأ متعلق بالصلاحيات، فقد تحتاج إلى تشغيل الأوامر باستخدام sudo أو ضبط المجموعة المناسبة، وهو موضوع يرتبط عملياً بما شرحناه في إدارة الصلاحيات والملكية (Chmod, Chown, Sudo).
لا تمنح المستخدمين صلاحية إدارة Docker على الخادم الإنتاجي إلا عند الحاجة الفعلية، لأن الوصول إلى Docker قد يعني عملياً صلاحيات واسعة جداً على النظام المضيف.
أهم أوامر Docker الأساسية
قبل بناء صورك الخاصة، من المهم فهم دورة العمل الأساسية: تنزيل صورة، تشغيل حاوية، فحص حالتها، ثم إيقافها أو حذفها. هذه هي الأساسيات التي ستستخدمها يومياً.
1) البحث عن الصور وتنزيلها
docker search ubuntu
docker pull ubuntu:22.04
الأمر search يبحث في السجل، بينما pull ينزل الصورة إلى جهازك. استخدام الوسم tag مهم لتثبيت إصدار واضح بدلاً من الاعتماد على latest.
2) تشغيل حاوية تفاعلية
docker run -it --name myubuntu ubuntu:22.04 bash
هذا الأمر ينشئ حاوية جديدة باسم myubuntu ويشغّل بداخلها واجهة bash. داخل الحاوية ستتعامل مع ملفات لينكس ومساراته كما لو كنت على نظام منفصل، وهنا يفيد فهم هيكلية ملفات لينكس (Filesystem Hierarchy Standard – FHS).
3) عرض الحاويات والصور
docker ps
docker ps -a
docker images
docker psيعرض الحاويات العاملة فقط.docker ps -aيعرض كل الحاويات بما فيها المتوقفة.docker imagesيعرض الصور المخزنة محلياً.
4) إيقاف الحاويات وحذفها
docker stop myubuntu
docker start myubuntu
docker rm myubuntu
docker rmi ubuntu:22.04
يتم حذف الحاوية بالأمر rm، أما الصورة نفسها فتحذف عبر rmi. ويُفضل دائماً مراجعة ما إذا كانت الصورة مستخدمة من حاويات أخرى قبل إزالتها.
العمل داخل الحاوية وفهم البيئة المعزولة
بمجرد دخولك إلى الحاوية، يمكنك تنفيذ أوامر لينكس المعتادة، تثبيت حزم، إنشاء ملفات، أو فحص الشبكة. على سبيل المثال، قد تحتاج إلى تحديث الفهارس أو تثبيت أداة معينة كما تفعل في الأنظمة التقليدية، وهذا يرتبط عملياً بموضوع إدارة الحزم البرمجية وتحديث النظام.
apt update
apt install -y curl
uname -a
cat /etc/os-release
لكن يجب الانتباه إلى أن التغييرات داخل الحاوية المؤقتة لا تُعد بديلاً عن بناء صورة مخصصة. فإذا حذفت الحاوية وأنشأت أخرى من نفس الصورة الأصلية، ستفقد التعديلات اليدوية غالباً.
أفضل ممارسة في Docker هي توثيق التغييرات داخل ملف
Dockerfileبدلاً من الاعتماد على تعديلات يدوية داخل الحاوية، لأن البناء القابل للتكرار أهم من الحلول المؤقتة.
بناء صورة مخصصة باستخدام Dockerfile
ملف Dockerfile هو الوصفة النصية التي تخبر Docker كيف يبني الصورة. يمكن إنشاؤه داخل مجلد مشروعك باستخدام أي محرر، وستفيدك هنا مهارات أدوات عرض ومعالجة النصوص (cat, nano, vim, less, tail).
FROM ubuntu:22.04
RUN apt update && apt install -y nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
يبني هذا المثال صورة تعتمد على Ubuntu، ثم يثبّت Nginx ويفتح المنفذ 80 ويجعل Nginx يعمل في الواجهة الأمامية حتى تبقى الحاوية نشطة.
بناء الصورة وتشغيلها
docker build -t my-nginx-image .
docker run -d --name my-nginx-container -p 8080:80 my-nginx-image
الخيار -p 8080:80 يربط منفذ الجهاز المضيف بمنفذ الحاوية. وهذا يقودنا مباشرة إلى أهمية فهم أساسيات شبكات لينكس: العناوين، المنافذ، والبروتوكولات، لأن أي خطأ في المنافذ أو الجدار الناري سيمنع الوصول إلى الخدمة حتى لو كانت الحاوية تعمل بشكل سليم.
فحص السجلات واستكشاف الأخطاء
من أكبر مزايا Docker سهولة تتبع سلوك التطبيق عبر السجلات. بدلاً من التخمين، يمكنك قراءة المخرجات ومعرفة سبب التوقف أو فشل الإقلاع.
docker logs my-nginx-container
docker exec -it my-nginx-container bash
docker inspect my-nginx-container
الأمر logs يعرض السجلات، وexec يسمح بالدخول إلى الحاوية العاملة، وinspect يعرض تفاصيل عميقة بصيغة JSON. وإذا كنت تريد أساساً أمتن لتحليل الأعطال على مستوى النظام، فراجع مراقبة السجلات (Logs) وتحليل الأخطاء.
أفضل ممارسات عند التعامل مع Linux Images
- استخدم صوراً رسمية أو موثوقة فقط من مصادر معروفة.
- ثبّت الإصدارات بوسوم واضحة لتقليل المفاجآت.
- اختر صوراً خفيفة مثل Alpine عندما يناسب ذلك التطبيق.
- قلّل عدد الطبقات والأدوات غير الضرورية داخل الصورة.
- لا تخزن كلمات المرور أو المفاتيح الحساسة داخل الصورة.
- حدّث الصور دورياً لمعالجة الثغرات الأمنية.
كما أن تشغيل الخدمات المكشوفة للعالم الخارجي يجب أن يراعي قواعد الحماية على الخادم، خاصة إذا كنت تربط منافذ عامة. في هذه الحالة يصبح الرجوع إلى جدار الحماية (Firewall) وتأمين النظام خطوة منطقية ومهمة جداً.
الخلاصة
Docker ليس مجرد أداة لتشغيل التطبيقات، بل طريقة تفكير حديثة في بناء البيئات البرمجية بشكل قابل للتكرار والنقل السريع بين الأجهزة والخوادم. فهمك لمعنى الصورة والحاوية، وآلية الطبقات، والأوامر الأساسية مثل pull وrun وbuild وlogs يمنحك قاعدة قوية للانتقال لاحقاً إلى orchestration وبيئات الإنتاج.
ابدأ بصور لينكس بسيطة، جرّب إنشاء حاويات تفاعلية، ثم انتقل إلى كتابة Dockerfile واضح ونظيف. ومع كل تجربة ستلاحظ أن خبرتك السابقة في لينكس، الملفات، الشبكات، الصلاحيات، والسجلات، ليست منفصلة عن Docker، بل هي الأساس الحقيقي لفهمه واستخدامه باحتراف.
8 comments