كيفية إنشاء Dockerfile احترافي باستخدام Ubuntu خطوة بخطوة [دليل 2025]

目次

١. المقدمة

ما هو Docker وDockerfile؟

في السنوات الأخيرة، أصبح 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

مثال:

RUN apt-get update && apt-get install -y --no-install-recommends 
    curl 
    git 
    && rm -rf /var/lib/apt/lists/*

هذا يجعل Dockerfile أخف وأسهل في الصيانة.

٤. بناء صورة Docker والتحقق منها

بناء صورة Docker من Dockerfile

بعد كتابة 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 في مجلد المشروع:

flask==2.3.2
requests>=2.25.1
pandas

ثم في Dockerfile:

COPY requirements.txt /app/requirements.txt
WORKDIR /app

RUN pip install --no-cache-dir -r requirements.txt

أفضل الممارسات

  • استخدم virtualenv أو venv لعزل بيئة Python وتجنب تعارض الاعتمادات
  • استخدم خيار --no-cache-dir عند تثبيت الحزم لتقليل حجم الصورة
  • قم بتحديث pip إلى آخر إصدار قبل تثبيت المكتبات (pip install --upgrade pip)

٦. المشاكل الشائعة وطرق التعامل معها

خطأ في الصلاحيات (Permissions)

مثال:

Permission denied

يظهر هذا الخطأ غالبًا عندما لا تكون للملفات حقوق التنفيذ، أو أن المستخدم غير صحيح.

الحل:

  • إعطاء الملفات صلاحية التنفيذ:
  RUN chmod +x script.sh
  • تغيير المالك عند الحاجة:
  RUN chown root:root /path/to/file

حزم مفقودة أو لا يمكن تثبيتها

مثال:

E: Unable to locate package xxx

يحدث هذا عادة إذا لم تقم بتحديث قائمة الحزم أو أخطأت في اسم الحزمة.

الحل:

  • تأكد من تنفيذ apt-get update قبل تثبيت أي حزمة:
  RUN apt-get update && apt-get install -y curl
  • تحقق من صحة اسم الحزمة

مشكلات في الشبكة أثناء البناء

مثال:

Temporary failure resolving 'deb.debian.org'

هذا الخطأ يشير عادة إلى مشكلة في DNS أثناء البناء.

الحل:

  • أعد تشغيل خدمة Docker:
  sudo systemctl restart docker
  • تعديل إعدادات DNS في /etc/docker/daemon.json:
  {
    "dns": ["8.8.8.8", "8.8.4.4"]
  }

البناء باستخدام الكاش القديم

يستخدم Docker الكاش لتحسين السرعة، مما قد يؤدي أحيانًا إلى تجاهل التغييرات الجديدة.

الحل:

  • ابنِ الصورة بدون الكاش:
  docker build --no-cache -t my-image .

أوامر التشغيل لا تعمل داخل الحاوية أو الحاوية تغلق فوراً

الأسباب:

  • خطأ في أوامر CMD أو ENTRYPOINT
  • تحديد CMD ["/bin/bash"] دون الوضع التفاعلي يؤدي لإغلاق الحاوية

الحل:

  • تشغيل الحاوية في وضع التصحيح (debug):
  docker run -it my-image /bin/bash
  • فهم الفرق بين CMD و ENTRYPOINT واختيار الأنسب حسب الغرض

مع تكرار التعامل مع هذه المشاكل، ستصبح أكثر كفاءة في كتابة Dockerfile وحل المشكلات.

٧. الخلاصة

مراجعة أهم نقاط إعداد Dockerfile على Ubuntu

في هذا المقال شرحنا كيفية إعداد بيئة Ubuntu باستخدام Dockerfile، من الأساسيات حتى الممارسات المتقدمة. دعونا نراجع النقاط الأساسية:

  • فهم الهيكل الأساسي لـ Dockerfile
    يجب تعلم كيفية استخدام التعليمات مثل FROM وRUN وCMD وENV لأتمتة إعداد البيئة.
  • Ubuntu كصورة أساسية تجمع بين الاستقرار والمرونة
    يوفر وفرة في الحزم، قاعدة مستخدمين واسعة، ودعم LTS مما يجعله أساساً مثالياً لبيئة التطوير.
  • إدارة الحزم بفعالية
    تعلم استخدام apt-get وإزالة الكاش والإعداد غير التفاعلي لتسريع البناء.
  • بناء بيئة عملية مثل Python
    باستخدام pyenv أو pip وrequirements.txt يمكنك بناء بيئة تطوير عالية التكرار والاعتمادية.
  • القدرة على التعامل مع المشاكل تعني تشغيل أكثر استقراراً
    فهم مشاكل الصلاحيات والشبكة والكاش تساعد في تحسين الكفاءة التقنية.

الخطوات التالية لتعلم Dockerfile

مع إتقان Dockerfile يمكنك التعامل مع التطوير والاختبار والنشر بسهولة. ننصحك بالتوسع في هذه المواضيع:

  • إدارة مشاريع متعددة الحاويات باستخدام Docker Compose
  • دمج Docker مع أدوات CI/CD مثل GitHub Actions أو GitLab CI
  • الربط مع أدوات تنظيم الحاويات مثل Kubernetes

روابط رسمية وموارد إضافية

٨. الأسئلة الشائعة (FAQ)

س1: أي إصدار Ubuntu يجب أن أستخدمه في Dockerfile؟

ج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. كلاهما يُستخدم لتحديد أوامر تشغيل الحاوية، لكن لكل منهما استخدام وسلوك مختلف:

العنصرCMDENTRYPOINT
قابلية التغييريمكن تغييره بأمر docker runلا يتغير عادةً (يُعتبر كوسائط فقط)
الغرضتحديد أمر افتراضي للتنفيذتحديد أمر دائم التنفيذ

مثال:

CMD ["python3", "app.py"]
# أو
ENTRYPOINT ["python3"]
CMD ["app.py"]

في الحالة الثانية، يمكن تمرير اسم سكربت آخر كوسيط.

س5: لماذا لا تظهر التغييرات بعد تعديل Dockerfile؟

ج5. يستخدم Docker الكاش أثناء البناء، لذا قد يتم تجاهل بعض التغييرات.
الحل:

docker build --no-cache -t my-image .

هذا يجبر Docker على البناء من الصفر وتطبيق جميع التغييرات.