Docker: الصور والحاويات والمجلدات
درس 1 من 3
1Docker: الصور والحاويات والمجلدات
الصورة الكبيرةDocker يضع تطبيقك مع كل ما يحتاجه (بايثون، المكتبات، الإعدادات) في صندوق واحد يعمل بنفس الطريقة على جهازك وجهاز زميلك والخادم.
ماذا تشاهد في الرسم: من الوصفة إلى الحاوية. البيانات الدائمة تُربط من خارج الحاوية حتى لا تضيع حين تُحذف.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
الصورة مثل قالب كعك، والحاوية كعكة خرجت منه. تستطيع أن تخبز عشر كعكات من نفس القالب، وكلها متطابقة، وترمي واحدة دون أن يتأثر القالب. لكن لو كتبت شيئًا على كعكة ورميتها ضاع، لهذا تحفظ ما يهمك في دفتر خارجي: هذا هو الـ volume.
الصورة طبقات للقراءة فقط مبنية من تعليمات Dockerfile، وكل تعليمة طبقة مخزّنة مؤقتًا. رتّب من الأقل تغيّرًا للأكثر: انسخ requirements.txt وثبّت أولًا، ثم انسخ الكود، فلا يُعاد التثبيت مع كل تعديل. الحاوية تضيف طبقة كتابة مؤقتة فوق الصورة. البيانات الدائمة: named volume يديره Docker، أو bind mount لمجلد من جهازك (للتطوير). صور صغيرة وآمنة: صورة أساس -slim، بناء متعدد المراحل، .dockerignore، مستخدم غير root، وإصدارات مثبّتة. Compose يعرّف عدة خدمات وشبكتها ومجلداتها في ملف واحد، والخدمات تتنادى بأسمائها.
قبل أن تبدأ
⌨️الطرفية
مسار أدوات المطوّر.
🧱خادم ويب
تطبيق Flask أو FastAPI أو Express يعمل محليًا.
الفكرة الجوهرية
1Dockerfile بطبقات مرتبة
كل سطر طبقة. ما يتغير نادرًا في الأعلى، وما يتغير كثيرًا (الكود) في الأسفل:
# Dockerfile FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . RUN useradd --create-home app USER app EXPOSE 8000 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
docker build -t cafe-api . docker run --rm -p 8000:8000 cafe-api docker ps # running containers docker logs <id> # what it printed
COPY . . قبل تثبيت المكتبات. أي تعديل في الكود يلغي الطبقة المخزنة، فيُعاد التثبيت كاملًا في كل بناء.2المجلدات: البيانات التي تبقى
احذف حاوية قاعدة بيانات بلا volume فتضيع كل البيانات. مع volume تبقى البيانات وتُربط بأي حاوية جديدة:
docker volume create cafe-data docker run -d --name db -e POSTGRES_PASSWORD=secret \ -v cafe-data:/var/lib/postgresql/data postgres:17 docker rm -f db # container gone docker run -d --name db -e POSTGRES_PASSWORD=secret \ -v cafe-data:/var/lib/postgresql/data postgres:17 # data still there
3Compose: التطبيق وقاعدته معًا
ملف واحد يصف الخدمتين، والتطبيق يصل للقاعدة باسم الخدمة db:
# compose.yaml
services:
api:
build: .
ports: ["8000:8000"]
environment:
DATABASE_URL: postgresql://cafe:secret@db:5432/cafe
depends_on:
db:
condition: service_healthy
db:
image: postgres:17
environment:
POSTGRES_USER: cafe
POSTGRES_PASSWORD: secret
POSTGRES_DB: cafe
volumes: ["cafe-data:/var/lib/postgresql/data"]
healthcheck:
test: ["CMD", "pg_isready", "-U", "cafe"]
interval: 5s
volumes:
cafe-data:docker compose up --build يبني ويشغّل كل شيء، وdocker compose down يوقف دون حذف المجلدات، وdown -v يحذفها أيضًا فانتبه.مثال محلول
المسألة: البناء يأخذ 4 دقائق مع كل تعديل سطر. التحليل: COPY . . في الأعلى، ومجلد .venv وnode_modules يُنسخان أيضًا. الحل: انسخ ملف المتطلبات وثبّت قبل نسخ الكود، وأضف .dockerignore فيه .venv و.git و__pycache__. البناء بعد تعديل الكود صار 5 ثوانٍ، والصورة أصغر بمئات الميغابايت.
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| الحاوية آلة افتراضية صغيرة. | تشارك نواة النظام المضيف، فهي أخف وأسرع بدءًا بكثير. |
| البيانات داخل الحاوية آمنة. | تضيع مع حذف الحاوية. البيانات الدائمة في volume. |
أين تقابله في العمل
🧑💻بيئة تطوير موحّدة
كل الفريق يشغّل نفس الإصدارات بأمر واحد.
🚀النشر
نفس الصورة المختبرة تذهب للإنتاج.
اختبر فهمك
ما الفرق بين الصورة والحاوية؟
من صورة واحدة تشغّل حاويات كثيرة.
لماذا تنسخ requirements.txt قبل الكود؟
الطبقات بعد أول تغيير تُعاد، فضع المتغير كثيرًا في الأسفل.
كيف يصل التطبيق لقاعدة البيانات في Compose؟
Compose ينشئ شبكة تتنادى فيها الخدمات بأسمائها.
بطاقات مراجعة سريعة
تحقق من فهمك
لماذا مستخدم غير root في الحاوية؟
لو اخترق أحد التطبيق تكون صلاحياته محدودة.
ما الذي يحذفه docker compose down -v؟
الحاويات والشبكة والمجلدات، أي البيانات أيضًا.
لماذا الصورة slim؟
أصغر حجمًا وأسرع تنزيلًا وأقل ثغرات.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.