عندما تعمل مع Docker Containers، أحد أكبر التحديات التي تواجهك هي أن الحاويات مؤقتة بطبيعتها — فكلما حذفت Container، تختفي معه جميع البيانات التي بداخله. هذا يمثل مشكلة كبيرة في التطبيقات الحقيقية مثل قواعد البيانات أو المواقع التي تحتاج إلى الاحتفاظ بالملفات والمعلومات حتى بعد إعادة التشغيل أو التحديث.
هنا يأتي دور Docker Volumes، وهي الآلية التي يوفرها Docker لحفظ البيانات بشكل دائم ومستقل عن دورة حياة الحاوية. في هذا المقال، سنشرح Docker Volumes بطريقة مبسطة مع أمثلة عملية لتتمكن من فهمها وتطبيقها فورًا.
ما هي Docker Volumes؟
Docker Volume هو مساحة تخزين دائمة يتم إدارتها بالكامل بواسطة Docker، وتوجد خارج نظام الملفات الخاص بالحاوية ولكنها متصلة بها. الفكرة الأساسية هي فصل البيانات عن التطبيق — بحيث يمكن حذف الحاوية أو إعادة إنشائها دون فقدان أي شيء.
لفهم الصورة أكثر:
| داخل الحاوية | داخل Volume |
|---|---|
| مؤقت — يُحذف بحذف الحاوية | دائم — يبقى حتى تحذفه أنت |
| مرتبط بدورة حياة الحاوية | مستقل تمامًا |
| يصعب الوصول إليه من حاويات أخرى | يمكن مشاركته بين أي عدد من الحاويات |
ملاحظة: Volumes تُخزَّن في مسار مخصص يديره Docker (عادةً
/var/lib/docker/volumes/على لينكس)، ولا يُنصح بالتعديل عليها يدويًا.
لماذا نستخدم Docker Volumes؟
هناك أسباب رئيسية تجعل Docker Volumes الخيار الأمثل لحفظ البيانات:
- الحفاظ على البيانات — يمكنك حذف الحاوية وإعادة إنشائها وستجد بياناتك كما هي.
- مشاركة البيانات — يمكن ربط نفس الـ Volume مع عدة Containers في نفس الوقت.
- النسخ الاحتياطي والاستعادة — يمكنك عمل Backup لـ Volume بسهولة عبر أوامر بسيطة.
- إدارة التطبيقات — فصل البيانات عن الكود يسهل التحديثات وإدارة الإصدارات.
- أداء ممتاز — Volumes تُدار مباشرة بواسطة Docker، مما يوفر أداءً أفضل من طرق أخرى مثل Bind Mounts.
خلاصة: استخدم Volumes عندما تحتاج إلى بقاء البيانات بعد إعادة تشغيل أو حذف الحاوية — وهذا يشمل معظم التطبيقات الحقيقية.
أنواع التخزين في Docker
يقدم Docker ثلاث طرق رئيسية لتخزين البيانات:
Docker Volumes
- الاستخدام: الحالات التي تحتاج فيها إلى تخزين دائم وآمن، مثل قواعد البيانات والملفات الهامة.
- المميزات: سهل الإدارة، آمن، أداء عالٍ، تدار بالكامل بواسطة Docker.
Bind Mounts
- متى تستخدم: عندما تريد ربط مجلد محدد من جهاز المضيف (Host) مباشرة مع الحاوية — مثل مشاركة كود التطوير.
- المميزات والعيوب: سهولة الوصول المباشر للملفات، لكنها تعتمد على بنية المجلدات في نظام التشغيل المضيف وقد تسبب مشاكل في الأمان.
tmpfs Mounts
- الاستخدام: البيانات المؤقتة التي لا تحتاج إلى بقائها بعد إيقاف الحاوية، مثل ملفات الجلسات المؤقتة.
- متى تكون مناسبة: عندما تريد سرعة عالية ولا تهتم ببقاء البيانات.
خلاصة: Volumes هي الخيار الافتراضي الموصى به لمعظم الحالات، بينما Bind Mounts مناسبة للتطوير المحلي، وtmpfs للبيانات المؤقتة فقط.
إنشاء Docker Volume
لإنشاء Volume جديد، استخدم الأمر:
docker volume create my_volume
بعد الإنشاء، يمكنك عرض جميع Volumes الموجودة:
docker volume ls
سترى قائمة بجميع Volumes، بما في ذلك my_volume الذي أنشأته للتو.
لعرض تفاصيل الـ Volume:
docker volume inspect my_volume
هذا الأمر يعرض معلومات مثل مسار التخزين الفعلي واسم الـ Volume وإعداداته.
ملاحظة: إذا استخدمت Volume في أمر
docker runدون إنشائه مسبقًا، سيقوم Docker بإنشائه تلقائيًا.
استخدام Docker Volume مع Container
المثال التالي يشغل MySQL مع Volume لحفظ البيانات:
docker run -d
--name mysql
-v mysql_data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=root
mysql:8
شرح الأمر:
-v mysql_data:/var/lib/mysql— يربط Volume باسمmysql_dataمع المسار/var/lib/mysqlداخل الحاوية (وهو مسار تخزين MySQL الافتراضي).--name mysql— يعطي الحاوية اسمًا سهل الاستخدام.-e MYSQL_ROOT_PASSWORD=root— يحدد كلمة سر لقاعدة البيانات.
إذا أعدت تشغيل الحاوية أو حذفتها وأعدت إنشاءها بنفس الأمر، ستجد أن جميع قواعد البيانات والجداول ما زالت موجودة — لأنها محفوظة في الـ Volume وليس داخل الحاوية.
مثال عملي لحفظ بيانات قاعدة بيانات MySQL
هذا المثال يوضح بالخطوات كيف تبقى البيانات آمنة:
الخطوة 1: أنشئ Volume:
docker volume create mysql_data
الخطوة 2: شغّل حاوية MySQL:
docker run -d
--name mysql
-v mysql_data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=root
mysql:8
الخطوة 3: ادخل إلى الحاوية وأنشئ قاعدة بيانات:
docker exec -it mysql mysql -uroot -proot -e "CREATE DATABASE test_db;"
الخطوة 4: احذف الحاوية (نعم، احذفها!):
docker rm -f mysql
الخطوة 5: شغّل حاوية جديدة بنفس الـ Volume:
docker run -d
--name mysql_new
-v mysql_data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=root
mysql:8
الخطوة 6: تأكد من بقاء قاعدة البيانات:
docker exec -it mysql_new mysql -uroot -proot -e "SHOW DATABASES;"
ستجد أن test_db ما زالت موجودة! هذا هو جوهر Docker Volumes.
إدارة Docker Volumes
إليك الأوامر الأساسية لإدارة الـ Volumes:
| الأمر | الوصف |
|---|---|
docker volume create [name] | إنشاء Volume جديد |
docker volume ls | عرض جميع Volumes |
docker volume inspect [name] | عرض تفاصيل Volume |
docker volume rm [name] | حذف Volume معين |
docker volume prune | حذف جميع Volumes غير المستخدمة |
تحذير: أمر
docker volume pruneيحذف جميع Volumes غير المرتبطة بأي حاوية نشطة. تأكد قبل استخدامه أنك لا تحتاج إلى هذه البيانات.
استخدام Docker Compose مع Volumes
في المشاريع الحقيقية، نادرًا ما تستخدم أوامر docker run مباشرة. بدلًا من ذلك، يستخدم الجميع Docker Compose لإدارة الخدمات.
مثال كامل لموقع WordPress مع MySQL:
version: "3"
services:
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: root
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
volumes:
db_data:
wordpress_data:
شرح المثال:
- db_data — Volume لحفظ قاعدة بيانات MySQL.
- wordpress_data — Volume لحفظ ملفات WordPress (مثل الصور والإضافات).
- كل خدمة تستخدم Volume الخاص بها لمنع تعارض البيانات.
- حتى بعد تنفيذ
docker compose down، تبقى البيانات محفوظة. لإعادة التشغيل استخدمdocker compose up -d.
أفضل الممارسات (Best Practices)
- لا تخزن البيانات المهمة داخل Container — استخدم Volumes دائمًا.
- استخدم أسماء واضحة للـ Volumes — مثل
mysql_dataأوwordpress_uploadsبدلًا منvol1. - قم بعمل Backup دوري — انسخ البيانات من الـ Volume إلى مكان آمن خارجيًا.
- لا تحذف Volumes بدون التأكد — استخدم
docker volume lsأولاً لترى ما هو مرتبط بها. - استخدم Docker Compose — لإدارة المشاريع المتعددة الخدمات بطريقة منظمة.
الأخطاء الشائعة
- حذف Container بدون Volume — خاصة مع
docker runدون استخدام-v، فتضيع جميع البيانات. - حذف Volume بالخطأ — استخدم
docker volume pruneبحذر شديد. - استخدام Bind Mount بدلاً من Volume — Bind Mounts مناسبة للتطوير فقط، وليس للإنتاج.
- نسيان عمل Backup — Volumes تحمي من حذف الحاوية، لكنها لا تحمي من عطل القرص الصلب أو الكوارث الأخرى.
مقارنة بين Docker Volume و Bind Mount
| المعيار | Docker Volume | Bind Mount |
|---|---|---|
| سهولة الإدارة | ممتاز | جيد |
| الأداء | ممتاز | جيد |
| النسخ الاحتياطي | سهل | متوسط |
| مشاركة البيانات | نعم | نعم |
| الاعتماد على نظام التشغيل | منخفض | مرتفع |
| الأمان | مرتفع (يديره Docker) | أقل (وصول مباشر لنظام الملفات) |
نصائح لتحسين الأداء
- نظّف Volumes غير المستخدمة — استخدم
docker volume pruneبشكل دوري (بعد التأكد). - استخدم Volume منفصل لكل خدمة — لكل قاعدة بيانات أو تطبيق Volume خاص به.
- راقب حجم البيانات — استخدم
docker system dfلمراقبة استهلاك المساحة. - استخدم SSD عند الحاجة — خاصة مع قواعد البيانات الثقيلة.
الأسئلة الشائعة (FAQ)
هل يتم حذف البيانات عند حذف Container؟
لا، إذا كنت تستخدم Volume. البيانات تبقى محفوظة حتى بعد حذف الحاوية. يمكنك ربط Volume بحاوية جديدة واستعادة بياناتك فورًا.
أين يتم تخزين Docker Volumes؟
في نظام لينكس، التخزين الافتراضي هو /var/lib/docker/volumes/. على ويندوز وماك، يتم إدارتها داخل جهاز Docker الافتراضي (Virtual Machine).
ما الفرق بين Volume و Bind Mount؟
Volume يُدار بالكامل بواسطة Docker، بينما Bind Mount يربط مجلدًا موجودًا في جهاز المضيف مباشرة مع الحاوية. Volumes أكثر أمانًا وأسهل في الإدارة والنسخ الاحتياطي.
هل يمكن مشاركة Volume بين أكثر من Container؟
نعم، يمكن ربط نفس الـ Volume مع أي عدد من الحاويات في نفس الوقت، مما يسمح بمشاركة البيانات بينها.
كيف أعمل Backup للـ Docker Volume؟
أسهل طريقة هي تشغيل حاوية مؤقتة ونسخ محتويات الـ Volume:
docker run --rm
-v mysql_data:/source
-v $(pwd):/backup
alpine tar czf /backup/mysql_backup.tar.gz -C /source .
خاتمة
Docker Volumes هي الطريقة الصحيحة والموصى بها لحفظ البيانات في عالم Docker. سواء كنت تدير قاعدة بيانات MySQL، أو موقع WordPress، أو أي تطبيق يحتاج إلى تخزين دائم — الـ Volumes توفر لك الأمان والمرونة والأداء الذي تحتاجه.
ابدأ بتجربة الأمثلة العملية في هذا المقال، وسترى بنفسك كيف تبقى البيانات محفوظة حتى بعد حذف الحاوية بالكامل. بمجرد أن تتعود على استخدام Volumes، لن تفكر أبدًا في العودة إلى تخزين البيانات داخل الحاويات مرة أخرى.
تذكر: في Docker، الحاويات مؤقتة — ولكن بياناتك لا يجب أن تكون كذلك.
اترك تعليقاً
يجب أنت تكون مسجل الدخول لتضيف تعليقاً.