Docker & Kubernetes: حاويات الشحن، وليس التعليمات البرمجية
"إنه يعمل على جهازي" ليس عذرا مقبولا. كيف يضمن النقل بالحاويات الاتساق من التطوير إلى الإنتاج.
متلازمة “العمل على جهازي”.
المطور أ: “تسجيل الدخول يعمل على جهاز Mac الخاص بي.” المطور ب: “فشل على جهاز الكمبيوتر الشخصي الذي يعمل بنظام Windows.” الخادم: “إنه يتعطل على Linux لأن إصدار Node.js غير متطابق.” هذا هو ** الانجراف البيئي **. إنه يضيع آلاف الساعات. Docker يحل هذا. نحن لا نشحن “الرمز”. نحن نشحن “حاوية”. الحاوية عبارة عن جهاز افتراضي خفيف الوزن يحتوي على نظام التشغيل (Alpine Linux)، ووقت التشغيل (Node 18)، والتبعيات (node_modules)، والتعليمة البرمجية. إذا بدأت الحاوية على الكمبيوتر المحمول الخاص بك، فسوف تبدأ على الخادم. مضمون. إنها الوحدة القياسية للنشر.
لماذا يناقش Maison Code هذا الأمر
في Maison Code، نحن نقدر قابلية التكرار. إذا انضم مطور جديد إلى الفريق، فلا ينبغي له قضاء 3 أيام في تثبيت Redis وPostgres وImageMagick. يجب عليهم تشغيل “docker-compose up” والترميز خلال 10 دقائق. نحن نستخدم Kubernetes (K8s) لعملائنا من المؤسسات الذين يحتاجون إلى إمكانات واسعة النطاق وقدرات الإصلاح الذاتي. نتحدث عن هذا لأن DevOps ليس فكرة لاحقة؛ هذا هو أساس سرعة التنمية.
ملف Dockerfile: الوصفة
يحدد ملف Dockerfile كيفية إنشاء الحاوية.
# 1. الصورة الأساسية (صغيرة وآمنة)
من العقدة: 18-Alpine AS builder
# 2. تعيين الدليل
دليل العمل / التطبيق
# 3. تثبيت التبعيات (طبقة ذاكرة التخزين المؤقت)
نسخ الحزمة*.json ./
تشغيل npm ci
# 4. نسخ الرمز
نسخة . .
# 5. بناء
RUN npm تشغيل البناء
# --- البناء متعدد المراحل (التحسين) ---
# نتجاهل مرحلة "البناء" ونحتفظ فقط بعناصر الإنتاج
من العقدة:18-Alpine AS عداء
دليل العمل / التطبيق
نسخ --from=builder /app/.next ./.next
نسخ --from=builder /app/public ./public
نسخ --from=builder /app/node_modules ./node_modules
نسخ --from=builder /app/package.json ./package.json
# 6. ابدأ
CMD ["npm"، "بدء"]
نصيحة التحسين: الإنشاءات متعددة المراحل. في المثال أعلاه، نستخدم مرحلة “الإنشاء” لتجميع التعليمات البرمجية. ثم نقوم بنسخ النتيجة فقط إلى مرحلة العداء. لقد تركنا وراءنا “شفرة المصدر”، و”مترجم TypeScript”، و”DevDependeency”. النتيجة: استخدم صورة بحجم 100 ميجا بايت بدلاً من صورة بحجم 1 جيجا بايت. نشر أسرع، وقت تشغيل أكثر أمانًا.
Docker Compose: التنسيق المحلي
نادرًا ما تقوم بتشغيل حاوية واحدة فقط. يمكنك تشغيل تطبيق ويب وقاعدة بيانات وذاكرة تخزين مؤقت.
يقوم docker-compose.yml بتنسيقها.
“يامل الإصدار: ‘3’ الخدمات: الويب: بناء : . المنافذ: [“3000:3000”] البيئة: DATABASE_URL: postgres://user:pass@db:5432/myapp ديسيبل: الصورة: بوستجرس: 15 البيئة: POSTGRES_PASSWORD: تمرير إعادة: الصورة: ريديس: جبال الألب
الآن، يقوم `docker-compose up` بتدوير المكدس بأكمله. يمكن لحاوية "الويب" التحدث إلى "db" ببساطة عن طريق استخدام اسم المضيف "db". DNS السحري.
## Kubernetes (K8s): الكابتن
يقوم Docker بتشغيل الحاويات. Kubernetes ** يدير ** لهم.
إذا كان لديك خادم واحد، فاستخدم Docker.
إذا كان لديك 100 خادم، فاستخدم Kubernetes.
مقابض K8s:
1. **الإصلاح الذاتي**: "تحطمت الحاوية أ. أعد تشغيلها."
2. **القياس التلقائي**: "استخدام وحدة المعالجة المركزية مرتفع. أضف 5 حاويات أخرى."
3. ** التحديثات المستمرة **: "قم بتحديث الإصدار 1 إلى 2. قم بذلك واحدًا تلو الآخر. إذا زادت الأخطاء، قم بالتراجع تلقائيًا."
## تحذير "المبالغة".
Kubernetes معقد.
لديها منحنى تعليمي حاد (Pods، Deployments، Services، Ingress، Helm Charts).
**بالنسبة إلى 90% من الشركات الناشئة، تعتبر مبادئ K8 مبالغة.**
استخدم **PaaS (النظام الأساسي كخدمة)** مثل Vercel أو Railway أو AWS App Runner.
يقومون بتشغيل الحاويات نيابةً عنك دون الحاجة إلى إدارة مستوى التحكم العنقودي.
انتقل إلى K8 فقط عندما تحتاج إلى:
* الامتثال (الاستضافة داخل الشركة).
* تحسين التكلفة على نطاق واسع.
* شبكات الشبكات المعقدة.
## 7. Helm: مدير الحزم لـ K8s
ملفات K8s YAML مطولة.
"deployment.yaml" (50 سطرًا). `service.yaml` (20 سطرًا). "ingress.yaml" (30 سطرًا).
اضرب في 3 بيئات (Dev، Staging، Prod). إنه أمر لا يمكن السيطرة عليه.
**الحل**: الخوذة.
مخططات هيلم هي قوالب.
`helm install my-app ./charts/my-app --set image.tag=v2`
فهو يستبدل المتغيرات في القالب وينشر البيانات.
إنه "NPM لـ Kubernetes".
## 8.GitOps (ArgoCD): الحقيقة موجودة في Git
لا تقم أبدًا بتشغيل `kubectl Apply -f file.yaml` من الكمبيوتر المحمول الخاص بك.
يؤدي هذا إلى إنشاء "انجراف التكوين".
**الحل**: GitOps.
1. قم بتخزين جميع YAMLs في Git Repo (`infra-repo`).
2. قم بتثبيت **ArgoCD** في المجموعة.
3. يقوم ArgoCD بمراقبة Git Repo.
4. إذا دفعت التغيير إلى Git، فسيقوم ArgoCD بتطبيقه تلقائيًا على المجموعة.
5. إذا قام شخص ما باختراق المجموعة يدويًا، فسيقوم ArgoCD باكتشاف الاختلاف وإعادته (تكوين الإصلاح الذاتي).
تتطابق حالة الكتلة دائمًا مع Git.
## 10. صور خالية من الاضطراب: الأمان من خلال البساطة
Alpine Linux صغير الحجم (5 ميجابايت). ولكن لديها قذيفة (`/bin/sh`).
إذا دخل أحد المتسللين، فيمكنه تشغيل الأوامر.
**الحل**: صور Google "Distroless".
أنها تحتوي *فقط* على تطبيقك وتبعياته. لا شل. لا يوجد مدير الحزم. لا ليرة سورية.
إذا استغل أحد المتسللين ثغرة أمنية، فإنه يتحقق من "أنا هنا!"... وبعد ذلك لا يمكنهم فعل أي شيء. استخدم gcr.io/distroless/nodejs.
## 11. ميزانيات تعطيل الكبسولة (PDB)
لديك 3 نسخ متماثلة من API الخاص بك.
يريد Kubernetes ترقية العقدة (OS Patch).
يستنزف العقدة. إنه يقتل جميع النسخ المتماثلة الثلاثة مرة واحدة.
الموقع ينخفض.
**الإصلاح**: تحديد PDB. `الحد الأدنى متاح: 2`.
يُجبر K8s على قتل واحد، وانتظار بدء الجديد، ثم قتل التالي.
ويضمن ذلك **عدم حدوث أي عمليات نشر لوقت التوقف عن العمل** حتى أثناء صيانة البنية التحتية.
## 12. وجهة نظر المتشكك
"Docker بطيء على نظام Mac."
**نقطة مضادة**:
صحيح. يتم تشغيله في VM.
لكن تصحيح الأخطاء "لماذا يفشل `bcrypt` في نظام التشغيل Linux" يستغرق وقتًا أطول من نسبة الأداء البالغة 5%.
الاتساق> السرعة الخام.
## الأسئلة الشائعة
**س: Docker مقابل Virtual Machine (VM)؟**
ج: يلتقط الجهاز الظاهري الأجهزة (الثقيلة). تلتقط الحاوية مساحة مستخدم نظام التشغيل (الخفيفة).
يمكنك تشغيل 100 حاوية على خادم يمكنه استيعاب 5 أجهزة افتراضية فقط.
**س: هل Docker آمن؟**
ج: افتراضيًا نعم (العزل).
ولكن إذا قمت بتشغيل "الجذر" داخل الحاوية، وكان هناك استغلال للنواة، فيمكن للمهاجم الهروب.
**أفضل الممارسات**: أنشئ مستخدمًا عامًا (`RUN adduser app`) وقم بالتبديل إليه (`USER app`) في ملف Dockerfile.
## الخلاصة
الحاويات هي حاويات شحن التعليمات البرمجية.
قبل حاويات الشحن القياسية، كان تحميل السفينة عبارة عن فوضى (براميل، وأكياس، وصناديق).
الآن، كل شيء يناسب الصندوق القياسي. الرافعة لا تهتم بما بداخلها.
Docker يجعل التعليمات البرمجية الخاصة بك مربعًا قياسيًا. AWS هي الرافعة.
احزمها بشكل صحيح، ويمكنك شحنها إلى أي مكان.
## كوابيس النشر؟
إذا كانت عمليات النشر الخاصة بك غير مستقرة في حالات "لقد نجحت على جهازي"، فيمكن لـ **Maison Code** إرساء مكدسك.
نقوم بتنفيذ خطوط أنابيب CI/CD التي تقوم ببناء الحاويات واختبارها وشحنها تلقائيًا.
**[اتصل بنا](/contact) لتحقيق الاستقرار في عملياتك.**
---
<hr style="margin: 1rem 0" />
### معضلة النشر؟
نقوم بتخزين التطبيقات باستخدام Docker وننسقها مع Kubernetes لعمليات نشر مضادة للرصاص.
**[قم بتعيين مهندسينا المعماريين](/اتصل)**.