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. الحالات الست للحاوية
من الإنشاء إلى الحذف، تمر الحاوية بست حالات.
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.
📖 ملخص
- للحاويات ست حالات: Created / Running / Paused / Stopped / Restarting / Dead
docker stopإغلاق تدريجي (SIGTERM)،docker killإنهاء قسري (SIGKILL)docker pauseيجمد العملية ويحتفظ بالذاكرة؛docker stopيحرر الذاكرةdocker logsيدعم المتابعة الفعلية بـ-f، والتصفية الزمنية بـ--since/--until، وحدود الأسطر بـ--taildocker statsيراقب الموارد،docker topيعرض العمليات،docker inspectيعرض الإعدادات- رمز الخروج 137 = OOM Kill، دليل رئيسي لاستكشاف مشاكل الحاويات
📝 تمارين
- تمرين أساسي (الصعوبة: ⭐): بعد بدء حاوية Nginx، أوقفها باستخدام
docker stop، ثم أعد تشغيلها باستخدامdocker start، وسجل تغييرات الحالة التي يعرضهاdocker ps -aبعد كل عملية. - تمرين متقدم (الصعوبة: ⭐⭐): استخدم
docker logs --tail 50 -fلعرض سجلات حاوية Nginx في الوقت الفعلي. قم بزيارةhttp://localhost:808010 مرات في متصفحك ولاحظ إدخالات الطلبات في السجلات. - تحدٍ (الصعوبة: ⭐⭐⭐): استخدم
docker exec -itللوصول إلى حاوية Nginx، وعدل محتويات/usr/share/nginx/html/index.html، ثم قم بزيارة الصفحة في متصفحك لتأكيد أن التغييرات قد سارية. فكر: هل سيتم الاحتفاظ بالتغييرات بعد حذف الحاوية؟ كيف يمكنك جعل التغييرات دائمة؟