دليل Docker للمطورين: الصور والحاويات و Compose
ربما سمعت عن Docker وكيف يمكنه تبسيط سير عمل التطوير الخاص بك. ولكن عند أول لقاء مع مصطلحات مثل الصور والحاويات وDocker Compose، قد يبدو الأمر مربكًا. يزيل هذا الدليل الغموض ويوضح لك بالضبط كيفية استخدام Docker بفعالية في مشاريعك.
ما هو Docker ولماذا يجب أن تهتم؟
Docker هو منصة تقوم بتغليف تطبيقك وتبعياته في وحدة موحدة تسمى حاوية. الحاويات خفيفة الوزن ومحمولة ومعزولة عن بعضها البعض. إنها تحل مشكلة "يعمل على جهازي" الكلاسيكية من خلال ضمان تشغيل تطبيقك بنفس الطريقة في كل مكان.
على عكس الأجهزة الافتراضية، تشترك الحاويات في نواة نظام التشغيل المضيف، مما يجعلها أسرع في البدء وأكثر كفاءة. هذا هو السبب في أن Docker أصبح أساسيًا في خطوط التطوير والنشر الحديثة.
الصور مقابل الحاويات: اللبنات الأساسية
الصورة هي قالب للقراءة فقط يحتوي على كود تطبيقك ووقت التشغيل والمكتبات والإعدادات. الحاوية هي نسخة قيد التشغيل من صورة. فكر في الصورة كفئة (class) والحاوية ككائن (object).
يمكنك إنشاء الصور باستخدام Dockerfile. إليك مثال بسيط لتطبيق Node.js:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
كل سطر في Dockerfile ينشئ طبقة. يتم تخزين الطبقات مؤقتًا، لذا تكون عمليات إعادة البناء أسرع عندما تتغير الخطوات اللاحقة فقط.
أوامر Docker الشائعة
docker build -t my-app .— بناء صورة من الدليل الحاليdocker run -p 3000:3000 my-app— تشغيل حاوية وربط المنافذdocker ps— عرض الحاويات قيد التشغيلdocker stop <container_id>— إيقاف حاويةdocker rmi <image_id>— إزالة صورة
Docker Compose: إدارة التطبيقات متعددة الحاويات
غالبًا ما تحتاج التطبيقات الواقعية إلى أكثر من خدمة واحدة: خادم ويب، قاعدة بيانات، ذاكرة تخزين مؤقت. يتيح لك Docker Compose تعريف وتشغيل تطبيقات متعددة الحاويات باستخدام ملف YAML واحد.
إليك ملف docker-compose.yml لتطبيق Node.js مع PostgreSQL و Redis:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
cache:
image: redis:7
volumes:
pgdata:
قم بتشغيل docker compose up وستبدأ جميع الخدمات معًا. يضمن depends_on بدء قاعدة البيانات وذاكرة التخزين المؤقت قبل خدمة الويب.
أوامر Compose الرئيسية
docker compose up -d— بدء جميع الخدمات في الوضع المنفصلdocker compose down— إيقاف وإزالة الحاويات والشبكاتdocker compose logs -f web— متابعة سجلات خدمة معينةdocker compose exec web sh— فتح صدفة داخل حاوية قيد التشغيل
أفضل الممارسات للتطوير
- استخدم .dockerignore لاستبعاد node_modules و .git والملفات غير الضرورية الأخرى من سياق البناء.
- اجعل الصور صغيرة باستخدام صور مبنية على Alpine وعمليات بناء متعددة المراحل.
- لا تعمل كـ root — أنشئ مستخدمًا غير root في Dockerfile الخاص بك لأغراض الأمان.
- استخدم وحدات التخزين (volumes) للبيانات الدائمة و bind mounts لإعادة تحميل الكود المباشر أثناء التطوير.
- ثبّت الإصدارات في Dockerfile وملف Compose لتجنب التحديثات غير المتوقعة.
متى تستخدم Docker (ومتى لا تستخدمه)
يتألق Docker عندما تحتاج إلى بيئات متسقة عبر الفرق، أو إدارة سهلة للتبعيات، أو الخدمات المصغرة. قد يكون مبالغًا فيه للمواقع الثابتة البسيطة أو النصوص البرمجية. قم بالتقييم بناءً على تعقيد مشروعك واحتياجات النشر.
الأسئلة الشائعة
ما الفرق بين الصورة والحاوية؟
الصورة هي قالب ثابت؛ الحاوية هي نسخة قيد التشغيل من تلك الصورة. يمكنك تشغيل حاويات متعددة من نفس الصورة.
هل أحتاج إلى Docker Compose لحاوية واحدة؟
لا، لحاوية واحدة يمكنك استخدام docker run. يكون Compose مفيدًا عندما يكون لديك خدمات متعددة تحتاج إلى التواصل.
كيف أحافظ على البيانات في Docker؟
استخدم وحدات التخزين (volumes) أو bind mounts. يتم إدارة وحدات التخزين بواسطة Docker وهي مثالية لقواعد البيانات؛ تقوم bind mounts بربط دليل المضيف داخل الحاوية، وهي مفيدة للتطوير.
هل أنت مستعد لتحسين تطبيقاتك المعتمدة على Docker؟ إذا كنت تعمل مع سجلات Nginx داخل الحاويات، جرب محلل سجلات Nginx الخاص بنا لتحليل السجلات بسرعة.