Docker: إدارة صور Docker
آخر تحديث: 2026-08-26
الصور هي اللبنات الأساسية لـ Docker — إتقان إدارة الصور يعني إتقان "مستودع البرمجيات" في عالم الحاويات.
1. ما ستتعلمه
- استخدام مستودع صور Docker Hub
- اصطلاحات تسمية وسوم الصور
- سحب ودفع المستودعات
- طبقات الصور وآليات التخزين المؤقت
- سياسة تنظيف الصور
2. قصة حقيقية لمهندس عمليات
(1) نقطة الألم: تنبيه القرص في خادم CI
تلقى بوب تنبيهًا بشأن القرص من خادم CI — كانت صور Docker تشغل 40 جيجابايت من المساحة. عند التحقيق، وجد عددًا كبيرًا من الصور اليتيمة <none> (بقايا من عمليات بناء قديمة) وخمسة إصدارات من صور Node.js (1.2 جيجابايت لكل منها)، على الرغم من أن الفريق لم يكن بحاجة فعليًا سوى لأحدث إصدارين. كان القرص ممتلئًا بنسبة 80%، وبدأت عمليات البناء بالفشل.
(2) حل تنظيف الصور
حذف بوب 20 جيجابايت من الصور غير المستخدمة بثلاثة أوامر فقط.
# إزالة الصور المعلقة (بقايا بدون وسم)
docker image prune -f
# إزالة الصور غير المستخدمة من قبل أي حاوية
docker image prune -a -f
# التحقق من استخدام القرص بعد التنظيف
docker system df
(3) الفائدة: استعادة مساحة القرص
تم تحرير 20 جيجابايت من المساحة، وانخفض استخدام القرص من 80% إلى 35%، واستأنفت عمليات بناء CI العمل الطبيعي.
3. الصور و Docker Hub
(1) مكونات الصورة
تتكون صورة Docker من طبقات متعددة للقراءة فقط مكدسة فوق بعضها البعض، حيث تمثل كل طبقة تغييرًا في نظام الملفات.
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) اصطلاحات تسمية الصور
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 بوسوم مختلفة (الصعوبة: ⭐)
# سحب nginx بوسوم مختلفة
docker pull nginx:latest
docker pull nginx:1.25-alpine
docker pull nginx:1.25
# عرض الصور المسحوبة
docker images
REPOSITORY TAG SIZE
nginx latest 187MB
nginx 1.25-alpine 42.5MB
nginx 1.25 187MB
▶ مثال: عرض قائمة الصور المحلية (الصعوبة: ⭐)
# عرض جميع الصور المحلية
docker images
# التصفية حسب اسم المستودع
docker images nginx
# عرض معرفات الصور فقط
docker images -q
▶ مثال: توسيم صورة (docker tag) (الصعوبة: ⭐⭐)
# توسيم صورة موجودة لسجل خاص
docker tag nginx:1.25-alpine localhost:5000/myapp/nginx:v1
# التحقق من الوسم الجديد
docker images | grep myapp
localhost:5000/myapp/nginx v1 42.5MB
docker tag لا ينشئ نسخة من الصورة؛ إنه ينشئ فقط اسمًا مستعارًا يشير إلى نفس الصورة. الوسمان يتشاركان التخزين ولا يشغلان مساحة إضافية.
▶ مثال: حذف صورة (الصعوبة: ⭐⭐)
# إزالة صورة بالاسم:الوسم
docker rmi nginx:1.25
# إزالة بمعرف الصورة
docker rmi a1b2c3d4e5f6
# إزالة قسرية (حتى لو كانت مستخدمة من قبل حاويات متوقفة)
docker rmi -f nginx:latest
docker stop + docker rm على الحاوية قبل حذف الصورة.
▶ مثال: التحقق من استخدام القرص (الصعوبة: ⭐)
# عرض تفصيل استخدام قرص Docker
docker system df
# عرض الحجم التفصيلي لكل صورة
docker system df -v
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، يتم تنزيل الطبقات واحدة تلو الأخرى، ويتم تخطي الطبقات الموجودة.
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) عرض سجل بناء الصورة
# عرض سجل بناء الصورة (كل طبقة)
docker history nginx:1.25-alpine
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 |
تنظيف كل شيء (صور + حاويات + وحدات تخزين + تخزين مؤقت) | عالية (حذف واسع) | تنظيف شامل |
▶ مثال: تنظيف الصور اليتيمة (الصعوبة: ⭐)
# إزالة الصور المعلقة (بدون وسم)
docker image prune -f
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. مثال كامل: سحب الصورة ← توسيم ← دفع ← تنظيف
# ============================================
# شرح كامل: إدارة دورة حياة الصورة
# يغطي: 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
# 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) لضمان قابلية التكرار.<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 system df -v لعرض المساحة الفعلية القابلة للاسترداد لكل صورة.📖 ملخص
- الصورة مكونة من طبقات للقراءة فقط مكدسة فوق بعضها البعض؛ التخزين الطبقي يتيح إزالة التكرار والتخزين المؤقت لتحسين الأداء.
- اصطلاح تسمية الصور:
registry/repository:tag؛ تجنب استخدام:latestفي بيئة الإنتاج docker pull/images/tag/rmiهي العمليات الأساسية الأربع لإدارة الصورdocker tagينشئ اسمًا مستعارًا دون نسخ الصورة؛docker rmiينظف الحاويات المرتبطة قبل حذف الصورة- استخدم
docker image pruneلتنظيف الصور العائمة؛ استخدمdocker system pruneلتنظيف شامل. - Alpine هي الأصغر (7 ميجابايت) لكنها قد تواجه توافقًا ضعيفًا؛ Slim يوفر توافقًا جيدًا (80–150 ميجابايت). اختر الأنسب لاحتياجاتك.
📝 تمارين
- تمرين أساسي (الصعوبة: ⭐): اسحب ثلاث صور Ubuntu بوسوم مختلفة من Docker Hub (
latest/22.04/20.04)، وقارن أحجامها باستخدامdocker images. - سؤال متقدم (الصعوبة: ⭐⭐): استخدم
docker history nginx:latestلتحليل طبقات صورة Nginx، وحدد أكبر طبقة، واشرح العملية التي تتوافق معها. - تحدٍ (الصعوبة: ⭐⭐⭐): نفذ
docker system df -vلتحليل توزيع استخدام قرص Docker على جهازك المحلي، ثم نفذdocker image prune -a -fلتنظيفه، وقارن مقدار المساحة المستردة قبل وبعد التنظيف.