الأحجام: أين توجد بيانات الحاوية فعليًا
كيف يختلف الحجم المسمّى عن الربط المباشر، وأين توجد كل هذه البيانات فعليًا على القرص، وكيف لا تفقد قاعدة البيانات عند إعادة إنشاء الحاوية.
آخر تحديث 23 أغسطس 2026
الحاوية قابلة للتخلص منها. كل ما يُكتب داخلها يختفي معها. يجب أن تبقى البيانات خارجها، وهناك طريقتان فقط: وحدة تخزين مُسمّاة وربط دليل من المضيف.
طريقتان ومتى تستخدم كلًا منهما
services:
db:
image: postgres:17
volumes:
- db-data:/var/lib/postgresql/data # named volume
app:
image: nginx:1.27
volumes:
- ./site:/usr/share/nginx/html:ro # directory bind mount
- ./nginx.conf:/etc/nginx/nginx.conf:ro
volumes:
db-data:
وحدة التخزين المُسمّاة ينشئها Docker نفسه ويخزّنها في /var/lib/docker/volumes/<name>/_data. تُضبط الأذونات داخلها تلقائيًا بواسطة الصورة. بهذه الطريقة تُحفظ قواعد البيانات وحالة الخدمات الداخلية.
ربط دليل هو مسار عادي على قرص الجهاز. بهذه الطريقة توفّر ملفات الإعداد والأصول الثابتة للموقع والشهادات: فهي ملائمة للتحرير في محرر وللتخزين في مستودع.
العلم :ro يجعل وحدة التخزين للقراءة فقط. استخدمه في كل مكان لا تحتاج فيه الحاوية إلى صلاحية الكتابة — فهو حماية زهيدة التكلفة.
أين يُخزَّن كل شيء فعليًا
docker volume ls
docker volume inspect db-data
docker inspect -f '{{json .Mounts}}' <container> | python3 -m json.tool
sudo du -sh /var/lib/docker/volumes/* | sort -h | tail
الأمر الأخير هو أول ما يجب تشغيله عند نفاد مساحة القرص. مزيد من التفاصيل: مساحة القرص.
docker compose down -vوdocker volume pruneيحذفان وحدات التخزين نهائيًا. تبدو وحدة التخزين التي تحتوي على قاعدة بيانات «غير مستخدمة» أثناء توقف الحاوية فتقع تحت التنظيف. قبل التنظيف، انظر إلى القائمة:docker volume ls -f dangling=true.
النسخ والترحيل
نسخ وحدة تخزين مُسمّاة باستخدام حاوية قابلة للتخلص منها:
docker run --rm -v db-data:/from -v $(pwd):/to alpine \
tar czf /to/db-data.tar.gz -C /from .
الاستعادة:
docker volume create db-data
docker run --rm -v db-data:/to -v $(pwd):/from alpine \
tar xzf /from/db-data.tar.gz -C /to
بالنسبة لقواعد البيانات، تناسب هذه الطريقة فقط عندما تكون الحاوية متوقفة: فالنسخ على مستوى الملفات لقاعدة بيانات قيد التشغيل قد يكون غير متسق. الأفضل هو التفريغ باستخدام أدوات قاعدة البيانات نفسها — pg_dump، mysqldump. راجع ما يجب نسخه بالضبط.
الأذونات
الخطأ الأكثر شيوعًا في ربط الأدلة هو عدم تطابق المالك. داخل الحاوية، تعمل العملية تحت UID الخاص بها، ويكون الملف الذي أنشأه المضيف بصلاحية root غير متاح لها.
docker compose exec app id
sudo chown -R 1000:1000 ./data
تقبل كثير من الصور متغيرات PUID/PGID — وهذا أكثر ملاءمة من تغيير مالك الدليل.
أخطاء شائعة
- كُتبت البيانات داخل الحاوية. أعدت إنشاء الحاوية أثناء تحديث — فاختفت البيانات. تحقق:
docker diff <container>سيُظهر ما تغيّر في نظام ملفاتها؛ والكتابات الكبيرة هناك علامة تحذير. - ربطت دليلًا فوق مسار غير فارغ في الصورة. يُخفى محتوى الصورة، فلا تجد الخدمة ملفاتها.
- مسار نسبي في ربط الدليل. يُحلّ انطلاقًا من الدليل الذي يحتوي على
compose.yaml، لا من الدليل الحالي. التشغيل من موقع آخر سيُنشئ دليلًا فارغًا جديدًا. - نُسيت وحدات التخزين أثناء إعادة تثبيت نظام التشغيل. إعادة التثبيت تمحو القرص بالكامل. يجب تخزين النسخة ليس على هذا الجهاز.