إتقان Docker: دليل المطور

٢٨ مارس ٢٠٢٦

Docker Mastery: A Developer's Guide

ملخص

  • بيئات متسقة: يضمن Docker تشغيل تطبيقك بنفس الطريقة بغض النظر عن مكان نشره - من جهازك المحمول إلى بيئة الإنتاج.
  • نشر مبسط: قم بتغليف تطبيقك وتبعياته في وحدة واحدة (حاوية) لنشر سهل وموثوق.
  • كفاءة الموارد: تشترك الحاويات في نواة نظام التشغيل المضيف، مما يجعلها خفيفة الوزن وفعالة مقارنة بالأجهزة الافتراضية.
  • القابلية للتوسع: قم بتوسيع تطبيقاتك بسهولة عن طريق تشغيل حاويات متعددة، يتم تنسيقها بواسطة أدوات مثل Docker Swarm أو Kubernetes.
  • أمن محسن: عزل التطبيقات داخل الحاويات للحد من تأثير الثغرات الأمنية.

ما ستتعلمه

  1. فهم المفاهيم الأساسية لـ Docker: الصور (images)، والحاويات (containers)، وملفات Dockerfiles.
  2. بناء صور Docker من الصفر وتحسينها من حيث الحجم والأداء.
  3. تشغيل الحاويات، وتعيين المنافذ (ports)، وربط وحدات التخزين (volumes)، وإدارة متغيرات البيئة.
  4. تنسيق التطبيقات متعددة الحاويات باستخدام Docker Compose.
  5. استيعاب أساسيات شبكات Docker والتواصل بين الحاويات.
  6. استكشاف خيارات تنسيق الحاويات مع Docker Swarm و Kubernetes.
  7. تنفيذ أفضل الممارسات الأمنية في Docker لحماية تطبيقاتك.
  8. استخدام Docker Hub لتخزين الصور والتكامل مع CI/CD.
  9. استكشاف أخطاء Docker الشائعة وإصلاحها وتصحيح مشكلات الحاويات.

المتطلبات الأساسية

  • إلمام أساسي بسطر الأوامر: يجب أن تكون مرتاحاً في التنقل بين المجلدات وتنفيذ الأوامر في Terminal. إذا كنت جديداً على سطر الأوامر، فراجع دليلنا حول أساسيات سطر الأوامر.
  • مفاهيم تطوير البرمجيات: فهم أساسي لمبادئ تطوير البرمجيات، مثل التطبيقات والتبعيات والبيئات، سيكون مفيداً.
  • أساسيات نظام التشغيل: الإلمام بمفاهيم نظام التشغيل مثل العمليات (processes) وأنظمة الملفات سيساعدك في الفهم.

في عالم تطوير البرمجيات، يعد ضمان الاتساق عبر البيئات المختلفة - التطوير والاختبار والإنتاج - تحدياً دائماً. فما يعمل بشكل مثالي على جهازك قد يفشل بشكل ذريع على الخادم. تقليدياً، تمت معالجة ذلك من خلال الأجهزة الافتراضية (VMs)، لكن الأجهزة الافتراضية تستهلك الكثير من الموارد ويمكن أن تكون بطيئة في التشغيل.

يقدم Docker حلاً أكثر كفاءة: الحاويات (containerization). بدلاً من محاكاة نظام التشغيل بالكامل افتراضياً، تقوم حاويات Docker بمحاكاة طبقة التطبيق افتراضياً. وهذا يعني أن الحاويات تشترك في نواة نظام التشغيل المضيف، مما يجعلها خفيفة الوزن ومحمولة وسريعة.

لقد أحدث Docker ثورة في نشر التطبيقات من خلال توفير طريقة قياسية لتغليف وتشغيل التطبيقات. فهو يبسط دورة حياة التطوير، ويحسن التعاون، ويتيح عمليات نشر أسرع وأكثر موثوقية. لقد كان التطور من الخوادم الفيزيائية -> الأجهزة الافتراضية -> الحاويات، حيث زادت كل خطوة من الكثافة وقللت من التكاليف الإضافية.

فهم أساسيات Docker

في قلب Docker تكمن ثلاثة مفاهيم أساسية: الصور (images)، والحاويات (containers)، وملفات Dockerfiles. فكر في الأمر على هذا النحو: الصورة هي المخطط، والحاوية هي نسخة عاملة من ذلك المخطط، وDockerfile هو الوصفة لإنشاء المخطط.

صور Docker: لبنات البناء

صورة Docker هي قالب للقراءة فقط يحتوي على التعليمات لإنشاء حاوية. وهي تتضمن كل ما يلزم لتشغيل التطبيق: الكود، ووقت التشغيل (runtime)، وأدوات النظام، ومكتبات النظام، والإعدادات. يتم بناء الصور في طبقات، تمثل كل منها تغييراً على الطبقة السابقة. نظام الطبقات هذا ضروري للكفاءة. إذا قمت بتغيير جزء صغير من تطبيقك، فسيتم إعادة بناء تلك الطبقة فقط، مما يوفر الوقت والموارد.

الصور الأساسية (Base Images): غالباً ما يتم بناء الصور من صور أساسية، والتي توفر أساساً لتطبيقك. تشمل الصور الأساسية الشائعة Ubuntu و Alpine Linux و Node.js.

تحسين حجم الصورة: الصور الأصغر أسرع في التنزيل والنشر. قلل حجم الصورة عن طريق:

  • استخدام صور أساسية خفيفة الوزن (مثل Alpine Linux).
  • إزالة الملفات والتبعيات غير الضرورية.
  • استخدام البناء متعدد المراحل (سيتم شرحه لاحقاً).

مثال: لنقم بإنشاء صورة بسيطة تشغل سكربت Python.

# Use an official Python runtime as a parent image
FROM python:3.9-slim-buster

# Set the working directory in the container
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Make port 80 available to the world outside this container
EXPOSE 80

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

يحدد ملف Dockerfile هذا خطوات بناء صورة بناءً على صورة Python 3.9 slim الرسمية. حيث يقوم بنسخ كود التطبيق، وتثبيت التبعيات، وتحديد الأمر الذي سيتم تشغيله عند بدء الحاوية.

تشغيل الحاويات: إحياء الصور

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

تعيين المنافذ (Port Mapping): تعمل الحاويات في مساحات أسماء شبكة معزولة. للوصول إلى التطبيقات التي تعمل داخل حاوية من الجهاز المضيف، تحتاج إلى تعيين المنافذ. على سبيل المثال، يقوم -p 8080:80 بتعيين المنفذ 80 داخل الحاوية إلى المنفذ 8080 على المضيف.

ربط وحدات التخزين (Volume Mounting): تسمح لك وحدات التخزين بالحفاظ على البيانات التي تنتجها الحاويات. كما تمكنك من مشاركة الملفات بين الجهاز المضيف والحاوية. يقوم -v /host/path:/container/path بربط مجلد من الجهاز المضيف بمجلد داخل الحاوية.

متغيرات البيئة: تسمح لك متغيرات البيئة بتهيئة تطبيقك دون تعديل الصورة. يقوم -e VARIABLE_NAME=value بتعيين متغير بيئة داخل الحاوية.

الوضع التفاعلي مقابل الوضع المنفصل:

  • الوضع التفاعلي (-it): يسمح لك بالتفاعل مع shell الخاص بالحاوية. مفيد لتصحيح الأخطاء والاختبار.
  • الوضع المنفصل (-d): يشغل الحاوية في الخلفية. مثالي لعمليات النشر في بيئة الإنتاج.

لتشغيل الصورة التي تم إنشاؤها أعلاه:

Docker build -t my-python-app .  # Build the image
Docker run -d -p 8080:80 my-python-app # Run the container in detached mode, mapping port 8080

ملفات Dockerfiles: أتمتة إنشاء الصور

ملفات Dockerfiles هي ملفات نصية تحتوي على تعليمات لبناء صور Docker. وهي توفر طريقة قابلة للتكرار ومؤتمتة لإنشاء الصور، مما يضمن الاتساق وقابلية إعادة الإنتاج.

التعليمات الشائعة:

  • FROM: تحدد الصورة الأساسية.
  • RUN: تنفذ الأوامر داخل الحاوية أثناء بناء الصورة.
  • COPY: تنسخ الملفات والمجلدات من الجهاز المضيف إلى الحاوية.
  • ADD: مشابه لـ COPY، ولكن يمكنه أيضاً فك الأرشيفات وجلب الملفات من روابط URL.
  • CMD: يحدد الأمر الافتراضي للتشغيل عند بدء الحاوية.
  • ENTRYPOINT: يهيئ الحاوية لتعمل كملف قابل للتنفيذ.
  • WORKDIR: يحدد مجلد العمل داخل الحاوية.
  • EXPOSE: يعلن عن المنافذ التي تستمع إليها الحاوية.

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

  • استخدم .dockerignore: استبعد الملفات والمجلدات غير الضرورية من سياق بناء الصورة لتقليل حجم الصورة ووقت البناء.
  • رتب التعليمات منطقياً: ضع التعليمات التي تتغير بشكل متكرر في أسفل Dockerfile للاستفادة من آلية التخزين المؤقت (caching) في Docker.
  • استخدم البناء متعدد المراحل: قلل حجم الصورة باستخدام عبارات FROM متعددة. المرحلة النهائية تشمل فقط الملفات الضرورية.

Docker Compose: التطبيقات متعددة الحاويات

Docker Compose يسهل إدارة التطبيقات متعددة الحاويات. فهو يسمح لك بتعريف وتشغيل تطبيقات معقدة تحتوي على خدمات متعددة في ملف YAML واحد (Docker-compose.yml).

تعريف الخدمات والشبكات والمجلدات (Volumes):

يحدد ملف Docker-compose.yml الخدمات التي يتكون منها تطبيقك، والشبكات التي تتصل بها، والمجلدات التي تستخدمها.

مثال: لنقم بإنشاء تطبيق ويب بسيط مع قاعدة بيانات.

version: "3.9"
services:
  web:
    build: ./web
    ports:
      - "8000:8000"
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgresql://user:password@db:5432/mydb

  db:
    image: postgres:13
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mydb
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

يحدد ملف Docker-compose.yml هذا خدمتين: web و db. يتم بناء خدمة web من Dockerfile في دليل ./web وتعتمد على خدمة db. تستخدم خدمة db صورة PostgreSQL 13 الرسمية. يتم استخدام المجلد db_data للحفاظ على بيانات قاعدة البيانات.

لبدء التطبيق:

Docker-compose up -d  # Start the application in detached mode

شبكات Docker: توصيل الحاويات

يوفر Docker عدة خيارات للشبكات لتوصيل الحاويات:

  • شبكات الجسر (Bridge Networks): نوع الشبكة الافتراضي. يمكن للحاويات الموجودة على نفس شبكة الجسر التواصل مع بعضها البعض باستخدام أسماء الحاويات الخاصة بها كأسماء مضيفين (hostnames).
  • شبكات المضيف (Host Networks): تشارك الحاويات مساحة اسم الشبكة الخاصة بالجهاز المضيف. يوفر هذا أفضل أداء ولكنه يضحي بالعزل.
  • شبكات التراكب (Overlay Networks): تُستخدم للشبكات متعددة المضيفين، مما يتيح للحاويات الموجودة على مضيفي Docker مختلفين التواصل مع بعضها البعض.

لا يمكن للحاويات الموجودة على شبكات مختلفة التواصل مباشرة ما لم يتم تكوينها صراحة للقيام بذلك. يوفر Docker دقة DNS داخل الشبكات، مما يسمح للحاويات بالتعرف على أسماء بعضها البعض.

أوركسترا Docker: القياس والإدارة

مع نمو تطبيقك، ستحتاج إلى توسيعه للتعامل مع حركة المرور المتزايدة. تعمل أدوات أوركسترا الحاويات (Container orchestration) على أتمتة نشر الحاويات وتوسيعها وإدارتها.

  • Docker Swarm: أداة الأوركسترا الأصلية من Docker. إعدادها واستخدامها بسيط نسبيًا، مما يجعلها خيارًا جيدًا لعمليات النشر الصغيرة.
  • Kubernetes: أداة أوركسترا أكثر قوة وتعقيدًا. توفر ميزات متقدمة مثل التوسع التلقائي (auto-scaling)، والإصلاح الذاتي (self-healing)، والتحديثات المتتالية (rolling updates).
الميزة Docker Swarm Kubernetes
التعقيد منخفض عالي
قابليته للتوسع متوسطة عالية
مجموعة الميزات أساسية متقدمة
منحنى التعلم سهل صعب
دعم المجتمع جيد ممتاز

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

الأمان أمر بالغ الأهمية عند نشر التطبيقات في الحاويات.

  • فحص الصور (Image Scanning): افحص صورك بانتظام بحثًا عن الثغرات الأمنية باستخدام أدوات مثل Trivy أو Clair.
  • أذونات المستخدم: قم بتشغيل الحاويات كمستخدمين غير جذر (non-root) للحد من تأثير الاختراقات الأمنية المحتملة.
  • أمن الشبكة: استخدم جدران الحماية وسياسات الشبكة لتقييد الوصول إلى الحاويات.
  • التحديثات المنتظمة: حافظ على تحديث Docker وصورك لسد الثغرات الأمنية.
  • مبدأ الامتياز الأقل: امنح الحاويات فقط الأذونات التي تحتاجها لتعمل.

تكامل Docker Hub و CI/CD

Docker Hub هو سجل عام لصور Docker. يسمح لك بتخزين ومشاركة الصور مع الآخرين.

البناء التلقائي: يمكن لـ Docker Hub بناء الصور تلقائيًا من مستودع الكود الخاص بك كلما قمت بدفع التغييرات.

تكامل CI/CD: قم بدمج Docker في خط أنابيب CI/CD الخاص بك لأتمتة بناء واختبار ونشر تطبيقاتك. يمكن استخدام أدوات مثل Jenkins و GitLab CI و CircleCI لتحفيز عمليات بناء ونشر Docker.

استكشاف أخطاء Docker الشائعة وإصلاحها

  • فشل بناء الصورة: تحقق من Dockerfile بحثًا عن أخطاء وتأكد من توفر جميع التبعيات.
  • أخطاء بدء تشغيل الحاوية: افحص سجلات (logs) الحاوية بحثًا عن رسائل الخطأ.
  • مشاكل اتصال الشبكة: تحقق من تكوين تعيينات المنافذ (port mappings) بشكل صحيح ومن أن جدران الحماية لا تمنع الوصول. استخدم Docker network inspect لفحص تكوينات الشبكة.

نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.