التجاوز إلى المحتوى
معرفة تقنية، بلغة عربية واضحة.GEEK4ARAB / مساحة للأفكار التي تصنع المستقبل
المدرسة العربية للبرمجةجيك للعرب · أخبار، معرفة، وتجربة
ادارة السيرفرات

شرح Dockerfile: بناء أول صورة لتطبيق ويب بسيط

geekadmin••6 دقائق قراءة
شرح Dockerfile: بناء أول صورة لتطبيق ويب بسيط — رسم توضيحي تعليمي
شرح Dockerfile: بناء أول صورة لتطبيق ويب بسيط — رسم توضيحي تعليمي
رسم تعليمي من إعداد Geek4Arab — الدرس 4.

شرح Dockerfile يبدأ بفكرة بسيطة: اكتب خطوات تجهيز بيئة التطبيق في ملف يمكن تكرار استخدامه. يقرأ Docker هذا الملف لبناء صورة، ثم تنشئ من الصورة حاوية. سنبني صفحة ويب صغيرة باستخدام Nginx، حتى تتعلم دورة البناء دون الانشغال بإطار برمجي أو قاعدة بيانات.

تحتاج إلى Docker يعمل، ومجلد تدريب مستقل، ومحرر نصوص. راجع تشغيل أول حاوية Docker إذا لم تختبر المحرك بعد. المثال تمهيدي للتعلم المحلي؛ الأوامر والنتائج المتوقعة لم تُختبر في بيئة Docker أثناء تحرير المقال.

ما Dockerfile وما علاقته بالصورة؟

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

احفظه بالاسم Dockerfile دون امتداد txt. وينبغي أن ترى الملف داخل مجلد المشروع مع الملفات التي ستنسخها. عند استخدام Windows، تأكد من ظهور امتدادات الملفات كي لا يتحول الاسم إلى Dockerfile.txt دون ملاحظة.

جهّز صفحة ويب للتجربة

أنشئ مجلدًا باسم g4a-dockerfile، ثم ضع داخله ملف index.html بالمحتوى التالي:

<!doctype html>
<html lang="ar" dir="rtl">
<meta charset="utf-8">
<title>تجربة Docker</title>
<h1>مرحبًا من Geek4Arab</h1>
<p>هذه الصفحة داخل صورة بنيتها بنفسي.</p>
</html>

لا تحتاج الصفحة إلى مكتبات خارجية. بساطة المشروع تجعل أثر COPY واضحًا: الملفات التي تضعها داخل الصورة هي التي سيقدّمها خادم الويب عند التشغيل.

اكتب أول Dockerfile

أنشئ ملف Dockerfile في المجلد نفسه:

FROM nginx:stable-alpine
COPY index.html /usr/share/nginx/html/index.html
EXPOSE 80

تحدد FROM صورة البداية. وتنسخ COPY صفحة المشروع إلى المسار الذي يقدّم منه Nginx ملفات الموقع في هذه الصورة. أما EXPOSE فتوثّق المنفذ المقصود داخل الحاوية؛ لا تنشره على الجهاز المضيف بمفردها.

لم نكتب CMD لأن الصورة الأساسية توفر إعداد تشغيل Nginx بالفعل. الاحتفاظ بأمر التشغيل الموروث مناسب لهذا المثال. لا تضف أمرًا جديدًا دون فهم أثره؛ فقد تستبدل سلوكًا يحتاج إليه الخادم.

كيف تبني الصورة وتشغّلها؟

افتح الطرفية داخل مجلد المشروع، ثم نفّذ:

docker build -t g4a-static:1.0 .
docker image ls g4a-static
docker run --name g4a-static-site -d -p 127.0.0.1:8085:80 g4a-static:1.0

النقطة في نهاية أمر البناء هي سياق البناء الحالي. والاسم g4a-static مع الوسم 1.0 يسهّلان الرجوع إلى الصورة. افتح http://localhost:8085 بعد التأكد من أن الحاوية تعمل.

إذا ظهر النص العربي في الصفحة، فقد وصلت ملفاتك إلى الصورة ثم إلى الحاوية. إذا رأيت صفحة Nginx الافتراضية، راجع مسار COPY ومحتوى index.html والصورة التي استخدمتها عند التشغيل.

ما سياق البناء ولماذا يهم؟

سياق البناء هو مجموعة الملفات التي يستطيع البناء الوصول إليها. في المثال حددنا المجلد الحالي. لا تتعامل COPY مع أي ملف عشوائي على الجهاز؛ يجب أن يكون مصدرها ضمن السياق المسموح.

أنشئ ملف .dockerignore بجوار Dockerfile لتقليل الملفات غير المطلوبة:

.git
.env
*.log
node_modules

هذه أمثلة شائعة للاستبعاد، وليست قائمة صالحة لكل مشروع. لا تستبعد مجلدًا تحتاج إلى نسخه فعلًا. واستبعاد .env يساعد على تجنب إرسال إعدادات محلية إلى سياق البناء، لكن حماية الأسرار تحتاج مراجعة ما يدخل الصورة وما يظهر في سجلات البناء أيضًا.

الفرق بين RUN وCMD وENTRYPOINT

RUN ينفّذ أمرًا أثناء البناء، مثل تجهيز ملفات أو تثبيت اعتماديات. أما CMD وENTRYPOINT فيحددان سلوك التشغيل الافتراضي عند إنشاء الحاوية. الخلط بينها قد يجعل التطبيق يعمل أثناء البناء فقط أو يتوقف فور بدء الحاوية.

التعليمة التوقيت أو الغرض ملاحظة
FROM اختيار الصورة الأساسية بداية مرحلة البناء
WORKDIR تحديد مجلد العمل يؤثر في التعليمات التالية
COPY نسخ الملفات من سياق البناء إلى الصورة
RUN تنفيذ خطوة بناء لا يشغّل الخدمة لاحقًا تلقائيًا
CMD أمر أو معاملات افتراضية يمكن استبداله عند docker run
ENTRYPOINT تحديد البرنامج الأساسي يمكن تغييره بخيار صريح
EXPOSE وصف منفذ التطبيق لا يعادل الخيار -p

استخدم صيغة JSON لأوامر التشغيل حين تناسب التطبيق، مثل CMD ["python", "app.py"]. العلاقة بين CMD وENTRYPOINT تعتمد على الصيغة والإعدادات الموروثة، لذلك افحص الصورة الأساسية قبل تغييرهما.

لماذا لا يظهر تعديل الصفحة مباشرة؟

لأن COPY أخذ نسخة من الملف أثناء البناء. تعديل index.html على جهازك لا يغيّر الصورة القديمة ولا الحاوية التي أُنشئت منها. ابنِ وسمًا جديدًا ثم استبدل حاوية التدريب:

docker build -t g4a-static:1.1 .
docker stop g4a-static-site
docker rm g4a-static-site
docker run --name g4a-static-site -d -p 127.0.0.1:8085:80 g4a-static:1.1

يساعدك الوسم الجديد على تمييز الإصدار المقصود. وفي التطوير قد تستخدم Bind mount لعرض تغييرات الملفات فورًا، لكن ذلك مسار مختلف عن تضمين ملفات ثابتة داخل صورة.

كيف تتعامل مع أخطاء البناء؟

إذا تعذّر العثور على Dockerfile، راجع مجلد الطرفية واسم الملف. وإذا فشلت COPY، تحقق من وجود الملف داخل سياق البناء ومن عدم استبعاده في .dockerignore. وإذا تعذّر تنزيل الصورة الأساسية، راجع الاتصال واسم الوسم قبل تعديل تعليمات المشروع.

البناء الناجح لا يثبت أن التطبيق سليم. اختبر التشغيل، وافحص السجلات، وافتح الصفحة المقصودة. كما لا تضع مفاتيح الوصول وكلمات المرور في ENV أو COPY على أساس أن الصورة «داخلية»؛ قد تُشارك الصورة أو تُفحص طبقاتها لاحقًا.

مهمة قصيرة بعد شرح Dockerfile

غيّر عنوان الصفحة إلى «الإصدار الثاني»، وابنِ الصورة بوسم جديد. سجّل ثلاثة أشياء: الملفات التي تغيرت، اسم الصورة الجديدة، واسم الحاوية التي تشغّلها. ستلاحظ أن الملفات والصورة والحاوية أجزاء منفصلة من دورة العمل، وأن كل تغيير يحتاج خطوة مناسبة كي يصل إلى المتصفح.

أسئلة شائعة

هل Dockerfile يشغّل الحاوية؟

يصف بناء الصورة وإعداداتها الافتراضية. تحتاج إلى docker run أو أداة مثل Compose لإنشاء الحاوية وتشغيلها.

هل EXPOSE يفتح المنفذ على جهازي؟

لا. نشر المنفذ يحتاج إلى إعداد مثل -p عند التشغيل.

هل أحتاج RUN في كل ملف؟

لا. مثال الصفحة الثابتة يكتفي بالصورة الأساسية ونسخ الملف. أضف RUN عندما تحتاج خطوة بناء فعلية.

هل تغيير Dockerfile يحدّث الحاوية القديمة؟

لا. ابنِ صورة جديدة ثم أعد إنشاء الحاوية بالإصدار المطلوب.

المصادر والمراجعة التقنية

استُلهم ترتيب موضوعات السلسلة من ملاحظات Narayan Prasad (@code.withnarayan). الشرح العربي والأمثلة والرسوم هنا إعداد مستقل، مع الرجوع إلى الوثائق الرسمية لتصحيح وتوسيع المفاهيم.

geekadmin

مقالات ومعرفة تقنية باللغة العربية.

اترك تعليقاً

قد يهمّك أيضًا