قبل أن نتعمق في ماهية Dockerfile، دعونا نجري تجربة صغيرة. هل تذكر صورة Python التي سحبناها في القسم السابق؟ لنبدأ بدخول الحاوية باستخدام الأمر docker run -it. تذكر ما يفعله المُعامل -it — فهو يُعيّن محطة طرفية زائفة (pseudo-TTY) للحاوية، مما يسمح للمستخدم بالتفاعل معها. بمجرد دخول الحاوية، دعنا نعرض جميع الملفات في الدليل الحالي:
[root@novita ~]# docker run -it python:3.7 /bin/bash
root@692f87774bf7:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@692f87774bf7:/#
بعد ذلك، سننشئ ملفًا باسم hello.py ثم نعرض جميع الملفات مرة أخرى:
root@692f87774bf7:/# touch hello.py
root@692f87774bf7:/# ls
bin boot dev etc hello.py home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
يمكنك رؤية أن hello.py قد تم إنشاؤه. الآن، دعنا نخرج من الحاوية ونعيد الدخول إلى الوضع التفاعلي للحاوية باستخدام نفس الأمر docker run -it python:3.7 /bin/bash، ثم نعرض جميع الملفات:
root@692f87774bf7:/# exit
exit
[root@novita ~]# docker run -it python:3.7 /bin/bash
root@65c767655e8a:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@65c767655e8a:/#
ربما لاحظت المشكلة الآن. من المثير للفضول أن الملف الذي أنشأناه سابقًا قد اختفى.
يرجع ذلك إلى أن الإجراءات التي تتم داخل الحاوية لا تُعدّل الصورة (image). الحاوية ببساطة تُضيف طبقة قابلة للكتابة فوق الصورة، تمامًا مثل ورقة التتبع فوق قالب الخط — بغض النظر عما تكتبه على ورقة التتبع، فإنه لا يؤثر على الطبقة الموجودة تحتها. هذه الميزة تشبه إلى حد ما لقطة حالة (snapshot) للآلة الافتراضية.
ولكن ها هي المشكلة: إذا كانت الإجراءات داخل الحاوية لا تُعدّل الصورة، فكيف يمكننا تحقيق النشر السريع دون تكرار عمليات معينة قبل كل نشر للكود؟ سيكون ذلك غير فعال.
لنفترض أنك قائد تقني لمنصة وسائط اجتماعية، وفجأة حدث حدث فيروسي يتطلب توسيع نطاق الخوادم السحابية إلى مئات بسرعة للتعامل مع حركة مرور المستخدمين الهائلة. اختار فريقك Docker لنشر التطبيق. إذا كنت ستستخدم الطريقة المذكورة أعلاه للنشر، فقد يشعر المستخدمون بخيبة أمل. بحلول الوقت الذي تتعافى فيه خدمتك، ربما يكون المستخدمون قد انتقلوا إلى منصة أخرى.
هنا يأتي دور Dockerfile. وفقًا للمقدمة الرسمية من Docker:
يمكن لـ Docker بناء الصور تلقائيًا عن طريق قراءة التعليمات من Dockerfile. Dockerfile هو مستند نصي يحتوي على جميع الأوامر التي يمكن للمستخدم استدعائها عبر سطر الأوامر لتجميع صورة. باستخدام docker build، يمكن للمستخدمين إنشاء بناء تلقائي ينفذ العديد من تعليمات سطر الأوامر بشكل متتالٍ.
بعبارة أبسط، Dockerfile هو مستند نصي يحتوي على جميع الأوامر اللازمة لبناء صورة من سطر الأوامر. إنه أشبه بدليل تعليمات لتجميع مجموعة من القطع في الصورة المطلوبة.
دعنا نستكشف كيفية بناء Dockerfile من سيناريو عملي، باستخدام صورة Python كمثال. على جهازي المحلي (خارج الحاوية)، يوجد نص برمجي بايثون باسم Optimal_Hotel_Matching.py. إنه برنامج لتجميع بيانات الويب. دعنا نحاول تشغيله داخل الحاوية:
كما هو متوقع، هناك خطأ لأن مكتبة HTTP requests، وهي وحدة تابعة لجهة خارجية، غير مثبتة في صورة Python. هذا سيناريو نموذجي حيث نحتاج إلى إعداد بيئة تبعية. دعنا نحاول حل هذه المشكلة باستخدام Dockerfile.
قبل كتابة أول Dockerfile لنا، دعنا نتعرف على بعض تعليمات Dockerfile الشائعة:
FROM: يحدد الصورة الأساسية للبناء.MAINTAINER: يصف منشئ الصورة بالاسم والبريد الإلكتروني.RUN: أحد أهم الأوامر في Dockerfile. ينفذ الأوامر في الحاوية ويُسجل النتائج.CMD: يحدد الأمر الذي سيتم تنفيذه عند بدء الحاوية.COPY: ينسخ الملفات من المضيف إلى نظام ملفات الحاوية.WORKDIR: يُعين دليل العمل لأية أوامرRUNأوCMDأوENTRYPOINTتتبع في Dockerfile.
الآن، دعنا نكتب أول Dockerfile لنا لمعالجة احتياجاتنا: تثبيت مكتبة requests وتشغيل النص البرمجي.
هذا حل محتمل:
FROM python:3.7 # تحديد الصورة الأساسية على أنها python:3.7
MAINTAINER ultra "tech@novita.ai" # اسم وبريد منشئ الصورة
RUN pip install requests # تثبيت مكتبة requests
WORKDIR /dockerfileTest # تعيين دليل العمل
COPY . . # نسخ محتويات الدليل الحالي إلى الحاوية
CMD ["python", "Optimal_Hotel_Matching.py"]# الأمر لتشغيل النص البرمجي
احفظ المحتوى أعلاه في ملف يُسمى Dockerfile في دليل مشروعك.
الآن، دعنا نبني الصورة باستخدام الأمر docker build، مع وضع علامة (tag) عليها لتسهيل التعرف عليها:
[root@novita dockerfileTest]# docker build --tag python:requests .
Sending build context to Docker daemon 5.12 kB
...
بعد اكتمال البناء، استخدم الأمر docker images للتحقق:
[root@novita dockerfileTest]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python requests 04f20acdc288 2 hours ago 926 MB
...
يمكنك رؤية أنه تم إنشاء صورة Python جديدة موسومة بـ requests محليًا. حاول تشغيل هذه الصورة لترى ما إذا كان خطأ No module named 'requests' قد اختفى، وإذا كان البرنامج يعمل كما هو متوقع.
[root@novita dockerfileTest]# docker run python:requests
Computing distance between 116.368816,39.866464 and 116.438946,39.921624
Computing distance between 116.370910,39.869603 and 116.438946,39.921624
...
نجاح! قامت الحاوية بتشغيل الكود ثم توقفت.
هل هذه هي النهاية؟
في هذه القطعة، شاركت تطبيقًا بسيطًا لملفات Dockerfile. في بيئات الإنتاج المؤسسية الفعلية، تميل ملفات Dockerfile إلى أن تكون أكثر تعقيدًا.
Novita AI هي المنصة السحابية الشاملة التي تعزز طموحاتك في الذكاء الاصطناعي. من خلال واجهات برمجة تطبيقات متكاملة بسلاسة، وحوسبة بدون خادم، وتسريع GPU، نوفر الأدوات الفعالة من حيث التكلفة التي تحتاجها لبناء وتوسيع نطاق أعمالك القائمة على الذكاء الاصطناعي بسرعة. تخلص من متاعب البنية التحتية وابدأ مجانًا - Novita AI تجعل أحلامك في الذكاء الاصطناعي حقيقة واقعة.
قراءة موصى بها:
