أساسيات الحاويات (Docker) والعمل مع Linux Images


يا هلا بالشباب، اليوم بنتكلم عن أساسيات الحاويات، تحديداً Docker، وكيف نتعامل مع صور Linux. الموضوع بسيط وممتع وبيغير نظرتك لتشغيل التطبيقات.

إيش هي الحاويات (Containers)؟

ببساطة، الحاوية هي طريقة لتغليف تطبيق وكل اللي يحتاجه عشان يشتغل (كود، مكتبات، إعدادات) في حزمة واحدة معزولة. تخيلها صندوق صغير مستقل تماماً. الفرق بينها وبين الأجهزة الافتراضية (VMs) إن الحاوية تشارك نواة نظام التشغيل (Kernel) مع المضيف، وهذا يخليها أخف وأسرع بكثير. الـ VM تحتاج نظام تشغيل كامل خاص فيها.

لماذا Docker؟

Docker هو أشهر منصة للحاويات. يخليك تبني، تشغل، وتدير الحاويات بسهولة. الهدف الأساسي هو "بناء مرة واحدة، تشغيل في أي مكان". يعني التطبيق اللي بنيته على جهازك بيشتغل بنفس الطريقة بالضبط على سيرفر الإنتاج، بدون مشاكل "إيه بس عندي يشتغل!".

المفاهيم الأساسية: Image vs. Container

  • Image (الصورة): هي قالب للقراءة فقط (Read-only template) يحتوي على كل التعليمات لبناء حاوية. زي ما يكون عندك قالب كيك، هذا هو الـ Image.
  • Container (الحاوية): هي نسخة قابلة للتشغيل من الـ Image. يعني لما تشغل الـ Image، تتحول إلى Container. الكيكة نفسها بعد ما انخبزت هي الـ Container.

ملاحظة: قبل ما تبدأ، تأكد إن Docker مثبت عندك. إذا مو مثبت، دور على "Install Docker Engine on [اسم توزيعة لينكس حقتك]" في قوقل. الموضوع سهل جداً.

التعامل مع الصور (Images)

سحب صورة (Pulling an Image)

عشان نستخدم صورة، لازم نسحبها من مستودع (Registry) زي Docker Hub. مثلاً، لو بنسحب صورة Ubuntu:

docker pull ubuntu:latest

هنا ubuntu هو اسم الصورة و latest هو الـ tag (الإصدار). لو ما حددت الـ tag، بيسحب latest افتراضياً.

عرض الصور الموجودة (Listing Images)

عشان تشوف كل الصور اللي عندك على الجهاز:

docker images

البحث عن صور (Searching for Images)

لو تبغى تدور على صور معينة في Docker Hub:

docker search nginx

هذا بيعرض لك صور Nginx المتوفرة.

حذف صورة (Removing an Image)

إذا ما تحتاج صورة معينة، تقدر تحذفها:

docker rmi ubuntu:latest

ملاحظة: ما تقدر تحذف صورة إذا فيه حاوية شغالة منها. لازم تحذف الحاوية أول.

تشغيل الحاويات (Running Containers)

تشغيل حاوية بسيطة

أبسط طريقة لتشغيل حاوية. مثلاً، تشغيل Ubuntu وطباعة "Hello from Ubuntu":

docker run ubuntu echo "Hello from Ubuntu!"

هنا Docker بيسحب صورة Ubuntu (إذا ما كانت موجودة محلياً)، يشغل منها حاوية، ينفذ الأمر echo "Hello from Ubuntu!" داخلها، وبعدين يوقف الحاوية ويحذفها تلقائياً لأن الأمر انتهى.

تشغيل حاوية تفاعلية (Interactive)

لو تبغى تدخل داخل الحاوية وتشتغل عليها كأنها جهاز لينكس مستقل:

docker run -it ubuntu bash
  • -i: اختصار لـ —interactive (يخلي المدخلات مفتوحة).
  • -t: اختصار لـ —tty (يعطيك طرفية شبه حقيقية).
  • bash: الأمر اللي بنشغله داخل الحاوية عشان يعطينا شيل (Shell).

الحين أنت داخل حاوية Ubuntu! تقدر تجرب أوامر لينكس زي ls أو pwd.

عشان تطلع من الحاوية، اكتب exit.

تشغيل حاوية في الخلفية (Detached Mode)

عادةً ما تبغى الحاوية تشغل الطرفية حقتك. تقدر تشغلها في الخلفية:

docker run -d -p 80:80 --name my-nginx nginx
  • -d: اختصار لـ —detach (يشغل الحاوية في الخلفية).
  • -p 80:80: يسوي ربط بين المنفذ 80 على جهازك المضيف والمنفذ 80 داخل الحاوية. يعني أي طلب يجي على منفذ 80 حق جهازك بيروح لمنفذ 80 حق الحاوية.
  • --name my-nginx: يعطي اسم للحاوية (أسهل للتعامل معها بدل الـ ID الطويل).
  • nginx: اسم الصورة اللي بنشغلها.

الحين لو فتحت متصفحك وكتبت http://localhost أو http://127.0.0.1، بتشوف صفحة Nginx الافتراضية!

إدارة الحاويات (Managing Containers)

عرض الحاويات الشغالة (Listing Running Containers)

عشان تشوف كل الحاويات الشغالة حالياً:

docker ps

عرض كل الحاويات (الشغالة والمتوقفة)

عشان تشوف كل الحاويات اللي سويتها، سواء شغالة أو متوقفة:

docker ps -a

إيقاف حاوية (Stopping a Container)

لو تبغى توقف حاوية معينة (استخدم اسمها أو الـ ID حقها):

docker stop my-nginx

تشغيل حاوية متوقفة (Starting a Stopped Container)

بعد ما توقفها، تقدر ترجع تشغلها:

docker start my-nginx

إعادة تشغيل حاوية (Restarting a Container)

توقف وتشغلها مرة ثانية:

docker restart my-nginx

حذف حاوية (Removing a Container)

عشان تحذف حاوية (لازم تكون متوقفة أول):

docker rm my-nginx

إذا تبغى تحذفها وهي شغالة، تقدر تستخدم -f (force)، بس انتبه:

docker rm -f my-nginx

بناء صورك الخاصة باستخدام Dockerfile

هنا يجي الشغل الاحترافي! بدال ما تعتمد على صور جاهزة، تقدر تبني صورك الخاصة اللي فيها تطبيقك وإعداداتك بالضبط. هذا يتم عن طريق ملف اسمه Dockerfile.

الـ Dockerfile هو ملف نصي فيه تعليمات خطوة بخطوة لـ Docker عشان يبني الصورة.

مثال بسيط لـ Dockerfile

خلنا نسوي ملف بسيط يعرض صفحة HTML ثابتة باستخدام Nginx. أول شيء، سو مجلد جديد، مثلاً my-web-app:

mkdir my-web-app
cd my-web-app

داخل my-web-app، سو ملف اسمه index.html وحط فيه:

<!DOCTYPE html>
<html>
<head>
    <title>My Docker App</title>
</head>
<body>
    <h1>Hello from my Dockerized Web App!</h1>
    <p>This is a simple Nginx container.</p>
</body>
</html>

بعدين، سو ملف اسمه Dockerfile (بدون أي امتداد) وحط فيه:

# استخدم صورة Nginx الأساسية
FROM nginx:latest

# انسخ ملف index.html حقنا إلى مسار Nginx الافتراضي
COPY index.html /usr/share/nginx/html/index.html

# عرف المنفذ اللي الحاوية بتستمع عليه (اختياري، بس يوضح النية)
EXPOSE 80

بناء الصورة (Building the Image)

الحين، من داخل مجلد my-web-app، شغل الأمر التالي:

docker build -t my-custom-nginx-app:v1 .
  • -t my-custom-nginx-app:v1: يعطي اسم للصور (tag) عشان تقدر تتعرف عليها. v1 هو رقم الإصدار.
  • .: النقطة هذي مهمة جداً! معناها "ابحث عن Dockerfile في المجلد الحالي".

بعد ما تخلص عملية البناء، بيطلع لك رسالة نجاح وتقدر تشوف الصورة الجديدة باستخدام docker images.

تشغيل الحاوية من صورتك الخاصة

الحين تقدر تشغل حاوية من الصورة اللي سويتها:

docker run -d -p 8080:80 --name custom-web my-custom-nginx-app:v1

لاحظ هنا ربطت المنفذ 8080 على جهازك بالمنفذ 80 داخل الحاوية. يعني لو فتحت http://localhost:8080 في متصفحك، بتشوف صفحتك اللي صممتها!

الخلاصة

هذا كان مدخل سريع ومباشر لعالم Docker والحاويات. الموضوع أعمق من كذا بكثير، بس هذي الأساسيات اللي بتخليك تبدأ وتفهم كيف تشتغل. تدرب على الأوامر هذي وشوف كيف Docker بيسهل عليك شغل كثير.

بالتوفيق!