المشكلة اللي قبل Docker
تخيّل تيم فرونت شغال على شاشة محتاجة الـ API. كل مرة يحتاج يجرّب حاجة جديدة، لازم الباك اند يرفع نسخة على سيرفر الـ test. ولو حد حاول يشغّل الباك اند على جهازه: نسخة Node مختلفة، Postgres مش متسطّب، متغيّر بيئة ناقص… والجملة المشهورة: “على جهازي شغالة!”
سنة ٢٠١٣ Docker طلع بفكرة بسيطة: بدل ما أشرح لكل واحد يسطّب إيه، أعمل image فيها كل اللي التطبيق محتاجه: الـ OS الخفيف، Node، الكود، والـ dependencies. أرفعها على Docker Hub، والفرونت ينزّلها ويشغّلها بأمر واحد.
المنافسين و OCI
Docker مش اللعيب الوحيد. في أدوات تانية بتعمل نفس الشغل، أشهرها:
طب إزاي image اتبنت بـ Docker تشتغل على Podman؟ هنا ييجي دور OCI (Open Container Initiative). دي منظمة اتعملت بمشاركة Docker و Google و Microsoft وغيرهم، وحطّت مواصفات ثابتة لشكل الـ image وإزاي تتشغّل. أي أداة ماشية على المواصفات دي تقدر تشغّل أي image ماشية عليها.
الـ Container runtime
الـ container runtime هو الحتة اللي بتشغّل الـ container فعلًا من الـ image. في طبقتين:
زي containerd و CRI-O: بيسحبوا الـ images، يديروا التخزين والشبكة، ويسلّموا الشغل للطبقة اللي تحت.
زي runc: هو اللي بيكلّم الـ kernel ويعمل العزل نفسه ويشغّل الـ process.
Container ولا Virtual Machine؟
الـ virtual machine نظام كامل منفصل: OS خاص بيه، و RAM و CPU متقسومين له، وفوقهم التطبيق. أما الـ container فـ بيشارك الـ host في الـ kernel وبياخد من الـ RAM والـ CPU على قد احتياجه.
| Virtual Machine | Container | |
|---|---|---|
| الـ OS | نظام كامل لكل VM | بيشارك kernel الـ host |
| الحجم | جيجات | ميجات في الغالب |
| وقت التشغيل | دقايق | ثواني أو أقل |
| العزل | أقوى (hardware متقسّم) | كويس بس أخف (على مستوى الـ kernel) |
| الاستخدام | تشغيل OS مختلف تمامًا | تشغيل تطبيقات كتير خفيفة |
الـ Orchestrators والـ Node
لما يبقى عندك containers كتير على أكتر من سيرفر، محتاج حد يدير الحكاية: يشغّل، يعيد التشغيل لو حاجة وقعت، يوزّع الحمل. ده الـ orchestrator، زي Kubernetes و Docker Swarm.
في عالمهم، كل ماكينة (حقيقية أو VM) بتشغّل containers اسمها node.
خلّصت الفصل لما
١) ليه الـ container أخف من الـ VM؟
٢) image اتبنت بـ Docker، ينفع تتشغّل بـ Podman؟
٣) مين اللي فعلًا بيعمل العزل ويشغّل الـ process؟
runc.