مقدمة
Docker هو منصة حاويات توفر بيئة قياسية خفيفة الوزن، وافتراضية، ومحمولة، ومحددة بالبرمجيات تسمح للبرامج بالعمل بمعزل عن البرامج الأخرى التي تعمل على الجهاز المضيف الفعلي. يعد Docker مكونًا أساسيًا في جانب التطوير والدمج المستمر (Continuous Development and Integration) لتطوير البرمجيات. من خلال توفير بيئة تشغيل متسقة، يضمن Docker أن يعمل البرنامج بنفس الطريقة بغض النظر عن الجهاز المضيف الفعلي الذي تم نشره عليه. للحصول على نظرة شاملة على نظرة عامة على نظام Docker البيئي، راجع هذه المقالة.
بينما تكون حاويات Docker قائمة بذاتها، فإنها تحتاج أحيانًا إلى مشاركة الوصول إلى البيانات أو حفظ البيانات على القرص بعد إيقاف الحاوية. يمكن أن تكون البيانات في شكل قواعد بيانات، أو ملفات سجل، أو بيانات من إنشاء المستخدمين. من المستحيل تضمين مثل هذه البيانات في ملف تكوين صورة Docker، ولكن يجب أن تكون متاحة ليعمل تطبيقك كما هو متوقع. يتم التعامل مع مشاركة البيانات وحفظها في حاويات Docker بواسطة Docker Volumes. يمكن إنشاء Docker Volumes أثناء إنشاء الحاوية أو إنشاؤها لاحقًا وإرفاقها بالحاويات. في هذا البرنامج التعليمي، سنناقش الطرق الأربع المختلفة لمشاركة البيانات بين الحاويات.
المتطلبات الأساسية
- إعداد خادم يعمل بنظام التشغيل Ubuntu 20.04 و إنشاء مستخدم غير جذر (non-root) يتمتع بصلاحيات sudo. قم بتسجيل الدخول باستخدام المستخدم غير الجذر لمتابعة الخطوات التالية.
- تثبيت Docker - لدينا برنامج تعليمي حول كيفية تثبيت وتشغيل Docker على Ubuntu، تحتاج إلى اتباع الخطوات 1 و 2 و 3 و 4. يجب أن يعمل هذا مع أي توزيعة Ubuntu.
يرجى ملاحظة أنه على الرغم من أننا نعمل مع Ubuntu 20.04، فإن الإرشادات والأوامر الخاصة بـ Docker ستعمل على أي نظام تشغيل آخر مثبت عليه Docker وتمت إضافة مستخدم sudo إلى مجموعة docker كما هو موضح في المتطلبات الأساسية أعلاه.
الخطوة 1: إنشاء مجلدات Docker مستقلة (Independent Docker Volumes)
سنبدأ بإنشاء مجلدات مستقلة غير مرتبطة بأي حاوية Docker. لتحقيق ذلك، لدينا الأمر docker volume create الذي تم تقديمه في إصدار Docker 1.9. أدخل الأمر التالي لإنشاء مجلد باسم Step1DataVolume :
|
1 |
docker volume create --name Step1DataVolume |
يجب أن تشاهد المخرجات التالية التي تشير إلى نجاح إنشاء المجلد:
![]()
الآن بعد أن أصبح لدينا مجلد مستقل، يمكننا إنشاء حاوية جديدة من صورة Ubuntu الرسمية كمثال للاستفادة منها. أدخل الأمر التالي لإنشاء الحاوية وإرفاق المجلد:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
في هذا الأمر، فإن العلامة --rm ستقوم بحذف الحاوية تلقائيًا بعد الخروج. تُستخدم العلامة -v لتحديد المجلد وتركيبه (mount). تأخذ العلامة -v اسم المجلد، ونقطتين رأسيتين، والمسار المطلق داخل الحاوية حيث يجب أن يظهر المجلد. ضع في اعتبارك أنه عند تشغيل الأمر، إذا لم تكن الأدلة المحددة في المسار موجودة، فسيتم إنشاؤها. وإذا كانت موجودة بالفعل، فإن المجلد المركب سيخفي المحتوى الحالي. بالنسبة للعلامة -ti، فإن -t تمنح إمكانية الوصول إلى الطرفية (terminal)، وتسمح لنا -i بالتفاعل مع الحاوية من خلال الطرفية.
أثناء وجودك داخل الحاوية، قم بتشغيل الأمر التالي لكتابة بعض البيانات إلى المجلد:
|
1 |
echo "Step One Sample Text" > /Step1DataVolume/StepOne.txt |
اكتب exit واضغط على enter للخروج من الحاوية. كما تم توضيحه، يتم حذف الحاوية تلقائيًا عند الخروج، بفضل العلامة --rm، ومع ذلك، سيظل المجلد متاحًا للوصول إليه.
للتحقق من أن المجلد لا يزال موجودًا، يمكنك استخدام docker volume inspect أمر:
|
1 |
docker volume inspect Step1DataVolume |
يجب أن تشاهد المخرجات التالية:

بعد ذلك، لنقم بإنشاء حاوية جديدة. أولاً، قم بإرفاق المجلد ومعرفة ما إذا كان بإمكاننا الوصول إلى النص الذي أنشأناه في الحاوية السابقة. أدخل الأمر التالي لإنشاء وتشغيل الحاوية باستخدام ubuntu صورة:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
Inside the container, run the following command to verify that the StepOne.txt ملف موجود:
|
1 |
cat /Step1DataVolume/StepOne.txt |
يجب أن تشاهد مخرجًا مشابهًا:

بعد ذلك، اكتب exit واضغط على enter للخروج من الحاوية. في هذه الخطوة، تعلمت كيفية التعامل مع استمرارية البيانات باستخدام وحدات تخزين Docker مستقلة وكيفية إرفاق وحدات التخزين بالحاويات.
الخطوة 2: إنشاء وحدة تخزين Docker تحتفظ بالبيانات عند حذف حاوية
في هذه الخطوة، سنستخدم أمرًا واحدًا لإنشاء وحدة تخزين في نفس الوقت الذي ننشئ فيه حاوية. سنقوم بعد ذلك بحذف الحاوية وإرفاق وحدة التخزين بحاوية جديدة. الأمر مشابه للأمر المستخدم في الخطوة 1، ومع ذلك، نضيف خيارًا واحدًا --name، لتحديد اسم للحاوية:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
أثناء وجودك داخل الحاوية، أدخل الأمر التالي لكتابة البيانات إلى وحدة التخزين والتحقق من وجود البيانات هناك:
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
فيما يلي مخرجات الأوامر الثلاثة:

بعد ذلك، اخرج من الحاوية. عند إعادة تشغيل الحاوية باستخدام الأمر التالي، سيتم إرفاق وحدة التخزين تلقائيًا:
|
1 |
docker start -ai Step2Container1 |
داخل الحاوية، تحقق من تركيب وحدة التخزين عن طريق التحقق من وجود ملف StepTwo.txt باستخدام الأمر:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
إليك المخرج:

يمكنك الخروج من الحاوية الآن. يمنع Docker إزالة وحدة تخزين تشير إليها حاوية أخرى. يمكنك محاولة إزالة وحدة التخزين باستخدام الأمر:
|
1 |
docker volume rm Step2DataVolume |
يجب أن تشاهد رسالة الخطأ في المخرج:
![]()
دعنا نزيل الحاوية باستخدام معرف الحاوية الموضح في المخرج باستخدام docker rm أمر:
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
استبدل المظلل container id بـ id الخاص بحاويتك الموضح في الطرفية الخاصة بك. يزيل الأمر الحاوية، لكنه لا يزيل وحدة التخزين التي أنشأناها. يمكنك سرد وحدات التخزين المتاحة باستخدام docker volume ls أمر للتحقق:
|
1 |
docker volume ls |
إليك المخرج:

لإزالة الحاوية التي تم إنشاؤها في الخطوة 2، أدخل الأمر التالي:
|
1 |
docker volume rm Step2DataVolume |
في هذه الخطوة، تمكنت من إنشاء وحدة تخزين Docker في نفس وقت إنشاء الحاوية. دعنا نرى كيف يمكننا إنشاء وحدة تخزين من دليل موجود يحتوي على بيانات.
الخطوة 3: إنشاء وحدة تخزين Docker من دليل موجود يحتوي على بيانات
إذا كنت تريد نسخ البيانات إلى وحدة تخزين، يمكنك إنشاء وحدة تخزين أثناء إنشاء حاوية وتقديم المسار إلى دليل يحتوي على البيانات في الصورة الأساسية. في الأمر أدناه، ننشئ حاوية ونضيف وحدة تخزين بيانات في /var، وهو دليل يحتوي على بيانات في الصورة الأساسية:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
عند تشغيل الأمر، سيتم نسخ المحتوى من دليل /var الخاص بالصورة الأساسية إلى وحدة التخزين. يمكن إرفاق وحدة التخزين بحاوية جديدة. بعد ذلك، اخرج من الحاوية:

أدخل الأمر التالي لإنشاء الحاوية، وإرفاق وحدة التخزين وسرد محتويات وحدة التخزين باستخدام ls أمر:
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
يجب أن تشاهد مخرجًا مشابهًا من الأمر، وهو نسخة من محتويات دليل /var من الصورة الأساسية المتاحة الآن في Step3DataVolume:

بينما قد يكون تركيب /var دليل كما فعلنا في هذا المثال قد يكون غير عملي، إلا أنه يساعدنا على فهم أنه يمكنك تركيب أي دليل تم إنشاؤه في صورك المخصصة في وحدة تخزين Docker لإتاحة البيانات للحاويات الأخرى.
الخطوة 4: مشاركة البيانات بين حاويات Docker المتعددة
في معظم الحالات، ستحتاج إلى وصول حاويات متعددة إلى البيانات من وحدة تخزين Docker واحدة. في الأمثلة السابقة، قمنا فقط بإرفاق وحدة تخزين بحاوية واحدة. الآن، ستتعلم كيفية إرفاق وحدة تخزين بحاويات متعددة. على الرغم من أنه يمكنك تحقيق ذلك بسهولة، إلا أن Docker لا يتعامل مع قفل الملفات. بالنسبة للحاويات المتعددة التي تكتب في نفس وحدة التخزين، يجب عليك تصميم التطبيقات التي تعمل في تلك الحاويات بشكل فردي للتعامل مع الكتابة في مخازن البيانات المشتركة لتجنب تلف البيانات.
- إنشاء Step4Container1 و Step4DataVolume
استخدم docker run مع علامة --name لإنشاء حاوية ذات اسم:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
داخل الحاوية، قم بتشغيل الأمر التالي لإنشاء ملف نصي وإضافة بعض النصوص:
|
1 |
echo "Step Four Sample Text" > /Step4DataVolume/StepFour.txt |
بعد ذلك، اخرج من الحاوية وعد إلى بيئة المضيف. الآن، نريد إنشاء حاوية أخرى وتركيب وحدات التخزين من Step4Container1 إليها.
- إنشاء Step4Container2 وإرفاق وحدات التخزين من الحاوية Step4Container1
نفذ الأمر التالي لإنشاء Step4Container2 وتركيب وحدات التخزين من Step4Container1:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
داخل الحاوية، استخدم الأمر cat للتحقق من استمرار البيانات:
|
1 |
cat /Step4DataVolume/StepFour.txt |
يجب أن تشاهد المخرجات التالية:

يمكننا إلحاق المزيد من النص بالملف من Step4Container2 عن طريق إدخال الأمر التالي:
|
1 |
echo "We are appending text while inside Step4Container2" >> /Step4DataVolume/StepFour.txt |
اخرج من الحاوية بعد ذلك وسنعود إلى Step4Container1 للتحقق مما إذا كانت البيانات لا تزال موجودة.
- التحقق من التغييرات التي تم إجراؤها في وحدة تخزين Docker بين الحاويات المختلفة
لعرض التغييرات، ستقوم أولاً بإعادة تشغيل Step4Container1 باستخدام الأمر:
|
1 |
docker start -ai Step4Container1 |
تحقق من التغييرات باستخدام الأمر:
|
1 |
cat /Step4DataVolume/StepFour.txt |
يجب أن تشاهد مخرجات مشابهة للقطة الشاشة أدناه:

بمجرد التحقق من أن كلا الحاويتين يمكنهما قراءة البيانات وكتابتها في نفس وحدة التخزين، يمكنك الآن الخروج من الحاوية. كما ذكرنا، لا يتعامل Docker مع قفل الملفات، بل إنها مهمة منطق تطبيقك الذي يعمل داخل الحاويات والذي يجب أن يتعامل مع وصول القراءة والكتابة إلى مخازن البيانات المشتركة. يسمح Docker بتركيب وحدات التخزين كقراءة فقط لمنع تلف البيانات العرضي بواسطة الحاويات التي تتطلب فقط وصول القراءة فقط عن طريق إضافة :ro كما هو موضح في المثال التالي.
- تركيب وحدة تخزين في حاوية Docker كقراءة فقط
لهذا المثال، سنقوم بإنشاء حاوية باسم Step4Container3. في أمر الإنشاء، نقوم بتركيب وحدات التخزين من Step4Container1 ونضيف :ro لتحديد أن هذه الحاوية لديها صلاحية القراءة فقط ولكن لا يمكنها الكتابة في وحدة التخزين. نفذ الأمر التالي في جهازك الطرفي:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
بمجرد دخولك إلى الحاوية، يمكنك قراءة الملف النصي في وحدة التخزين عن طريق إدخال الأمر التالي:
|
1 |
cat /Step4DataVolume/StepFour.txt |

ومع ذلك، إذا حاولت إزالة الملف باستخدام الأمر:
|
1 |
rm /Step4DataVolume/StepFour.txt |
ستتلقى رسالة خطأ في الطرفية الخاصة بك مثل:
![]()
بمجرد التحقق من أذونات القراءة والكتابة، يمكنك الخروج من الحاوية. إذا كنت ترغب في تنظيف الحاويات ووحدة التخزين التي تم إنشاؤها في هذا الدرس التعليمي، فقم بتشغيل الأوامر التالية:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
في هذه الخطوة، تعلمت كيفية مشاركة البيانات بين حاويات متعددة باستخدام وحدات تخزين Docker بالإضافة إلى ربط وحدات تخزين البيانات بالحاويات كملفات للقراءة فقط.
الخاتمة
في هذا الدرس التعليمي، قمت بإنشاء بعض وحدات تخزين Docker وتعلمت كيفية مشاركة البيانات عبر حاويات Docker. أثناء التعامل مع مشاركة البيانات بين الحاويات، لاحظنا أن منطق التطبيق الفردي داخل الحاوية يجب أن يتعامل مع قفل الملفات لمنع تلف البيانات عند الكتابة في مخازن البيانات المشتركة، نظرًا لأن Docker لا يحتوي على آلية مدمجة للتعامل مع قفل الملفات.
لمزيد من الموارد حول استخدام Docker، قد ترغب في الاطلاع على المزيد من الدروس التعليمية على مدونتنا:
- كيفية مشاركة البيانات بين حاوية Docker والمضيف
- تنظيف موارد Docker – الصور والحاويات ووحدات التخزين
- نشر Laravel و Nginx و MySQL باستخدام Docker Compose
- تثبيت وإعداد Docker على CentOS 7
حوسبة سعيدة!
التعليقات
لا توجد تعليقات بعد. كن أول من يعلق.