دليل Docker للمطورين: الصور والحاويات وCompose
لقد قمت ببناء تطبيق يعمل على جهازك، ولكن عند نشره، تحدث مشاكل. المكتبات التابعة مفقودة، والإصدارات مختلفة، والإعدادات في حالة فوضى. يحل Docker هذه المشكلة عن طريق تغليف تطبيقك وبيئته في وحدة واحدة قابلة للنقل. تشرح هذه المقالة صور Docker والحاويات وDocker Compose مع أمثلة عملية حتى تتمكن من تبسيط سير عمل التطوير الخاص بك.
ما هي صورة Docker؟
صورة Docker هي قالب للقراءة فقط يحتوي على كود التطبيق الخاص بك، وبيئة التشغيل، والمكتبات، ومتغيرات البيئة، وملفات الإعدادات. فكر فيها كلقطة لبيئة تطبيقك. يتم بناء الصور من Dockerfile، وهو ملف نصي يحتوي على تعليمات.
إليك Dockerfile بسيط لتطبيق Node.js:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
كل تعليمة تنشئ طبقة. يتم تخزين الطبقات مؤقتًا، لذا فإن إعادة البناء بعد تغيير الكود تعيد تشغيل الخطوات من الطبقة المتغيرة فصاعدًا فقط. هذا يجعل عمليات البناء سريعة.
ما هي حاوية Docker؟
الحاوية هي نسخة قيد التشغيل من صورة. إنها عملية معزولة بنظام ملفاتها وشبكتها ومساحة عملياتها الخاصة، ولكنها تشترك في نواة نظام التشغيل المضيف. هذا يجعل الحاويات خفيفة وسريعة البدء مقارنة بالأجهزة الافتراضية.
لتشغيل حاوية من صورة:
docker run -d -p 3000:3000 --name myapp my-node-app
يبدأ هذا حاوية في الوضع المنفصل (-d)، ويربط المنفذ 3000 على المضيف بالمنفذ 3000 في الحاوية (-p 3000:3000)، ويسميها myapp.
الحاويات مؤقتة بشكل افتراضي. أي بيانات تُكتب داخلها تُفقد عند توقف الحاوية. للحفاظ على البيانات، استخدم وحدات التخزين (volumes):
docker run -v /host/data:/app/data my-node-app
لماذا نستخدم Docker Compose؟
غالبًا ما تحتاج التطبيقات الحقيقية إلى خدمات متعددة: خادم ويب، وقاعدة بيانات، وذاكرة تخزين مؤقت، إلخ. تشغيل كل منها باستخدام docker run وربطها يدويًا أمر شاق. يتيح لك 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 -d
ينشئ Compose شبكة حتى تتمكن الخدمات من الوصول إلى بعضها البعض بالاسم (مثل db وcache). كما يتعامل مع إنشاء وحدات التخزين وترتيب التبعيات.
أوامر Docker الأساسية للمطورين
docker build -t myapp .– بناء صورة من Dockerfile في الدليل الحالي.docker images– عرض الصور المحلية.docker ps– عرض الحاويات قيد التشغيل (أضف-aللكل).docker exec -it myapp sh– فتح صدفة داخل حاوية قيد التشغيل.docker logs myapp– عرض سجلات الحاوية.docker compose down– إيقاف وإزالة الحاويات والشبكات ووحدات التخزين المعرفة في Compose.
أفضل الممارسات لـ Docker في التطوير
- استخدم .dockerignore لاستبعاد node_modules و.git والملفات غير الضرورية الأخرى من سياق البناء.
- استفد من عمليات البناء متعددة المراحل للحفاظ على صور الإنتاج صغيرة. على سبيل المثال، ابنِ تطبيقك في مرحلة واحدة وانسخ فقط المخرجات إلى صورة تشغيل بسيطة.
- ثبّت الإصدارات في Dockerfile الخاص بك (مثل
node:18-alpineبدلاً منnode:latest) للحصول على عمليات بناء قابلة للتكرار. - استخدم وحدات التخزين للكود أثناء التطوير لإعادة التحميل الفوري:
volumes: - .:/appفي Compose. - لا تعمل كـ root في الإنتاج. أنشئ مستخدمًا غير جذري في Dockerfile الخاص بك.
المزالق الشائعة وكيفية تجنبها
المزلق 1: صور منتفخة. استخدام صورة نظام تشغيل كاملة مثل ubuntu يمكن أن يؤدي إلى صور بحجم 1 جيجابايت أو أكثر. استخدم المتغيرات slim أو alpine.
المزلق 2: عمليات بناء بطيئة. رتب تعليمات Dockerfile من الأقل إلى الأكثر تغيرًا. انسخ ملفات الحزم وثبّت التبعيات قبل نسخ الكود المصدري.
المزلق 3: فقدان البيانات. استخدم دائمًا وحدات التخزين لقواعد البيانات. بدونها، تختفي البيانات عند إزالة الحاوية.
المزلق 4: ارتباك الشبكات. في Compose، تتواصل الخدمات عبر شبكة افتراضية باستخدام أسماء الخدمات كأسماء مضيفين. لا تستخدم localhost للوصول إلى خدمة أخرى.
الأسئلة الشائعة
ما الفرق بين الصورة والحاوية؟
الصورة هي قالب للقراءة فقط؛ الحاوية هي نسخة قيد التشغيل من تلك الصورة. يمكنك تشغيل حاويات متعددة من نفس الصورة.
هل يمكنني استخدام Docker Compose في الإنتاج؟
Compose مخصص بشكل أساسي للتطوير والاختبار. للإنتاج، فكر في منسقات مثل Kubernetes أو Docker Swarm، على الرغم من أن Compose يمكن أن يعمل لعمليات النشر البسيطة.
كيف أقوم بتحديث حاوية بكود جديد؟
أعد بناء الصورة باستخدام docker build ثم أعد إنشاء الحاوية: docker compose up -d --build.
هل أنت مستعد لتبسيط سير عمل التطوير الخاص بك؟ جرب Nginx Log Analyzer لتصحيح أخطاء سجلات خادم الويب المحتواة بسرعة.