في السنوات الأخيرة، أصبح Docker ينتشر بسرعة كحل فعال لإعداد بيئة التطوير ونشر التطبيقات. يسمح Docker بتغليف التطبيق مع جميع الاعتمادات المطلوبة في “حاوية” واحدة، مما يضمن إمكانية تشغيله بنفس البيئة على أي نظام. لبناء حاويات Docker، تحتاج إلى “ملف التصميم” المعروف باسم Dockerfile. هذا الملف النصي يحدد صورة نظام التشغيل الأساسية، والبرمجيات التي يجب تثبيتها، وإعداد المتغيرات البيئية وغير ذلك. باستخدام Dockerfile، يمكن للمطورين إنشاء بيئة مخصصة تلقائيًا.
لماذا نستخدم Ubuntu كقاعدة؟
عند إنشاء Dockerfile، يجب عليك أولاً تحديد صورة نظام التشغيل الأساسية. من بين الخيارات الأكثر شيوعًا، نجد Ubuntu، وهي توزيعة Linux مبنية على Debian، معروفة بسهولة الاستخدام ووفرة الحزم التي تتيح بيئة مرنة. تشمل مزايا استخدام Dockerfile مبني على Ubuntu ما يلي:
تتوفر مستندات رسمية ومجتمعية غزيرة، مما يقلل من تكلفة التعلم
سهولة تثبيت العديد من الحزم والأدوات عبر APT
توفر صور رسمية خفيفة (مثل ubuntu:20.04 و ubuntu:24.04)
هدف ومحتوى هذا المقال والفئة المستهدفة
في هذا المقال، سنشرح كيفية إنشاء Dockerfile باستخدام Ubuntu كقاعدة، تحت كلمة البحث “Dockerfile Ubuntu“، بطريقة مفهومة للمبتدئين. سنغطي الهيكل الأساسي لـ Dockerfile، وخطوات إعداد بيئة Ubuntu، وأمثلة لإعداد بيئة تطبيقات مثل Python، بالإضافة إلى أشهر الأخطاء وكيفية التعامل معها. هذا المقال مناسب لـ:
المبتدئين الذين يريدون إعداد بيئة باستخدام Dockerfile لأول مرة
من يريد بيئة تطوير قابلة للتكرار على Ubuntu
من يرغب في فهم كيفية التعامل مع المشكلات التقنية الشائعة
٢. الهيكل الأساسي لـ Dockerfile
ما هو Dockerfile؟ فهم الدور والوظيفة
Dockerfile هو بمثابة وصفة لإنشاء صور Docker. يحدد أي نظام تشغيل سيتم استخدامه، وما هي البرمجيات التي ستثبت، وما هي الإعدادات، وذلك عبر ملف نصي. عند تنفيذ أمر docker build بناءً على هذا الملف، يمكنك إعداد بيئة تطوير أو تشغيل تطبيق بسهولة وبقابلية تكرار عالية. مزايا استخدام Dockerfile:
أتمتة إعداد البيئة (لا حاجة للتكرار اليدوي)
توحيد البيئة عند تطوير المشروع ضمن فريق
سهولة الدمج مع خطوط CI/CD
أهم التعليمات (Directives) في Dockerfile
يحتوي Dockerfile على عدة تعليمات أساسية. فيما يلي أشهرها، والتي سنستخدمها لإنشاء Dockerfile مبني على Ubuntu:
التعليمات
الوصف
FROM
تحديد صورة Docker الأساسية. مثال: FROM ubuntu:24.04
RUN
تشغيل أوامر shell. يُستخدم غالبًا لتثبيت الحزم
COPY
نسخ الملفات المحلية إلى الصورة
ADD
مماثل لـ COPY لكن يسمح بتنزيل الملفات من URL أو فك أرشيفات
WORKDIR
تحديد مجلد العمل
ENV
تعيين متغيرات البيئة
CMD
تحديد الأمر الذي يتم تنفيذه عند تشغيل الحاوية (قابل للتغيير)
ENTRYPOINT
مماثل لـ CMD لكن يتم تنفيذه بشكل إجباري
مثال Dockerfile بسيط مبني على Ubuntu
فيما يلي مثال أساسي على Dockerfile يستخدم Ubuntu:
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y
curl
vim
CMD ["/bin/bash"]
هذا الملف يستخدم Ubuntu 24.04 كقاعدة، ويثبت الأدوات curl وvim، ويشغل bash كأمر افتراضي.
اختيار العلامة (Tag) المناسبة لـ Ubuntu
يتم نشر صور Ubuntu الرسمية على Docker Hub. عند تحديد ubuntu:latest يتم اختيار أحدث إصدار تلقائيًا، لكن يُنصح بتحديد الإصدار بشكل صريح. مثال:
ubuntu:22.04 (إصدار LTS – دعم طويل المدى، مناسب للاستقرار)
ubuntu:24.04 (أحدث LTS، مخصص للميزات الأحدث)
اختر حسب ما إذا كنت تفضل الاستقرار أو الميزات الجديدة.
٣. عملي: إنشاء Dockerfile مبني على Ubuntu
تثبيت الحزم المطلوبة لبيئة Ubuntu
عند إعداد بيئة Ubuntu باستخدام Dockerfile، غالبًا ما تحتاج لتثبيت حزم إضافية مثل الأدوات الأساسية:
curl: لتنزيل الملفات واختبار API
vim: محرر نصوص بسيط
git: نظام إدارة الإصدارات
build-essential: مجموعة أدوات البناء للغات C/C++
لتثبيتها عبر Dockerfile:
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y
curl
vim
git
build-essential
ابدأ دومًا بـ apt-get update للحصول على أحدث قوائم الحزم.
إعداد التثبيت غير التفاعلي
عند تثبيت الحزم في Ubuntu، قد يتطلب الأمر إدخال المستخدم أحيانًا، لكن أثناء بناء Docker يجب أن يكون كل شيء تلقائي. لذا، يوصى بتعيين متغير البيئة التالي:
ENV DEBIAN_FRONTEND=noninteractive
هذا يتخطى مطالبات الإدخال أثناء التثبيت.
إزالة الكاش لتقليل حجم الصورة
يترك استخدام APT بعض الملفات المؤقتة التي تزيد من حجم صورة Docker. لتقليل الحجم:
RUN apt-get update && apt-get install -y
curl
vim
&& rm -rf /var/lib/apt/lists/*
من الأفضل أيضًا دمج الأوامر في RUN واحدة لتقليل عدد الطبقات.
أفضل الممارسات في كتابة Dockerfile
في بيئات العمل الواقعية، يُنصح باتباع أفضل الممارسات التالية:
دمج أوامر RUN قدر الإمكان لتقليل عدد الطبقات
استخدام ENV لتعريف الإعدادات والإصدارات
كتابة تعليقات توضيحية للعمليات الهامة
إزالة الملفات غير الضرورية واستخدام --no-install-recommends
بعد كتابة Dockerfile، يمكنك بناء صورة Docker باستخدام الأمر التالي من نفس المجلد:
docker build -t my-ubuntu-image .
خيار -t لتسمية الصورة (هنا my-ubuntu-image).
. تعني الدليل الحالي حيث يوجد Dockerfile.
سوف يقوم Docker بتنفيذ الأوامر داخل Dockerfile لإنشاء الصورة.
التحقق من الصور التي تم إنشاؤها
بعد البناء، استخدم:
docker images
سترى قائمة بالصور المحلية والمعلومات التالية:
REPOSITORY (اسم الصورة)
TAG (العلامة)
IMAGE ID (معرف فريد)
CREATED (وقت الإنشاء)
SIZE (الحجم)
مثال:
REPOSITORY TAG IMAGE ID CREATED SIZE
my-ubuntu-image latest abcd1234abcd 5 minutes ago 189MB
تشغيل حاوية Docker للتحقق من الأداء
لتأكد من عمل الصورة بشكل صحيح، شغل حاوية تفاعلية:
docker run -it my-ubuntu-image
الخيار -it لتشغيل الوضع التفاعلي (طرفية).
عند التشغيل بنجاح، ستحصل على سطر أوامر Ubuntu داخل الحاوية.
يمكنك التحقق من الأدوات المثبتة:
curl --version
vim --version
تنظيف الصور والحاويات غير الضرورية
عند التكرار في البناء والتجربة، قد تتراكم صور وحاويات غير مستخدمة. نظّفها دوريًا بالأوامر التالية:
حذف الحاويات المتوقفة:
docker container prune
حذف الصور غير المستخدمة:
docker image prune
حذف كل البيانات غير المستخدمة (تنبيه!):
docker system prune
هذا يوفر مساحة تخزين ويقلل المشاكل التقنية.
٥. متقدم: إعداد بيئة Python
إضافة بيئة Python إلى Dockerfile مبني على Ubuntu
يمكنك توسيع Dockerfile لإضافة بيئة تشغيل Python، مما يسمح باستخدام الحاوية للتطوير والاختبار وتعلم الآلة وغير ذلك. في العادة، من الأفضل تثبيت Python بنفسك لضمان التحكم في الإصدارات.
تثبيت Python باستخدام apt
أسهل طريقة هي استخدام APT:
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y
python3
python3-pip
&& rm -rf /var/lib/apt/lists/*
يمكنك الآن استخدام Python المستقر و pip لتثبيت الحزم المطلوبة.
إدارة إصدارات Python باستخدام pyenv
إذا كنت بحاجة لإدارة عدة إصدارات من Python أو تثبيت إصدار محدد، فاستخدم pyenv: مثال:
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y
git
curl
make
build-essential
libssl-dev
zlib1g-dev
libbz2-dev
libreadline-dev
libsqlite3-dev
wget
llvm
libncurses5-dev
libncursesw5-dev
xz-utils
tk-dev
libffi-dev
liblzma-dev
&& rm -rf /var/lib/apt/lists/*
# تثبيت pyenv
RUN git clone https://github.com/pyenv/pyenv.git ~/.pyenv
ENV PYENV_ROOT="$HOME/.pyenv"
ENV PATH="$PYENV_ROOT/bin:$PATH"
RUN echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
# تثبيت إصدار Python المطلوب
RUN pyenv install 3.11.6 && pyenv global 3.11.6
إدارة الحزم مع requirements.txt
غالبًا ما تحتاج المشاريع إلى عدة مكتبات Python. أنشئ ملف requirements.txt في مجلد المشروع:
ج1. يوصى عادةً باختيار LTS (دعم طويل المدى) لضمان الاستقرار والدعم، مثل ubuntu:22.04 أو ubuntu:20.04، حيث توفر دعمًا لمدة 5 سنوات.
أما إذا كنت تحتاج أحدث الحزم، يمكنك تجربة ubuntu:24.04، مع التأكد من اختبارها أولاً.
س2: لماذا تظهر رسالة “لا يمكن العثور على الحزمة” عند استخدام apt-get install؟
ج2. السبب الأكثر شيوعًا هو عدم تنفيذ apt-get update أولاً، مما يجعل قائمة الحزم قديمة. مثال صحيح:
RUN apt-get update && apt-get install -y curl
تحقق أيضًا من صحة اسم الحزمة (على سبيل المثال، استخدم python3 بدلاً من python).
س3: كيف أضبط متغيرات البيئة في Dockerfile؟
ج3. استخدم تعليمة ENV لتعيين المتغيرات، وتكون فعالة أثناء البناء والتشغيل. مثال:
ENV DEBIAN_FRONTEND=noninteractive
هذا يُستخدم لتعطيل الإدخالات التفاعلية أثناء التثبيت. كما يمكنك تعيين متغيرات لتكوين التطبيقات ومفاتيح API.
س4: ما الفرق بين CMD و ENTRYPOINT في Dockerfile؟
ج4. كلاهما يُستخدم لتحديد أوامر تشغيل الحاوية، لكن لكل منهما استخدام وسلوك مختلف:
العنصر
CMD
ENTRYPOINT
قابلية التغيير
يمكن تغييره بأمر docker run
لا يتغير عادةً (يُعتبر كوسائط فقط)
الغرض
تحديد أمر افتراضي للتنفيذ
تحديد أمر دائم التنفيذ
مثال:
CMD ["python3", "app.py"]
# أو
ENTRYPOINT ["python3"]
CMD ["app.py"]
في الحالة الثانية، يمكن تمرير اسم سكربت آخر كوسيط.
س5: لماذا لا تظهر التغييرات بعد تعديل Dockerfile؟
ج5. يستخدم Docker الكاش أثناء البناء، لذا قد يتم تجاهل بعض التغييرات. الحل:
docker build --no-cache -t my-image .
هذا يجبر Docker على البناء من الصفر وتطبيق جميع التغييرات.