على جهاز Mac يستخدم Docker Desktop، انسخ وحدة تخزين مسماة في Compose احتياطيًا عن طريق تركيبها في حاوية مؤقتة وكتابة أرشيف tar في مجلد على جهاز Mac الخاص بك. تحقق من اسم وحدة التخزين، وأوقف الخدمات التي تكتب إليها، وأنشئ الأرشيف، وتأكد من وجود الملف قبل إزالة الحاويات. يحتفظ أمر docker compose down العادي بوحدات التخزين المسماة؛ بينما يزيل أمر docker compose down --volumes وحدات تخزين المشروع المؤهلة، لذا لا تقم بتشغيله حتى تكتمل عملية النسخ الاحتياطي.
1. تحديد وحدة تخزين Compose ومسار تركيبها
في Terminal، انتقل إلى الدليل الذي يحتوي على ملف Compose الخاص بالمشروع. ابحث عن مسار تركيب الخدمة، مثل db-data:/var/lib/postgresql/data، والإعلان المطابق له في المستوى الأعلى ضمن volumes:. الجانب الأيسر، db-data، هو مفتاح Compose؛ ومسار الحاوية بعد النقطتين الرأسيتين هو المكان الذي يرى فيه التطبيق البيانات. قد يقوم Compose بإنشاء وحدة تخزين Docker الفعلية مع بادئة اسم المشروع، بينما يمكن لخاصية name: المحددة مسبقًا منحها اسمًا مخصصًا. يوضح مرجع وحدات تخزين Compose في Docker قواعد التسمية تلك.
اعرض وحدات التخزين المستخدمة بواسطة مشروع Compose الحالي:
docker compose volumes
استخدم تلك المخرجات وملف Compose لتحديد وحدة تخزين Docker بدقة. إذا كان المشروع يستخدم عدة ملفات Compose، أو ملفات تعريف (profiles)، أو اسم مشروع مخصصًا، فاستخدم نفس الخيارات عند فحصها كما تم استخدامها عند بدء تشغيل الـ stack. لا تخمن اسم وحدة التخزين الفعلي بالاعتماد على مفتاح YAML وحده. يمكن لأمر docker volume ls عرض جميع وحدات تخزين Docker، ولكنه قد يتضمن مشاريع أخرى غير ذات صلة.
2. إيقاف عمليات الكتابة قبل إنشاء الأرشيف
إن أرشيف نظام الملفات ليس بالضرورة نسخة احتياطية متسقة لقاعدة البيانات إذا كانت قاعدة البيانات تتغير أثناء نسخ الملفات. قم أولاً بإيقاف التطبيق بشكل سليم؛ بالنسبة لـ Compose stack، يقوم الأمر docker compose stop بإيقاف خدماتها مع الاحتفاظ بالحاويات ووحدات التخزين. إذا كانت قاعدة البيانات تحتوي على آلية تفريغ (dump) أو إجراء نسخ احتياطي مخصص للتطبيق، فاستخدمه عندما يكون الاتساق على مستوى المعاملات (transaction-level consistency) أمرًا مهمًا، ثم أنشئ أيضًا أرشيفًا لوحدة التخزين إذا كنت بحاجة إلى نسخة على مستوى الملفات.
تجنب تشغيل docker compose down --volumes في هذه المرحلة. توضح وثائق Compose أن الأمر down يزيل حاويات المشروع وشبكاته افتراضيًا، بينما يزيل الخيار --volumes أيضًا وحدات التخزين المسماة والمجهولة المؤهلة. لا تتم إزالة وحدات التخزين الخارجية (external volumes) بواسطة down. يشرح مرجع compose down في Docker هذا الفارق.
3. إنشاء نسخة احتياطية بصيغة tar في مجلد على Mac
يفترض المثال التالي أن وحدة تخزين Docker الفعلية تسمى myproject_db-data. استبدل هذه القيمة بالاسم الدقيق الذي حددته. يحفظ هذا الأمر db-data-backup.tar في دليل Mac الحالي. يقوم Docker Desktop بتشغيل Docker Engine داخل جهاز افتراضي يعمل بنظام Linux (Linux VM)، لذا تتم إدارة بيانات وحدة التخزين المسماة بواسطة Docker؛ وتعمل هذه الطريقة على نسخها عبر حاوية مؤقتة بدلاً من الاعتماد على مسار تخزين داخل Linux VM. يوثق دليل وحدات التخزين في Docker أسلوب الحاوية المساعدة واستخدام tar، وتوضح وثائق إعدادات Docker Desktop لنظام Mac تفاصيل Linux VM ومشاركة ملفات المضيف.
volume_name='myproject_db-data'
backup_dir="$PWD"
backup_file='db-data-backup.tar'
docker run --rm \
--mount "type=volume,source=$volume_name,target=/source,readonly" \
--mount "type=bind,source=$backup_dir,target=/backup" \
alpine sh -c 'tar -C /source -cf "/backup/'"$backup_file"'" .'
تتم كتابة الأرشيف في الدليل الممثل بـ $PWD، لذا اختر موقعًا به مساحة خالية كافية قبل تشغيل الأمر. يتم تركيب وحدة التخزين للقراءة فقط (read-only) في الحاوية المساعدة لمنع التغييرات غير المقصودة أثناء النسخ؛ وهذا بحد ذاته لا يمنع الحاويات الأخرى من الكتابة، ولهذا السبب يعد إيقاف الخدمات التي تكتب أولاً أمرًا مهمًا. يتطلب الأمر أن يكون Docker Desktop قيد التشغيل وأن يكون مجلد Mac قابلاً للوصول لعمليات تركيب الربط (bind mounts). إذا فشل التركيب، فتحقق من أذونات الوصول لمشاركة الملفات في Docker Desktop للمجلد.
تحقق من وجود الأرشيف ومن أن حجمه منطقي وغير صفري:
ls -lh "$backup_file"
يؤكد هذا أنه تم إنشاء ملف، لكنه لا يضمن أن محتوياته تشكل نسخة احتياطية قابلة للاستعادة للتطبيق. احتفظ بالأرشيف في مكان ما خارج وحدة التخزين التي يديرها Docker، وفكر في نسخه إلى وجهة النسخ الاحتياطي المعتادة لديك قبل حذف البيانات.
4. إزالة الحاويات فقط بعد التحقق من هدفك
عندما يصبح الأرشيف جاهزًا في مكانه، قم بإزالة حاويات المشروع باستخدام:
docker compose down
يترك هذا الأمر وحدة التخزين المسماة في مكانها افتراضيًا. إذا كانت نيتك هي حذف وحدة التخزين أيضًا، فتحقق أولاً من اسمي المشروع ووحدة التخزين مرة أخرى، ثم استخدم docker compose down --volumes فقط عندما تكون مستعدًا لإزالة تلك البيانات. قد يكون لوحدة التخزين ذات الاسم المخصص أو وحدة التخزين الخارجية سلوك دورة حياة مختلف؛ راجع تعريف Compose ومرجع أوامر Docker بدلاً من افتراض أن الخيار يؤثر على كل وحدة تخزين.
اعتبارات الاستعادة
تتضمن آلية العمل الموثقة في Docker لوحدات التخزين استعادة أرشيف tar عن طريق تركيب وحدة التخزين الوجهة واستخراج الأرشيف بداخلها. بالنسبة لملفات قواعد البيانات، قم بالاستعادة في وحدة تخزين جديدة أو مفرغة عمدًا أثناء إيقاف خدمة قاعدة البيانات، واتبع متطلبات الملكية والتهيئة الخاصة بصورة قاعدة البيانات. لا تقم بالاستخراج فوق وحدة تخزين تحتوي على بيانات ما زلت بحاجة إليها: فقد تتعارض الملفات الحالية مع الأرشيف، ولا يعد استخراج ملف tar استراتيجية دمج آمنة. إذا كنت بحاجة إلى نقطة استرداد متسقة لقاعدة البيانات، فاستخدم عملية النسخ الاحتياطي والاستعادة الخاصة بقاعدة البيانات نفسها، بالإضافة إلى أرشيف الملفات الخام أو كبديل عنه.
المصادر
docker compose down — Docker
وحدات التخزين (Volumes) — Docker