مدونة عمار الخوالده

مفهوم الـ Volumes في Docker مع مثال على استخدام PHP CLI


مفهوم الـ Volumes في Docker مع مثال على استخدام PHP CLI
سلسلة أساسيات Docker

تجهيز المشروع

في هذا المقال سنبدأ بالتطبيق على المفاهيم الموجودة في المقال السابق بمثال عملي ثم نشرح بعض المفاهيم الجديدة خلال شرح المثال.

لتجهيز المشروع تم إنشاء ملف index.php على المسار ~/project/ وبداخل هذا الملف سنقوم بطباعة نسخة الـ PHP التي تم تشغيل الملف باستخدامها.

1<?php
2
3echo 'Current PHP version is: ' . phpversion() . PHP_EOL;

قمت بتشغيل الملف باستخدام نسخة PHP الموجودة على جهازي دون استخدام Docker كما ترى في الصورة:

نسخة php المثبتة على جهازي

العمل بحاوية PHP 7.4 بدلا من النسخة المثبتة على الجهاز

كما رأيت سابقا، النسخة الموجودة على جهازي هي 8.1.3، لنفترض أننا نريد تشغيل المشروع على النسخة 7.4، أولا لنقم بتجربة تشغيل حاوية PHP بنسخة 7.4 ثم لنحاول تشغيل الملف.

نسخة php عند تشغيلها باستخدام صورة Docker

يمكننا هكذا تشغيل الحاوية، لكن لو حاولنا تشغيل الملف index.php ستظهر رسالة خطأ تفيد بعدم وجود الملف:

خطأ عدم وجود ملف index.php داخل حاوية Docker

كما وضحنا في المقال السابق، ملفات الحاوية مستقلة عن ملفات النظام الذي تعمل عليه، لذلك فإن محاولة الوصول إلى الملف index.php لن تنجح.

مفهوم الـ Volume في Docker

لحل المشكلة السابقة، سنتطرق إلى مفهوم الـ Volume، الـ Volume يساعدك على مشاركة الملفات بين الحاويات والنظام المستضيف، ويتم ذلك عن طريق ربط مجلد (Directory) على النظام المستضيف بمجلد آخر على الحاوية.

لإنشاء Volume بين الحاوية والنظام المستضيف، ستحتاج لتزويد دوكر بمسار المجلد على الحاوية، ومسار المجلد على جهازك، أي تعديل يتم على المجلد داخل الحاوية سينطبق على المسار الذي تم تحديده على جهازك وبالعكس.

لنقم بإنشاء Volume للتطبيق على المثال السابق، نحتاج إلى عمل Volume بين مجلد ~/project الذي يحتوي ملفات المشروع على جهازي، وبين أي مجلد آخر على الحاوية، وليكن مثلا /var/www

ملاحظة: عند كتابة المسارات الخاصة بالـ Volume، يجب كتابتها على شكل absolute path وليس relative path.

صورة توضح كتابة أمر انشاء volume في الحاوية لربط المجلدات والملفات بين الحاوية ونظام التشغيل على جهازي

لاحظ أننا أضفنا إلى الأمر السابق الخيار -v وهو المستخدم لإنشاء volume، ثم يتم كتابة مسار الـ volume على جهازك أولا ثم المسار على الحاوية مفصولين بنقطتين رأسيتين : فيصبح الأمر هكذا:

1docker run -v ~/project:/var/www php:7.4 php /var/www/index.php

عادة ما يكون المسار الرئيسي الذي يتم تنفيذ الاوامر فيه (Working Directory) هو / أو الـ Root Directory. لذلك تلاحظ أننا في الأمر السابق لتمرير مسار ملف index.php قمنا بكتابة المسار كاملا، يمكنك استخدام الخيار -w كبديل لتحديد الـ Working Directory التي ستنفذ الأوامر بداخلها:

1docker run -v ~/project:/var/www -w /var/www php:7.4 php index.php

الأمر السابق سيعطينا نفس النتيجة لكن دون الحاجة لتمرير المسار كاملا للأمر المراد تنفيذه، هذا الخيار قد يكون مفيدا في حال كنت تريد تنفيذ أمر يعمل داخل الـ Working Directory دون القدرة على تمرير مسار للأمر.

توضيح أنواع الـ Volumes

الـ Volume مفيد جدا للحفاظ على البيانات، يمكنك الـ Volume من مشاركة الملفات مع الحاوية، أو الحفاظ على الملفات التي تقوم الحاوية بإنشائها، في أمثلة الدرس السابق، قمنا بإنشاء ملف abc.txt باستخدام الأمر touch، وبمجرد حذف الحاوية لن نتمكن من الوصول إلى هذا الملف مرة أخرى.

في المثال السابق، قمنا بإنشاء الـ Volume عن طريق تحديد المسار في النظام الذي نعمل عليه، والمسار داخل الحاوية، هذا النوع من الـ Volumes يسمى Host Volume، وهو مفيد عند مشاركة الملفات من نظام التشغيل إلى الحاوية.

في بعض الحالات، ربما لا يهمك المسار على نظام التشغيل الخاص بك، ويهمك فقط الحفاظ على الملفات التي تقوم الحاوية بإنشائها، كتشغيلك مثلا لحاوية MySQL، ستكون في هذه الحالة مهتما بالحفاظ على قواعد البيانات الخاصة بـ MySQL ولست مهتما بالمسار على نظام التشغيل، فيمكنك في هذه الحالة استخدام الـ Anonymous Volume، بالطريقة الآتية:

1docker run -v /var/lib/mysql mysql

في المثال السابق، لم أقم بتحديد مسار التخزين على جهازي، وقمت فقط بتحديد المسار /var/lib/mysql الذي يحتوي على ملفات MySQL على الحاوية، في هذه الحالة سيقوم Docker بتخزين هذه الملفات ضمن ملفات Docker، ويختلف المسار حسب نظام التشغيل.

ويمكن أيضا في هذه الحالة استخدام Named Volume كبديل، حيث يتم تحديد اسم للـ Volume:

1docker run -v mydatabasevolume:/var/lib/mysql mysql

إضافة اسم للـ Volume سيسهل التعامل معه لاحقا، فيمكن مثلا حذفه باستخدام الأمر التالي:

1docker volume rm mydatabasevolume

في المقالات القادمة من السلسلة سنبدأ بالتطبيق أكثر على مفهوم الـ Volumes وشرح مفاهيم أخرى خلال الأمثلة.

2 أساسيات الصور والحاويات - Images and Containers
4 شرح الـ Port Binding مع مثال على تشغيل Web Server بسيط

اقرأ أيضا