ما هو Docker ولماذا يجب على المطورين تعلمه؟
شرح عملي لـ Docker للمطورين: الحاويات مقابل الآلات الافتراضية، والأوامر الأساسية، و Dockerfiles، وكيفية البدء باستخدامه في المشاريع الحقيقية.
Docker يظهر بشكل مستمر في إعلانات الوظائف والأدلة الإعدادية، وإذا لم تتعامل قط مع الحاويات فقد يبدو أنك بحاجة إلى تسلق جدار قبل أن يُسمح لك بكتابة رمز حقيقي. الأمر ليس معقداً بمجرد أن تتجاوز المفردات.
ما هي الحاوية فعلاً
الحاوية تعبئ تطبيقك مع كل ما يحتاجه للعمل: الرمز، والوقت التشغيلي، وملكتبات النظام، وملفات الإعدادات. إنها ليست آلة افتراضية. الآلة الافتراضية تقوم بمحاكاة نظام تشغيل كامل بما فيه النواة، مما يعني أن بدء تشغيل واحدة قد يستغرق دقيقة ويستهلك عدة غيغابايت من الذاكرة. الحاوية تشارك نواة الآلة المضيفة وتعزل فقط العملية، لذا تبدأ في أقل من ثانية وتستخدم عادة عشرات الميغابايت بدلاً من الغيغابايت.
هذا الفرق هو السبب وراء السيطرة السريعة جداً لـ Docker على التطوير المحلي وخطوط أنابيب CI. يمكنك تشغيل قاعدة بيانات Postgres وذاكرة تخزين مؤقت Redis وخادم التطبيق الخاص بك على جهاز كمبيوتر واحد دون تثبيت أي منها مباشرة على نظام التشغيل الخاص بك.
الأجزاء الأساسية التي تحتاج إلى معرفتها
هناك أربعة مصطلحات تغطي معظم ما ستتعامل معه يومياً:
- Image: قالب للقراءة فقط مبني من Dockerfile. فكر فيه على أنه لقطة من نظام ملفات بالإضافة إلى بيانات وصفية حول كيفية تشغيله.
- Container: مثيل تشغيل من صورة. يمكنك بدء وإيقاف وحذف الحاويات دون لمس الصورة التي جاءت منها.
- Dockerfile: ملف نصي يحتوي على تعليمات لبناء صورة، سطراً تلو الآخر.
- Registry: حيث يتم تخزين الصور والسحب منها، الأكثر شيوعاً هو Docker Hub.
ـ Dockerfile الأدنى لتطبيق Node.js يبدو هكذا:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
قم ببنائه باستخدام docker build -t my-app . وقم بتشغيله باستخدام docker run -p 3000:3000 my-app. الراية -p تعيّن منفذاً على جهازك إلى منفذ داخل الحاوية، وهذا هو الطريقة التي تصل بها فعلاً إلى التطبيق من متصفحك.
الأوامر التي ستستخدمها باستمرار
حفنة من الأوامر تغطي معظم العمل اليومي:
docker ps— قائمة الحاويات قيد التشغيلdocker ps -a— قائمة كل الحاويات، بما فيها الحاويات المتوقفةdocker images— قائمة الصور على جهازكdocker logs <container>— تحقق من مخرجات حاوية قيد التشغيل أو متعطلةdocker exec -it <container> sh— افتح موجه أوامر داخل حاوية قيد التشغيلdocker rm/docker rmi— نظّف الحاويات والصور التي لم تعد تحتاجها
الزوج الأخير مهم أكثر مما يتوقع الناس. Docker سيسمح بسهولة بأن تختفي مساحة القرص في الصور القديمة والحاويات المتوقفة. تشغيل docker system prune بين الحين والآخر يستعيد مساحة مفاجئة.
لماذا يغير docker-compose سير العمل
معظم المشاريع الحقيقية تحتاج إلى أكثر من حاوية واحدة: خادم تطبيق، وقاعدة بيانات، وربما ذاكرة تخزين مؤقت. كتابة أوامر docker run لكل واحدة يصبح ممل بسرعة. docker-compose.yml يتيح لك تعريف المكدس كله في ملف واحد:
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: devpassword
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
قم بتشغيل docker compose up وكلا الخدمتين تبدآن معاً، موصولتين بحيث يمكن لـ web الوصول إلى db باسم الخدمة. هذا هو الإعداد الذي ستراه في ملف README في معظم مستودعات المصدر المفتوحة، وفهمه يعني أنك تستطيع استنساخ مشروع وتشغيله في دقائق بدلاً من تثبيت Postgres و Redis وأي شيء آخر يحتاجه التطبيق يدوياً.
حيث يتعثر الناس مبكراً
المجلدات تربك الجميع تقريباً في البداية. بدون مجلد، أي شيء مكتوب داخل حاوية يختفي عند إزالة الحاوية، وهذه مشكلة لقواعد البيانات. قسم volumes في ملف الإنشاء أعلاه ينسق مجلداً مسمى إلى مسار داخل الحاوية بحيث تبقى البيانات موجودة بعد إعادة التشغيل.
خطأ شائع آخر هو نسخ node_modules أو .git إلى الصورة لأنه لا يوجد ملف .dockerignore. أضف واحداً تماماً مثل .gitignore:
node_modules
.git
.env
هذا يحافظ على سرعة البناء وصغر حجم الصور، وهذا يهم عندما تبدأ بدفع الصور إلى السجل أو النشر إلى Kubernetes.
إلى أين بعد الأساسيات
عندما يصبح بناء وتشغيل الحاويات أمراً طبيعياً، المهارات المفيدة التالية هي البناء متعدد المراحل للحصول على صور إنتاجية أصغر، وفهم أوضاع شبكات Docker، وقراءة مخرجات docker inspect عندما لا يعمل شيء على التوصيل بشكل صحيح. لا شيء من هذا صعب، إنه غير مألوف فقط في المرة الأولى.
للمزيد عن وضع حاويات للتطبيقات الحقيقية وربطها بخطوط أنابيب نشر سحابي، راجع قسم DevOps والقسم السحابي في Korra Studio.
تمت كتابة هذا المقال بمساعدة الذكاء الاصطناعي، وراجعه ونشره Michal Pilch (CISSP)، Korra Studio.
هذه ملاحظة واحدة من قاعدة معارف Korra Studio — المنصة تجمع كل موضوع مع التوجيه الفردي.
ابدأ بالمجانarrow_forward