المستوى: مبتدئ — المقال ده موجّه لمطوّر اتعامل مع Docker قبل كده، عارف يعمل docker build و docker run، وعنده Dockerfile شغّال على الإنتاج. لو لسه أول مرة تسمع عن Docker، ابدأ من Multi-Stage Builds الأول.
صورة Docker لتطبيق Node.js صغير حجمها 1.1 جيجابايت. تطبيقك الفعلي 12 ميجا. الفرق ده كله Ubuntu كامل تحت تطبيقك، وفيه 312 ثغرة أمنية معروفة. Distroless بتشيل كل ده وتسيب 4 طبقات بس: تطبيقك، الـ runtime، مكتبات النظام الأساسية، ومستخدم nonroot. النتيجة على نفس التطبيق: 169 ميجا و 12 ثغرة. التعديل 5 سطور في Dockerfile.
Distroless Images للمبتدئ: قلّل سطح الهجوم على Docker بنسبة 92%
هنا هتعرف 4 حاجات: ليه node:18 مش الاختيار الصح للإنتاج، إيه هي Distroless علميًا، إزاي تحوّل أي Dockerfile للـ Distroless، وإمتى تتجنّبها فعلاً.
المشكلة باختصار
Dockerfile عادي لتطبيق Node.js بيبقى بالشكل ده:
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "server.js"]
الصورة اللي بتطلع 1.1 جيجابايت. الكود بتاعك جواها 12 ميجا. الباقي 1088 ميجا مش تطبيقك — ده Debian كامل تحته.
افتح الـ container واتفقّد:
docker run -it your-app bash
# داخل الـ container:
which bash apt curl wget git ssh vim
# كل دول موجودينتطبيق Node.js بيستخدم أي حاجة من دول؟ لأ. ليه موجودين؟ لأنهم جايين مع node:18 الأساسية.
المشكلة مش الحجم بس. كل أداة من دول ممكن يكون فيها ثغرة. Trivy (أداة فحص الثغرات الأشهر، صنع Aqua Security) بيرجّع 312 CVE معروف على صورة node:18 الافتراضية في فحص يناير 2026. ده ميراث Debian كامل، مش تطبيقك.
المثال البسيط: شحن كرتونة كتب
قبل ما ندخل في التعريف العلمي، خد مثال بعيد عن الكود. لو هتشحن كرتونة كتب لصاحبك في بلد تانية، مش هتحط في الكرتونة مفك ومنشار وعربية وميكروويف "لاحتمال يحتاجهم". هتحط الكتب بس. ليه؟
- كل حاجة زيادة بتزوّد التكلفة (الوزن).
- كل حاجة زيادة ممكن تتسرق في الطريق (سطح الهجوم).
- كل حاجة زيادة ممكن تتكسر وتأذي الكتب نفسها (Dependencies تكسر تطبيقك).
صورة Docker بتشتغل بنفس المنطق. كل أداة جواها مش بتاعت تطبيقك بتزوّد: