ثورة الحاويات (Containers): ما بعد الـ Virtual Machines
في الماضي، لعزل التطبيقات كنا نستخدم الآلات الافتراضية (Virtual Machines). كل VM تحتاج إلى نظام تشغيل كامل (Guest OS)، مما يستهلك جيجابايتات من الذاكرة العشوائية وعشرات الدقائق للتشغيل. ثم جاءت الحاويات (Containers)؛ وهي تستخدم نواة (Kernel) لينكس الأساسية الخاصة بالسيرفر المضيف، وتقوم فقط بعزل العمليات (Processes)، مما يجعل تشغيل الحاوية يأخذ ثوانٍ معدودة ويستهلك ميجابايتات قليلة.
كيف يعمل Docker تحت الغطاء؟
يعتمد Docker بالأساس على ميزتين في قلب نواة لينكس (Linux Kernel):
- Namespaces (فضاء الأسماء): تضمن العزل المطلق للعملية. العملية داخل الحاوية تظن أنها وحدها في النظام، لها مساحة Process IDs خاصة، وشبكة خاصة، ومجلد الجذر
/خاص بها. - Control Groups (cgroups): تضمن التحكم في الموارد (Resource Limiting). يمكنك عبر الـ cgroups إجبار الحاوية على عدم تجاوز 512MB من الذاكرة أو 10% من المعالج، حتى لو كان السيرفر يمتلك 128GB.
تثبيت Docker على Ubuntu/AlmaLinux
بدلاً من الطرق التقليدية، الطريقة الأفضل والموثوقة هي استخدام السكربت الرسمي لـ Docker:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
لمنع الحاجة لكتابة sudo مع كل أمر، قم بإضافة مستخدمك الحالي إلى مجموعة docker:
sudo usermod -aG docker $USER
# يجب تسجيل الخروج والدخول مجدداً ليتم تطبيق الصلاحيات
فهم أوامر Docker الأساسية المعمقة
تشغيل سيرفر ويب (Nginx) معزول في ثانية واحدة:
docker run -d --name my_web -p 8080:80 nginx
ماذا حدث هنا؟
-d: التشغيل في الخلفية (Detached).--name: اسم الحاوية.-p 8080:80: هذا توجيه منافذ (Port Forwarding)، يقوم بربط البورت 8080 في سيرفرك الأصلي بالبورت 80 داخل الحاوية المعزولة.
الـ Dockerfile: بناء صورتك الخاصة
المحترفون لا يستخدمون الصور الجاهزة فقط، بل يبنون صورهم (Images) الخاصة بملف Dockerfile. إليك مثال لبناء صورة لتطبيق Node.js أو PHP بسيط:
FROM php:8.2-fpm-alpine
WORKDIR /var/www/html
COPY . .
RUN chown -R www-data:www-data /var/www/html
CMD ["php-fpm"]
EXPOSE 9000
البناء يتم بأمر docker build -t my_php_app .
إدارة البيئات المعقدة مع Docker Compose
نادراً ما يعمل التطبيق كحاوية واحدة؛ تطبيق Laravel مثلاً يحتاج Nginx، PHP-FPM، و MySQL و Redis. إدارة 4 حاويات يدوياً أمر شاق، هنا يتألق docker-compose.yml:
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./src:/var/www/html
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
app:
build: .
volumes:
- ./src:/var/www/html
db:
image: mariadb:10.6
environment:
MYSQL_ROOT_PASSWORD: secret_password
MYSQL_DATABASE: laravel
تشغيل كل هذه المنظومة يتطلب أمراً واحداً فقط:
docker-compose up -d
هذا يجسد مفهوم (Infrastructure as Code)، حيث يتم كتابة البنية التحتية ككود يمكن مشاركته وتطبيقه على أي سيرفر آخر بثوانٍ.
هندسة الحاويات: مفاهيم متقدمة يجب أن تعرفها
شبكات دوكر (Docker Networks)
بشكل افتراضي، تعمل جميع الحاويات على شبكة تسمى `bridge`. لكن في المشاريع الكبيرة، يجب عزل التطبيقات حتى داخل السيرفر نفسه. يمكنك إنشاء شبكة خاصة بقاعدة البيانات وتطبيق الواجهة الخلفية بحيث لا يمكن لأي حاوية أخرى في السيرفر الوصول إليها:
docker network create backend-network
docker run -d --name db --network backend-network mariadb
docker run -d --name app --network backend-network my_laravel_app
بهذه الطريقة، الحاوية `app` تستطيع الوصول لـ `db` بالاسم مباشرة دون الحاجة لمعرفة عنوان הـ IP الداخلي الخاص بها.
إدارة التخزين في الحاويات (Docker Volumes)
الحاويات "مؤقتة" (Ephemeral). إذا قمت بحذف حاوية قاعدة البيانات، ستفقد كل بياناتك! الحل هو استخدام الـ Volumes. تخيل الـ Volume كـ USB فلاش درايف تقوم بتركيبه في الحاوية. حتى لو حُذفت الحاوية، البيانات تظل موجودة في الـ Volume على السيرفر المضيف ويمكن تركيبها في حاوية جديدة.
docker volume create db_data
docker run -d -v db_data:/var/lib/mysql mariadb
تحسين بناء الصور (Multi-stage Builds)
إذا كنت تقوم ببناء تطبيق React أو Vue، فإنك تحتاج إلى مكتبات Node.js و npm لتحزيم الكود (Build)، ولكنك لا تحتاجها لتشغيل التطبيق النهائي، بل تحتاج فقط لـ Nginx وملفات HTML/JS النهائية. استخدام Multi-stage build يقلل حجم الصورة من 1GB إلى 20MB فقط!
# المرحلة الأولى: البناء
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# المرحلة الثانية: التشغيل
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
💬 التعليقات
0 تعليقات