Docker: إدارة دورة حياة الحاوية

آخر تحديث: 2026-08-26

الحاويات، مثل العمليات، لها دورة حياة كاملة — فهم انتقالات حالة الحاوية وأوامر التشغيل هو مهارة أساسية في عمليات Docker.

1. ما ستتعلمه



2. قصة حقيقية لمهندس عمليات

(1) نقطة الألم: حاويات الإنتاج تتعطل في الصباح الباكر

تعطلت حاوية الإنتاج الخاصة بتشارلي فجأة في الساعة الثالثة صباحًا. انطلق تنبيه المراقبة، لكن تشارلي لم يعرف سبب خروج الحاوية — هل كان خطأ OOM؟ أم استثناء تطبيق؟ أم تم إنهاؤها يدويًا؟ كان بحاجة إلى استكشاف المشكلة بسرعة دون الحاجة إلى إعادة بناء الحاوية.

(2) حلول التسجيل والمراقبة

أظهر docker logs خطأ OOM، وأكد docker stats تجاوز الذاكرة.

BASH
# التحقق من سجلات خروج الحاوية
docker logs --tail 50 myapp

# التحقق من استخدام موارد الحاوية
docker stats --no-stream

(3) الفائدة: تحديد السبب الجذري في 5 دقائق

اكتشف تشارلي خطأ "Out of memory" باستخدام docker logs، وأكد docker inspect أن رمز الخروج كان 137 (OOM Kill)، وعادت الحاوية إلى طبيعتها بعد تعديل معامل --memory. استغرق الأمر 5 دقائق فقط من التنبيه إلى الحل.



3. الحالات الست للحاوية

من الإنشاء إلى الحذف، تمر الحاوية بست حالات.

100%
stateDiagram-v2
    [*] --> Created : docker create
    Created --> Running : docker start
    Created --> Running : docker run
    Running --> Paused : docker pause
    Paused --> Running : docker unpause
    Running --> Stopped : docker stop / Ctrl+C
    Running --> Stopped : docker kill
    Stopped --> Running : docker start
    Running --> Restarting : تعطل العملية + سياسة إعادة التشغيل
    Restarting --> Running : نجاح إعادة التشغيل
    Restarting --> Stopped : فشل إعادة التشغيل
    Running --> Dead : خطأ غير قابل للاسترداد
    Stopped --> [*] : docker rm
    Dead --> [*] : docker rm

(1) شرح مفصل للحالات

الحالة الوصف المحفزات الشائعة
Created تم إنشاؤها لكنها لم تبدأ docker create / docker run (لم تبدأ بعد)
Running قيد التشغيل docker start / docker run -d
Paused متوقفة مؤقتًا (تم تجميد العملية) docker pause
Stopped متوقفة (خروج) docker stop / docker kill / خروج العملية
Restarting إعادة التشغيل تعطل الحاوية + تفعيل سياسة إعادة التشغيل
Dead غير قابلة للاسترداد خطأ داخلي في Docker (نادر جدًا)

(2) عرض حالة الحاوية

BASH
# عرض الحاويات قيد التشغيل (حالة Running فقط)
docker ps

# عرض جميع الحاويات (جميع الحالات)
docker ps -a

# التصفية حسب الحالة
docker ps -a --filter "status=exited"
docker ps -a --filter "status=running"


4. البدء والإيقاف وإعادة التشغيل

▶ مثال:بدء / إيقاف / إعادة تشغيل(الصعوبة ⭐)

BASH
# إنشاء وبدء حاوية
docker run -d --name web -p 8080:80 nginx:latest

# إيقاف الحاوية (إغلاق تدريجي)
docker stop web

# بدئها مرة أخرى
docker start web

# إعادة التشغيل (إيقاف + بدء في أمر واحد)
docker restart web

# التحقق من الحالة بعد كل عملية
docker ps -a --filter name=web

(1) docker stop مقابل docker kill

البُعد docker stop docker kill
الإشارة SIGTERM → فترة سماح → SIGKILL SIGKILL(افتراضي)
التدرج ✅ يمنح التطبيق 30 ثانية للتنظيف ❌ إنهاء فوري قسري
أمان البيانات يمكن للتطبيق كتابة البيانات وإغلاق الاتصال قد تُفقد البيانات غير المكتوبة
وقت الانتظار 30 ثانية افتراضيًا (-t قابل للتعديل) بدون انتظار
حالات الاستخدام الإغلاق الطبيعي الإنهاء القسري عند عدم استجابة الحاوية
BASH
# إيقاف تدريجي مع مهلة مخصصة (60 ثانية)
docker stop -t 60 web

# إنهاء فوري قسري
docker kill web

# إرسال إشارة مخصصة
docker kill -s SIGUSR1 web
💡 نصيحة: في بيئات الإنتاج، استخدم docker stop افتراضيًا؛ استخدم docker kill فقط إذا كانت الحاوية لا تستجيب. يجب أن يتعامل التطبيق بشكل صحيح مع إشارة SIGTERM لضمان إغلاق تدريجي.



5. الإيقاف المؤقت والاستئناف

▶ مثال:pause / unpause(الصعوبة ⭐⭐)

BASH
# إيقاف الحاوية مؤقتًا (تجميد جميع العمليات)
docker pause web

# التحقق: يجب أن تكون الحالة "Paused"
docker ps -a --filter name=web

# استئناف الحاوية
docker unpause web

(1) docker pause مقابل docker stop

البُعد docker pause docker stop
الآلية تجميد العملية (cgroup freeze) إرسال إشارة SIGTERM
الذاكرة تبقى في الذاكرة تُحرر الذاكرة
سرعة الاسترداد فورية (إذابة) تتطلب إعادة تشغيل العملية
المنفذ المستخدم لا يزال قيد الاستخدام مُحرر
حالات الاستخدام تحرير مؤقت لموارد CPU، تصحيح الأخطاء إيقاف الخدمة بشكل طبيعي
⚠️ ملاحظة: الحاويات المتوقفة مؤقتًا لا تزال تستهلك الذاكرة والمنافذ، لذا لا ينبغي تركها متوقفة مؤقتًا لفترات طويلة. استخدم docker stop عندما تحتاج إلى تحرير الموارد.



6. عرض سجلات الحاوية

▶ مثال: مراقبة سجلات الحاوية في الوقت الفعلي (الصعوبة: ⭐⭐)

BASH
# متابعة السجلات في الوقت الفعلي
docker logs -f web

# عرض آخر 100 سطر
docker logs --tail 100 web

# عرض سجلات آخر ساعتين
docker logs --since 2h web

# عرض السجلات بين أوقات محددة
docker logs --since "2024-01-15T10:00:00" --until "2024-01-15T12:00:00" web
💻 المخرجات:

TEXT 📖 للعرض فقط
10.0.0.1 - - [15/Jan/2024:10:05:22 +0000] "GET / HTTP/1.1" 200 615
10.0.0.1 - - [15/Jan/2024:10:05:23 +0000] "GET /favicon.ico HTTP/1.1" 404 555

(1) جدول مرجعي سريع لمعاملات السجلات

المعامل الوظيفة مثال
-f / --follow متابعة في الوقت الفعلي docker logs -f web
--tail N عرض آخر N سطر --tail 100
--since عرض السجلات من وقت محدد فصاعدًا --since 2h / --since "2024-01-15"
--until عرض السجلات قبل وقت معين --until 30m
-t / --timestamps عرض الطابع الزمني docker logs -t web


7. مراقبة موارد الحاوية واستكشاف الأخطاء

▶ مثال: مراقبة موارد الحاوية في الوقت الفعلي (الصعوبة: ⭐⭐)

BASH
# إحصائيات الموارد في الوقت الفعلي لجميع الحاويات
docker stats

# لقطة لمرة واحدة (بدون تدفق)
docker stats --no-stream

# إحصائيات لحاوية محددة
docker stats web --no-stream
💻 المخرجات:

TEXT 📖 للعرض فقط
CONTAINER ID   NAME   CPU %   MEM USAGE / LIMIT   MEM %   NET I/O     BLOCK I/O   PIDS
a1b2c3d4e5f6   web    0.02%   4.2MiB / 512MiB     0.82%   1.2kB / 0B  0B / 0B     9

▶ مثال: عرض العمليات داخل الحاوية (الصعوبة: ⭐)

BASH
# عرض العمليات الجارية داخل الحاوية
docker top web
💻 المخرجات:

TEXT 📖 للعرض فقط
UID    PID    PPID   C   STIME   TTY      TIME       CMD
root   1234   5678   0   10:05   ?        00:00:00   nginx: master process
www    1235   1234   0   10:05   ?        00:00:00   nginx: worker process

▶ مثال: عرض إعدادات الحاوية التفصيلية (الصعوبة: ⭐⭐)

BASH
# إعدادات الحاوية الكاملة (JSON)
docker inspect web

# استخراج حقول محددة
docker inspect web --format='{{.State.Status}}'
docker inspect web --format='{{.State.ExitCode}}'
docker inspect web --format='{{.NetworkSettings.IPAddress}}'
docker inspect web --format='{{.HostConfig.Memory}}'
💻 المخرجات:

TEXT 📖 للعرض فقط
running
0
172.17.0.2
536870912


8. الدخول إلى حاوية قيد التشغيل

▶ مثال: الدخول إلى حاوية باستخدام docker exec (الصعوبة: ⭐⭐)

BASH
# فتح shell تفاعلي داخل حاوية قيد التشغيل
docker exec -it web bash

# تنفيذ أمر واحد داخل الحاوية
docker exec web cat /etc/nginx/nginx.conf

# نسخ ملفات من الحاوية إلى المضيف
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
💡 نصيحة: docker exec لا ينشئ حاوية جديدة؛ بدلاً من ذلك، يبدأ عملية جديدة داخل حاوية قيد التشغيل. هذا مناسب لتصحيح الأخطاء والعمليات المؤقتة. تجنب الاعتماد على docker exec في بيئات الإنتاج — استخدم تركيب وحدات التخزين وجمع السجلات بدلاً من ذلك.



9. مثال كامل: محاكاة استكشاف أخطاء الحاوية

BASH
# ============================================
# شرح كامل: تشخيص تعطل الحاوية
# يغطي: تشغيل، تعطل، سجلات، inspect، إصلاح، إعادة تشغيل
# ============================================

# 1. بدء حاوية بذاكرة محدودة
docker run -d \
  --name crash-test \
  --memory=50m \
  --restart=on-failure:3 \
  nginx:latest

# 2. التحقق من أنها قيد التشغيل
docker ps --filter name=crash-test

# 3. محاكاة ضغط الذاكرة من داخل الحاوية
docker exec -it crash-test bash -c "dd if=/dev/zero of=/tmp/bigfile bs=1M count=100"

# 4. قد يتم إنهاء الحاوية بواسطة OOM، التحقق من الحالة
docker ps -a --filter name=crash-test

# 5. التحقق من رمز الخروج (137 = OOM Kill)
docker inspect crash-test --format='ExitCode: {{.State.ExitCode}}, OOMKilled: {{.State.OOMKilled}}'

# 6. التحقق من السجلات لمعرفة سبب التعطل
docker logs --tail 20 crash-test

# 7. التحقق من أحداث Docker لـ OOM
docker events --filter event=oom --since 5m

# 8. الإصلاح: زيادة حد الذاكرة (تحتاج إلى إعادة إنشاء)
docker stop crash-test
docker rm crash-test
docker run -d \
  --name crash-test \
  --memory=256m \
  --restart=on-failure:3 \
  nginx:latest

# 9. التحقق من الإصلاح
docker ps --filter name=crash-test
docker stats crash-test --no-stream
💻 المخرجات (مقتطف):

TEXT 📖 للعرض فقط
# docker inspect --format
ExitCode: 137, OOMKilled: true

# docker events
2024-01-15T10:05:22Z container oom crash-test...

# بعد الإصلاح
CONTAINER ID   IMAGE          STATUS         NAMES
b2c3d4e5f6a7   nginx:latest   Up 10 seconds  crash-test

❓ أسئلة شائعة

س هل لا تزال البيانات موجودة بعد إيقاف الحاوية؟
ج نعم. إيقاف الحاوية يوقف العملية فقط؛ نظام الملفات يبقى على القرص. يمكنك استعادته باستخدام docker start. ومع ذلك، ستفقد البيانات بعد حذف الحاوية بـ docker rm — ما لم يتم تركيب وحدة تخزين.
س ما الفرق بين docker stop و docker kill؟
ج stop يرسل إشارة SIGTERM، مما يمنح التطبيق 30 ثانية للإغلاق التدريجي (لإكمال الكتابات وإغلاق الاتصالات)؛ إذا انتهت المهلة، يرسل إشارة SIGKILL. kill يرسل إشارة SIGKILL فورًا لإنهاء العملية. في بيئة الإنتاج، استخدم stop كلما أمكن؛ استخدم kill فقط عندما لا تستجيب الحاوية.
س كيف يمكنني إعداد حاوية لإعادة التشغيل تلقائيًا بعد التعطل؟
ج أضف --restart=always أو --restart=unless-stopped عند بدء الحاوية. "always" يعيد تشغيل الحاوية بغض النظر عن سبب الإنهاء؛ "unless-stopped" يمنع إعادة التشغيل التلقائي بعد الإيقاف اليدوي. يوصى بـ unless-stopped لخدمات الويب الإنتاجية.
س ماذا أفعل إذا كانت ملفات سجل الحاوية كبيرة جدًا؟
ج برنامج تشغيل السجل الافتراضي في Docker، json-file، لا يدور السجلات تلقائيًا، لذا قد تنمو السجلات بلا حدود. قم بتكوين حدود السجل عند بدء التشغيل: docker run --log-opt max-size=10m --log-opt max-file=3، مما يحد كل ملف سجل بـ 10 ميجابايت ويحتفظ بحد أقصى 3 ملفات.
س كيف أدخل إلى حاوية قيد التشغيل؟
ج docker exec -it <حاوية> bash (أو sh). هذه هي طريقة تصحيح الأخطاء الأكثر شيوعًا. إذا لم تكن الحاوية تحتوي على bash، استخدم docker exec -it <حاوية> sh. يمكنك أيضًا استخدام docker attach للاتصال، لكنه يتصل بـ stdin العملية الرئيسية، والضغط على Ctrl+C سيوقف الحاوية، لذا لا يُستخدم عادةً.
س ماذا يعني رمز الخروج 137؟
ج 137 = 128 + 9، حيث 9 هو رقم الإشارة لـ SIGKILL. عندما يتم إنهاء حاوية بواسطة OOM Killer، يكون رمز الخروج 137. رموز الخروج الشائعة الأخرى: 0 = خروج طبيعي، 1 = خطأ تطبيق، 2 = استخدام خاطئ للأمر، 125 = خطأ Docker daemon.

📖 ملخص


📝 تمارين

  1. تمرين أساسي (الصعوبة: ⭐): بعد بدء حاوية Nginx، أوقفها باستخدام docker stop، ثم أعد تشغيلها باستخدام docker start، وسجل تغييرات الحالة التي يعرضها docker ps -a بعد كل عملية.
  2. تمرين متقدم (الصعوبة: ⭐⭐): استخدم docker logs --tail 50 -f لعرض سجلات حاوية Nginx في الوقت الفعلي. قم بزيارة http://localhost:8080 10 مرات في متصفحك ولاحظ إدخالات الطلبات في السجلات.
  3. تحدٍ (الصعوبة: ⭐⭐⭐): استخدم docker exec -it للوصول إلى حاوية Nginx، وعدل محتويات /usr/share/nginx/html/index.html، ثم قم بزيارة الصفحة في متصفحك لتأكيد أن التغييرات قد سارية. فكر: هل سيتم الاحتفاظ بالتغييرات بعد حذف الحاوية؟ كيف يمكنك جعل التغييرات دائمة؟
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%