التطبيق · فصل ٣

أول image بإيدك وأوامر docker run

docker pull · Dockerfile · docker build · docker run flags
🎯 الهدف: تبني image من ubuntu فيها ping، وتشغّلها، وتفهم أهم flags بتاعة docker run.

الهدف: ubuntu فيها ping

الـ image الرسمية بتاعة ubuntu خفيفة جدًا، لدرجة إن ping مش فيها. هنعمل image جديدة مبنية عليها ومتسطّب فيها ping.

🧪 Lab: خطوة خطوة

١. نزّل الـ base image

terminal
docker pull ubuntu:22.04# jammy هو اسم نسخة 22.04، فـ ubuntu:jammy نفس الـ image

٢. اكتب Dockerfile في فولدر فاضي:

Dockerfile
FROM ubuntu:22.04RUN apt-get update && apt-get install -y iputils-ping \    && rm -rf /var/lib/apt/lists/*
  • FROM: بنبدأ من أنهي image.
  • RUN: أمر بيتنفذ وقت البناء، ونتيجته بتبقى طبقة جديدة في الـ image.
  • rm -rf /var/lib/apt/lists/*: بنمسح كاش apt عشان الـ image تصغر.

٣. ابني الـ image

terminal
docker build -t my-ubuntu-ping .

-t بتدّي الـ image اسم (tag). النقطة في الآخر هي الـ build context: الفولدر اللي Docker هيبعته للـ daemon ويدوّر فيه على الـ Dockerfile.

٤. شغّل container منها

terminal
docker run -it --rm my-ubuntu-ping bash# جوه الـ container:ping -c 3 google.comexit

الـ container بيموت ومعاه ملفاته

أي ملف تكتبه جوه الـ container بيتكتب في طبقة الكتابة بتاعته. امسح الـ container، الملفات تتمسح معاه. ده مش مشكلة لـ ping، بس كارثة لو ده database. الحل في الفصل الجاي: الـ volumes.

Image جاهزة كأداة CLI

مش لازم تسطّب كل أداة على جهازك. ممكن تشغّلها من image وتمسحها:

terminal
# ابعت request واعرض النتيجة، والـ container يتمسح بعدهاdocker run --rm curlimages/curl https://example.com# أو افتح shell جوه الـ image وجرّب براحتكdocker run -it --rm curlimages/curl sh

أهم flags بتاعة docker run

terminal
docker run -d --name test-ubuntu ubuntu sh -c "sleep 3 && echo Done"docker logs test-ubuntu   # هتلاقي Done
الـ flagمعناه
-itinteractive + terminal: افتحلي shell أقدر أكتب فيه
-ddetach: شغّل الـ container في الخلفية
--rmامسح الـ container أول ما يقف
--name testادّيله اسم بدل الاسم العشوائي
-p 8080:80اربط بورت 8080 على جهازك ببورت 80 جوه الـ container
-e KEY=valueمتغيّر بيئة (environment variable)
-v src:/pathاربط volume أو فولدر (الفصل الجاي)
sh -c "..."شغّل shell ونفّذ الأمر ده جوّاه

أوامر هتحتاجها كل يوم

terminal
docker ps            # الـ containers الشغالةdocker ps -a         # كلهم، حتى الواقفينdocker images        # الـ images اللي عندكdocker logs -f NAME  # تابع الـ logsdocker exec -it NAME sh   # ادخل container شغالdocker stop NAME && docker rm NAMEdocker system prune  # نضّف الحاجات اللي مش مستخدمة (اقرا التحذير قبل ما توافق)

خلّصت الفصل لما

🧠 اختبر نفسك
١) الفرق بين RUN في الـ Dockerfile و docker run؟
RUN بيتنفذ وقت البناء وبيعمل طبقة. docker run بيشغّل container من image جاهزة.
٢) شغّلت container بـ -d ومش شايف أي output. تعمل إيه؟
docker logs NAME، أو -f عشان تتابع.
٣) عايز تكلّم nginx من المتصفح على localhost:3000. الـ flag؟
-p 3000:80.