الهدف: 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 | معناه |
|---|---|
-it | interactive + terminal: افتحلي shell أقدر أكتب فيه |
-d | detach: شغّل الـ 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.