بالنسبة لمشروع Docker محلي على macOS، استخدم نقطة توصيل مقيدة (bind mount) عندما تحتاج إلى تعديل الملفات نفسها أو فحصها في كل من macOS والحاوية؛ واستخدم وحدة تخزين مسماة (named volume) عندما يجب أن تمتلك الحاوية بيانات دائمة مثل قاعدة بيانات أو ذاكرة تخزين مؤقت. الاختبار العملي هو ما إذا كنت بحاجة إلى وصول مباشر إلى الملفات في Finder أو في تطبيق Mac. إذا كانت الإجابة نعم، فقم بربط مجلد المشروع المحدد. وإذا لم تكن كذلك، فاحتفظ بالبيانات في وحدة تخزين مسماة يديرها Docker.
ما الذي يختلف بين نوعي التوصيل هذين؟
توصل نقطة التوصيل المقيدة مسارًا على جهاز Mac الخاص بك بمسار داخل الحاوية. وتكون التغييرات مرئية من كلا الجانبين، مما يجعلها مفيدة للشفرة المصدرية والإعدادات والملفات المنشأة التي تريد الاحتفاظ بها في مجلد مشروعك. أما وحدة التخزين المسماة فيتم تخزينها وإدارتها بواسطة Docker، ويتم ربطها بالحاوية في مسار تختاره. يوصي Docker بوحدات التخزين لبيانات الحاوية الدائمة وعندما لا يحتاج المضيف إلى وصول مباشر إلى الملفات. توضح وثائق Bind mount في Docker ووثائق Volume هذه الاختلافات.
| بياناتك | الخيار المعتاد | السبب |
|---|---|---|
| الملفات المصدرية التي تعدلها في بيئة تطوير متكاملة (IDE) على Mac | نقطة توصيل مقيدة (Bind mount) | يصل كل من Mac والحاوية إلى ملفات المشروع. |
| دليل بيانات قاعدة بيانات | وحدة تخزين مسماة (Named volume) | يدير Docker بيانات الحاوية الدائمة دون مشاركة كل ملف من ملفات قاعدة البيانات عبر macOS. |
| المخرجات التي تريد فتحها أو استخدامها مع أدوات Mac | نقطة توصيل مقيدة (Bind mount) | تظهر المخرجات في مسار Mac المحدد. |
| الحالة المؤقتة التي يمكن التخلص منها | لا هذا ولا ذاك بشكل افتراضي | فكّر فيما إذا كانت البيانات بحاجة إلى الاستمرار أصلاً؛ فوحدة التخزين المسماة تظل موجودة بعد إزالة الحاوية ما لم تقم بإزالتها بشكل منفصل. |
لماذا يجعل macOS لهذا الاختيار أهمية؟
يشغل Docker Desktop حاويات Linux داخل جهاز افتراضي يعمل بنظام Linux، وبالتالي فهو يتوسط الوصول بين نظام ملفات Mac والحاويات. تشير وثائق إعدادات Docker إلى أن مشاركة ملفات المضيف تفرض عبئًا إضافيًا على الأداء؛ فمشاركة عدد كبير جدًا من الملفات قد تؤدي إلى زيادة حمل المعالج (CPU) وإبطاء عمليات نظام الملفات. وتوصي بالتحديد بالاحتفاظ بالعناصر غير المتعلقة بالشفرة البرمجية مثل ذاكرة التخزين المؤقت وقواعد البيانات في وحدة تخزين بيانات عندما يكون الأداء مهمًا. إعدادات Docker Desktop
لا تعني هذه التوجيهات أن كل عملية توصيل مقيدة ستكون بطيئة. بل تعني أن نوع البيانات وسير عملك الفعلي لهما أهمية. فشجرة الملفات المصدرية للمشروع هي خيار طبيعي لنقطة التوصيل المقيدة لأن التعديل على جهاز Mac هو الهدف الأساسي. أما ملفات قاعدة البيانات العديدة والمتغيرة باستمرار فلا تحتاج عادةً إلى استعراضها في Finder، لذا تعد وحدة التخزين المسماة نقطة بداية أفضل. وبالنسبة للمستودعات الكبيرة بشكل غير معتاد، توثق Docker Desktop أيضًا ميزة "مشاركات الملفات المتزامنة" (Synchronized file shares) كخيار محدود بالاشتراكات يمكن أن يحسن أداء نقاط التوصيل المقيدة؛ حيث يغير سلوك مشاركة الملفات، وليس التمييز الأساسي بين الشفرة المصدرية المرئية للمضيف ووحدة التخزين التي يديرها Docker. مشاركات الملفات المتزامنة (Synchronized file shares)
إعداد مجلد المشروع ووحدة تخزين قاعدة البيانات
من Terminal، انتقل إلى دليل مشروعك واستخدم نقطة توصيل مقيدة للتعليمات البرمجية. يقوم هذا المثال بتوصيل المجلد الحالي عند المسار /workspace في حاوية Alpine للاستخدام لمرة واحدة؛ استبدل الصورة أو الأمر بما يناسب حاوية التطوير الخاصة بك.
docker run --rm -it \
--mount "type=bind,source=$PWD,target=/workspace" \
alpine:latest sh
في واجهات الأوامر (shells) الافتراضية لنظام macOS، يتم توسيع $PWD إلى الدليل الحالي. يؤدي وضع علامات الاقتباس حول وسيطة التوصيل بالكامل إلى الحفاظ على تماسك مسار المضيف الموسع إذا كان اسم المجلد يحتوي على مسافات. إن صيغة --mount في Docker واضحة ومحددة. يجب أن يكون مسار المضيف موجودًا: يوضح Docker أن غياب مسار المصدر يؤدي إلى فشل --mount بشكل افتراضي. تكون نقطة التوصيل المقيدة قابلة للكتابة ما لم يتم تحديدها للقراءة فقط، وبذلك يمكن لعملية داخل الحاوية تغيير الملفات في دليل Mac الموصول. استخدم readonly عندما تحتاج الحاوية فقط إلى قراءة المشروع. خيارات وسلوكيات Bind mount
بالنسبة للبيانات التي تمتلكها الحاوية، أنشئ وحدة تخزين مسماة واربطها بدلاً من ذلك. يبدأ هذا الأمر تشغيل PostgreSQL مع وحدة تخزين في دليل البيانات القياسي الخاص بها:
docker volume create project-db
docker run --name project-postgres \
--mount type=volume,source=project-db,target=/var/lib/postgresql/data \
-e POSTGRES_PASSWORD='local-dev-only' \
-d postgres:17
هنا، project-db هو اسم وحدة التخزين الدائمة، وPOSTGRES_PASSWORD هو إعداد محلي توضيحي، وليس نمطًا لإدارة الأسرار في بيئات الإنتاج. لا تؤدي إزالة الحاوية إلى إزالة وحدة التخزين المسماة تلقائيًا. يساعد هذا الثبات عند استبدال الحاوية، ولكنه يعني أيضًا أن البيانات القديمة يمكن أن تظل موجودة وقد تعيد عملية تشغيل جديدة استخدامها. احتفظ بملاحظة تتضمن اسم وحدة التخزين وتكوين الحاوية اللازم لإعادة الاتصال بها.
التحقق من الرؤية وقابلية النقل والتنظيف
قبل الاختيار، اسأل نفسك: هل سأفتح هذه الملفات بعينها أو أعدلها باستخدام برامج Mac؟ إذا كان الأمر كذلك، فقم بتوصيل أضيق مجلد يخدم المهمة عبر bind mount، بدلاً من مشاركة جزء واسع دون داعٍ من دليلك الرئيسي (Home directory). يلاحظ Docker أن macOS وLinux يتعاملان مع حالة الأحرف في أسماء الملفات بشكل مختلف، مما قد يكشف عن مشكلات حساسية حالة الأحرف لأسماء الملفات داخل الحاوية. تحقق من الأسماء بعناية إذا كان المشروع يتصرف بشكل مختلف داخل Linux. ملاحظات مشاركة الملفات في Docker Desktop
إذا كان ينبغي أن تظل الملفات داخل حدود الحاوية، فاختر وحدة تخزين مسماة وأدرها باستخدام أوامر volume في Docker. وحدة التخزين ليست مجلدًا عاديًا يظهر في Finder بموقع المشروع المعتاد؛ حيث يخزن Docker Desktop بيانات Linux الخاصة بها في بيئة جهازه الافتراضي (VM). تعامل مع إزالة وحدة التخزين كخطوة لحذف البيانات، وقم بعمل نسخة احتياطية من محتويات وحدة التخزين المهمة بشكل منفصل. تشير إرشادات النسخ الاحتياطي في Docker إلى أن صور الحاويات لا تتضمن تغييرات نظام الملفات المخزنة في وحدات التخزين المتصلة. النسخ الاحتياطي والاستعادة في Docker Desktop
تعتمد نقطة التوصيل المقيدة على وجود مسار المضيف، لذا قد تكون أقل قابلية للنقل عبر أجهزة Mac ذات هياكل الأدلة المختلفة. وتتجنب وحدة التخزين المسماة هذا الاعتماد على مسار المشروع، ولكن بياناتها لا تزال بحاجة إلى خطة نسخ احتياطي أو ترحيل واضحة. وبالتالي، فإن الخيار الافتراضي البسيط للعديد من مشاريع التطوير على Mac هو نقطة توصيل مقيدة (bind mount) للشفرة المصدرية ووحدة تخزين مسماة (named volume) لحالة قاعدة البيانات، مع توثيق موقع كل بيانات في تكوين Compose الخاص بالمشروع أو تعليمات التشغيل.
المصادر
Bind mounts — Docker
Volumes — Docker
تغيير إعدادات Docker Desktop — Docker
مشاركات الملفات المتزامنة (Synchronized file shares) — Docker
كيفية إجراء النسخ الاحتياطي واستعادة بيانات Docker Desktop — Docker