١. المقدمة
ما هو 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
: لتنزيل الملفات واختبار APIvim
: محرر نصوص بسيط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. كلاهما يُستخدم لتحديد أوامر تشغيل الحاوية، لكن لكل منهما استخدام وسلوك مختلف:
العنصر | 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 على البناء من الصفر وتطبيق جميع التغييرات.