Docker: إدارة صور Docker

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

الصور هي اللبنات الأساسية لـ Docker — إتقان إدارة الصور يعني إتقان "مستودع البرمجيات" في عالم الحاويات.

1. ما ستتعلمه



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

(1) نقطة الألم: تنبيه القرص في خادم CI

تلقى بوب تنبيهًا بشأن القرص من خادم CI — كانت صور Docker تشغل 40 جيجابايت من المساحة. عند التحقيق، وجد عددًا كبيرًا من الصور اليتيمة <none> (بقايا من عمليات بناء قديمة) وخمسة إصدارات من صور Node.js (1.2 جيجابايت لكل منها)، على الرغم من أن الفريق لم يكن بحاجة فعليًا سوى لأحدث إصدارين. كان القرص ممتلئًا بنسبة 80%، وبدأت عمليات البناء بالفشل.

(2) حل تنظيف الصور

حذف بوب 20 جيجابايت من الصور غير المستخدمة بثلاثة أوامر فقط.

BASH
# إزالة الصور المعلقة (بقايا بدون وسم)
docker image prune -f

# إزالة الصور غير المستخدمة من قبل أي حاوية
docker image prune -a -f

# التحقق من استخدام القرص بعد التنظيف
docker system df

(3) الفائدة: استعادة مساحة القرص

تم تحرير 20 جيجابايت من المساحة، وانخفض استخدام القرص من 80% إلى 35%، واستأنفت عمليات بناء CI العمل الطبيعي.



3. الصور و Docker Hub

(1) مكونات الصورة

تتكون صورة Docker من طبقات متعددة للقراءة فقط مكدسة فوق بعضها البعض، حيث تمثل كل طبقة تغييرًا في نظام الملفات.

100%
graph TB
    L4["CMD ['nginx', '-g', 'daemon off;']<br/>أمر البدء"]
    L3["COPY html /usr/share/nginx/html<br/>كود التطبيق"]
    L2["RUN apt-get install nginx<br/>تثبيت البرنامج"]
    L1["FROM debian:bookworm-slim<br/>النظام الأساسي"]
    L4 --> L3 --> L2 --> L1

(2) اصطلاحات تسمية الصور

TEXT 📖 للعرض فقط
registry/repository:tag
المكون الوصف مثال
registry عنوان المستودع (Docker Hub افتراضيًا) docker.io / localhost:5000
repository اسم المستودع (المستخدم/اسم الصورة) library/nginx / myorg/myapp
tag وسم الإصدار (الافتراضي: latest) 1.25-alpine / latest / v2.0

(3) اصطلاحات تسمية الوسوم الشائعة

لاحقة الوسم المعنى مرجع الحجم حالات الاستخدام
latest أحدث إصدار افتراضي الحد الأقصى تجربة سريعة
alpine أساس Alpine Linux أدنى (5–50 ميجابايت) الإنتاج/قيود الموارد
slim Debian مصغر صغير (80–150 ميجابايت) الإنتاج (يتطلب glibc)
bookworm / jammy تحديد إصدار Debian/Ubuntu متوسط (100–300 ميجابايت) يتطلب مكتبات نظام محددة
v1.25.3 رقم إصدار دقيق يعتمد على الصورة الأساسية تثبيت الإصدار للإنتاج


4. العمليات الأساسية مع الصور

▶ مثال: سحب صور Nginx بوسوم مختلفة (الصعوبة: ⭐)

BASH
# سحب nginx بوسوم مختلفة
docker pull nginx:latest
docker pull nginx:1.25-alpine
docker pull nginx:1.25

# عرض الصور المسحوبة
docker images
💻 المخرجات:

TEXT 📖 للعرض فقط
REPOSITORY   TAG            SIZE
nginx        latest         187MB
nginx        1.25-alpine    42.5MB
nginx        1.25           187MB
💡 نصيحة: الوسوم المختلفة لنفس الصورة الأساسية تتشارك البيانات الأساسية نفسها، لذا فإن استخدام التخزين الفعلي أقل بكثير من مجموع أحجام الصور الثلاث (تخزين مع إزالة التكرار).

▶ مثال: عرض قائمة الصور المحلية (الصعوبة: ⭐)

BASH
# عرض جميع الصور المحلية
docker images

# التصفية حسب اسم المستودع
docker images nginx

# عرض معرفات الصور فقط
docker images -q

▶ مثال: توسيم صورة (docker tag) (الصعوبة: ⭐⭐)

BASH
# توسيم صورة موجودة لسجل خاص
docker tag nginx:1.25-alpine localhost:5000/myapp/nginx:v1

# التحقق من الوسم الجديد
docker images | grep myapp
💻 المخرجات:

TEXT 📖 للعرض فقط
localhost:5000/myapp/nginx   v1       42.5MB
📌 نقطة أساسية: docker tag لا ينشئ نسخة من الصورة؛ إنه ينشئ فقط اسمًا مستعارًا يشير إلى نفس الصورة. الوسمان يتشاركان التخزين ولا يشغلان مساحة إضافية.

▶ مثال: حذف صورة (الصعوبة: ⭐⭐)

BASH
# إزالة صورة بالاسم:الوسم
docker rmi nginx:1.25

# إزالة بمعرف الصورة
docker rmi a1b2c3d4e5f6

# إزالة قسرية (حتى لو كانت مستخدمة من قبل حاويات متوقفة)
docker rmi -f nginx:latest
⚠️ ملاحظة: لا يمكن حذف صورة أثناء استخدامها من قبل حاوية قيد التشغيل. يجب أولاً تنفيذ docker stop + docker rm على الحاوية قبل حذف الصورة.

▶ مثال: التحقق من استخدام القرص (الصعوبة: ⭐)

BASH
# عرض تفصيل استخدام قرص Docker
docker system df

# عرض الحجم التفصيلي لكل صورة
docker system df -v
💻 المخرجات:

TEXT 📖 للعرض فقط
TYPE            TOTAL   ACTIVE  SIZE      RECLAIMABLE
Images          5       2       1.2GB     800MB (66%)
Containers      3       1       150MB     120MB (80%)
Local Volumes   2       1       500MB     250MB (50%)
Build Cache     10      0       300MB     300MB (100%)


5. طبقات الصور والتخزين المؤقت

(1) مبدأ الطبقات

كل تعليمة في Dockerfile تولد طبقة صورة. أثناء docker pull، يتم تنزيل الطبقات واحدة تلو الأخرى، ويتم تخطي الطبقات الموجودة.

100%
graph TB
    subgraph "طبقات الصورة (مشتركة، للقراءة فقط)"
        L1["الطبقة 1: نظام التشغيل الأساسي<br/>debian:bookworm-slim"]
        L2["الطبقة 2: apt install<br/>nginx + التبعيات"]
        L3["الطبقة 3: COPY html<br/>محتوى مخصص"]
    end
    subgraph "طبقة الحاوية (قابلة للكتابة)"
        C["طبقة الحاوية<br/>تغييرات وقت التشغيل<br/>السجلات، الملفات المؤقتة"]
    end
    C --> L3 --> L2 --> L1

(2) فوائد الطبقات

الفوائد الوصف
إزالة تكرار التخزين يتم تخزين نسخة واحدة فقط لكل طبقة؛ وتشاركها صور متعددة
تسريع النقل يتخطى الطبقات الموجودة أثناء pull وينزل الطبقات الجديدة فقط
تسريع البناء الطبقات غير المتغيرة تستخدم التخزين المؤقت؛ ولا يُعاد بناؤها

(3) عرض سجل بناء الصورة

BASH
# عرض سجل بناء الصورة (كل طبقة)
docker history nginx:1.25-alpine
💻 المخرجات (مقتطف):

TEXT 📖 للعرض فقط
IMAGE          CREATED       CREATED BY                                      SIZE
e1ade32        2 weeks ago   CMD ["nginx" "-g" "daemon off;"]                0B
<missing>      2 weeks ago   STOPSIGNAL SIGQUIT                              0B
<missing>      2 weeks ago   ENTRYPOINT ["/docker-entrypoint.sh"]            0B
<missing>      2 weeks ago   COPY 15-local-resolvers.envsh /etc...           389B
<missing>      2 weeks ago   COPY 30-tune-worker-processes.sh /etc...        4.61kB
<missing>      2 weeks ago   RUN /bin/sh -c set -x ... && apk add...         30.4MB
<missing>      2 months ago  /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B


6. سياسة تنظيف الصور

(1) مقارنة بين ثلاثة أوامر تنظيف

الأمر نطاق التنظيف المخاطرة السيناريوهات المطبقة
docker rmi <صورة> حذف صورة محددة منخفضة (تحكم دقيق) حذف صور غير مرغوب فيها معروفة
docker image prune حذف الصور اليتيمة (وسم <none>) منخفضة جدًا (لا مراجع) تنظيف روتيني
docker image prune -a حذف جميع الصور غير المستخدمة من قبل الحاويات متوسطة (قد تحذف بعض الصور التي لا تزال مطلوبة) عندما تكون مساحة القرص منخفضة
docker system prune تنظيف كل شيء (صور + حاويات + وحدات تخزين + تخزين مؤقت) عالية (حذف واسع) تنظيف شامل

▶ مثال: تنظيف الصور اليتيمة (الصعوبة: ⭐)

BASH
# إزالة الصور المعلقة (بدون وسم)
docker image prune -f
💻 المخرجات:

TEXT 📖 للعرض فقط
Deleted Images:
untagged: <none>
deleted: sha256:a1b2c3d4...
Total reclaimed space: 150MB

(2) مقارنة أحجام الصور الأساسية الشائعة

الصورة الحجم مدير الحزم الميزات
alpine:3.19 7 ميجابايت apk صغيرة جدًا، musl libc
debian:bookworm-slim 74 ميجابايت apt glibc قياسي، توافق جيد
ubuntu:22.04 77 ميجابايت apt نظام بيئي غني
node:20-alpine 135 ميجابايت apk + npm بيئة تشغيل Node.js
python:3.12-slim 155 ميجابايت apt + pip بيئة تشغيل Python
golang:1.22 780 ميجابايت apt + go بيئة تجميع


7. مثال كامل: سحب الصورة ← توسيم ← دفع ← تنظيف

BASH
# ============================================
# شرح كامل: إدارة دورة حياة الصورة
# يغطي: pull، tag، push (سجل محلي)، تنظيف
# ============================================

# 1. سحب صورة Nginx Alpine
docker pull nginx:1.25-alpine

# 2. عرض تفاصيل الصورة
docker images nginx
docker history nginx:1.25-alpine

# 3. توسيم لسجل محلي
docker tag nginx:1.25-alpine localhost:5000/web/nginx:v1.0

# 4. بدء سجل محلي (لوجهة الدفع)
docker run -d -p 5000:5000 --name registry registry:2

# 5. دفع الصورة الموسومة إلى السجل المحلي
docker push localhost:5000/web/nginx:v1.0

# 6. التحقق من الدفع
curl -s http://localhost:5000/v2/web/nginx/tags/list | python3 -m json.tool

# 7. إزالة النسخ المحلية
docker rmi localhost:5000/web/nginx:v1.0

# 8. سحب مرة أخرى من السجل المحلي للتحقق
docker pull localhost:5000/web/nginx:v1.0

# 9. تنظيف: إيقاف السجل وإزالة جميع الصور غير المستخدمة
docker stop registry && docker rm registry
docker image prune -a -f

# 10. التحقق من استخدام القرص النهائي
docker system df
💻 المخرجات (مقتطف):

TEXT 📖 للعرض فقط
# docker push localhost:5000/web/nginx:v1.0
The push refers to repository [localhost:5000/web/nginx]
5f0e3b...: Pushed
latest: digest: sha256:7be1... size: 1361

# curl http://localhost:5000/v2/web/nginx/tags/list
{"name":"web/nginx","tags":["v1.0"]}

# docker system df
TYPE            TOTAL   ACTIVE  SIZE      RECLAIMABLE
Images          1       0       42.5MB    42.5MB (100%)

❓ أسئلة شائعة

س هل يتم تحديث وسم :latest تلقائيًا؟
ج لا. الوسوم :latest المحلية الموجودة لن تُحدث تلقائيًا. يجب استخدام docker pull nginx:latest صراحةً للحصول على أحدث إصدار. في بيئات الإنتاج، تجنب استخدام :latest؛ بدلاً من ذلك، استخدم رقم إصدار دقيق (مثل nginx:1.25.4) لضمان قابلية التكرار.
س ما الفرق بين صور Alpine و Slim؟
ج Alpine مبني على musl libc و BusyBox؛ وهو صغير جدًا (7 ميجابايت) لكنه قد يواجه مشكلات توافق (مثل امتدادات Python C). Slim مبني على Debian ويستخدم glibc؛ ويوفر توافقًا جيدًا لكنه أكبر (80–150 ميجابايت). استخدم Slim كلما أمكن، واستخدم Alpine فقط عندما تكون مساحة القرص محدودة للغاية.
س ما هي الصورة المعلقة (dangling)؟
ج صورة بدون وسم (تُعرض كـ <none>:<none>) تُنشأ عادةً عندما يقوم بناء جديد بالكتابة فوق صورة قديمة — تفقد الصورة القديمة وسمها لكن طبقاتها تبقى. استخدم docker image prune لتنظيفها بأمان؛ هذا لن يؤثر على أي صور قيد الاستخدام حاليًا.
س كيف أعرض سجل بناء الصورة؟
ج docker history <صورة> يعرض الحجم ووقت الإنشاء وتعليمات Dockerfile المقابلة لكل طبقة. أضف --no-trunc لعرض الأوامر الكاملة. هذه أداة أساسية لتحليل حجم الصورة وتحسين Dockerfile.
س كيف أنشئ مستودعًا خاصًا؟
ج أسهل طريقة هي استخدام docker run -d -p 5000:5000 registry:2، مما يتيح لك إعداد سجل محلي في أقل من 5 ثوانٍ. لبيئات الإنتاج، نوصي باستخدام Harbor (الذي يتضمن واجهة ويب ومصادقة وفحص صور) أو سجل حاويات مزود سحابي (مثل AWS ECR أو Alibaba Cloud ACR).
س لماذا لا يتم تحرير المساحة بعد حذف صورة؟
ج يستخدم Docker OverlayFS للتخزين الطبقي، وقد تتشارك صور متعددة نفس الطبقات الأساسية. حذف صورة يحرر فقط الطبقات التي تستخدمها حصريًا. استخدم docker system df -v لعرض المساحة الفعلية القابلة للاسترداد لكل صورة.

📖 ملخص


📝 تمارين

  1. تمرين أساسي (الصعوبة: ⭐): اسحب ثلاث صور Ubuntu بوسوم مختلفة من Docker Hub (latest / 22.04 / 20.04)، وقارن أحجامها باستخدام docker images.
  2. سؤال متقدم (الصعوبة: ⭐⭐): استخدم docker history nginx:latest لتحليل طبقات صورة Nginx، وحدد أكبر طبقة، واشرح العملية التي تتوافق معها.
  3. تحدٍ (الصعوبة: ⭐⭐⭐): نفذ docker system df -v لتحليل توزيع استخدام قرص Docker على جهازك المحلي، ثم نفذ docker image prune -a -f لتنظيفه، وقارن مقدار المساحة المستردة قبل وبعد التنظيف.
Web-Tutorial.com

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

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

100%