شنو هو Docker؟ شرح مبسط للمبتدئين
مرحبا بيك يلا كنتي devops engineer ولا sysadmin ولا غير مهتم بمجال المعلوميات، ضروري تكون سمعتي بكلمة Docker. فشنو هو بالضبط هاد Docker وعلاش داير هاد الضجة كلها؟ فهاد المقال، غانشرحو هادشي بطريقة ساهلة ومبسطة.
علاش جا Docker؟ المشكل ديال “خدامة عندي فالبيسي”
تخيل راسك صاوبتي واحد application بال Python مثلا. باش تخدمها، خاصك Python بواحد ال version معينة، وخاصك بزاف ديال المكتبات (libraries) محددة. صاوبتي كلشي وخدم ليك داكشي ناضي فالحاسوب ديالك.
ملي جيتي تعطي هاد ال application لشي صاحبك باش يجربها، ولا بغيتي تحطها فشي server باش تولي online، هنا كيبداو المشاكل: “آه معنديش نفس ال version ديال Python"، “ناقصاني واحد المكتبة”، “هادشي خدام ف Windows وماخدامش ف Linux”. هادي هي المشكلة المشهورة ديال “It works on my machine”.
هنا فين كايجي الدور ديال Docker.
شنو هو الحل لي كيقدمو Docker؟
Docker هو واحد المنصة (platform) لي كتخليك “تغلّف” ال application ديالك مع كاع داكشي لي كتحتاجو باش تخدم (بحال المكتبات، ال runtime, الأدوات…) فواحد الباكيج واحد معزول ومستقل، هاد الباكيج كيتسمى container.
الفكرة مستوحاة من حاويات الشحن البحرية. كيفما الحاوية تقدر تهز أي حاجة (سيارات، ملابس، أكل…) وكتسهال عملية النقل ديالها بأي باخرة أو شاحنة بلا ميهمهوم شنو كاين لداخل، حتى ال Docker container كيهز ال application ديالك وكتقدر تخدمو فأي بلاصة كتدعم Docker (البيسي ديالك، البيسي ديال صاحبك، server ف cloud…) بلا مشاكل ديال التوافق.
المفاهيم الأساسية ديال Docker
باش تفهم Docker مزيان، خاصك تعرف هاد المصطلحات:
Image: هو القالب أو النموذج (template) لي كيكون للقراءة فقط (read-only). هو بحال شيclassفالبرمجة. هاد الImageفيه التعليمات كاملة باش تصاوب الcontainer. مثلا،imageديال واحد التطبيقNode.jsغايكون فيه نظام تشغيل خفيف (lightweight OS) + الNode.js runtime+ الكود ديال التطبيق ديالك.Container: هو نسخة خدامة (running instance) من داك الImage. هو بحال شيobjectمن ديك الclass. تقدر تصاوب شحالما بغيتي ديال الcontainersمن نفس الimage. كلcontainerكيكون معزول على خوه وعلى النظام الرئيسي (host machine).Dockerfile: هو واحد الملف نصي (text file) كتكتب فيه الأوامر والتعليمات خطوة بخطوة باشDockerيبني ليك واحد الImageمخصص للتطبيق ديالك. هو الوصفة باش تطيب الكيكة (الImage).Docker Hub/Registry: هو بحالGitHubولكن ديال الImages. هو واحد البلاصةonlineفين تقدر تلقىimagesواجدين (بحالimageديالUbuntu,Node.js,MySQL…) وتقدر حتى نتا تحط فيه الimagesديالك.
مثال بسيط: Dockerfile
تخيل عندنا application بسيطة ب Node.js. هادا مثال ديال Dockerfile ديالها:
# 1. kankhtaro l image l asasiya li ghadi nbniw 3liha
# hna khtarina l image rasmiya dyal node.js l version 18
FROM node:18-alpine
# 2. kan7addo l working directory li khadi nkhdmo fih
WORKDIR /app
# 3. hna kancopiw l package.json w package-lock.json
COPY package*.json ./
# 4. kan installiw libraries li kay7tajha l application dyalna
RUN npm install
# 5. kancopiw l code dyal tatbi9 dyalna
COPY . .
# 6. hna kan7addo l port li l container dyalna ghadi ykhdm fih
EXPOSE 3000
# 7. l amr li ghadi ytnfd mli ybda l container
CMD ["node", "server.js"]
بهاد الملف البسيط، أي واحد عندو Docker يقدر يبني نفس ال Image ويخدم نفس ال Container بلا حتى شي مشكل.
تحياتي، كان معاكم براهيم