عملية تنصيب وتشغيل قواعد البيانات بالطريقة التقليدية ليست سهلة وتحتاج للعديد من الخطوات والاعدادات والتأكد من عدم استخدام ال port بواسطة برامج اخرى، في هذا الموضوع سوف نقوم بتشغيل قواعد البيانات في دوكر مثل Microsoft SQL Server وايضاً MySQL ونقوم بتشغيلهم بداخل ال Containers، وسوف ترى كيف أصبحت العملية بسيطة وسهلة، وسوف نتحدث عن كيفية الاحتفاظ بالبيانات حتى لو تم حذف ال Container وذلك من خلال ال Volumes. وأخيراً سوف نتحدث عن أوامر حذف ال Images وال Containers وال Volumes.
المواضيع في السلسلة:
- مقدمة حول دوكر Docker
- البداية مع دوكر Docker
- مشاركة المجلدات في دوكر Docker
- بناء ال Docker Images
- تشغيل قواعد البيانات في دوكر Database in Docker (الموضوع الحالي)
- تشغيل البرامج باستخدام ال Docker Compose
تشغيل MS-SQL Server بداخل ال Container
حتى وقت قريب كانت كل ال MS-SQL Server تعمل بداخل ويندوز، ولكن بدءاً من الإصدارات الحديثة قامت مايكروسوفت بدعم نظام لينوكس، وأصبح بالإمكان تشغيلها على لينوكس. وفي دوكر سوف تجد هناك بعض ال Images لل SQL Server التي تعمل على ال Linux Container وبعضها على ال Windows Container.
وسوف نستخدم النسخة التي تعمل على ال Linux Container بداخل ويندوز وهي نسخة رسمية من مايكروسوفت:
سوف نقوم اولاً بتحميل ال Image المطلوبة:
بعد ذلك سوف نقوم بتشغيل ال SQL Server، وعادة يجب الرجوع للتوثيق في ال Docker Hub لتعرف ما هي القيم المرسلة التي يجب ارسالها سواءً عند التشغيل أو لتغيير الاعدادات الافتراضية، ومثلاً في قواعد البيانات يجب ان تضع كلمة مرور للمستخدم الأساسي، وتحدد ال Mapping Port في النظام الأساسي والبورت الذي يعمل عليه ال SQL Server بداخل ال Container حتى تستطيع الوصول لها من النظام الأساسي، الصورة التالية تبين تشغيل ال SQL Server في ثواني معدودة وليس كما لو تستخدم الطريقة التقليدية فتثبيته يحتاج وقتاً واعدادات.
في الأمر أعلاه قمنا بتمرير عدة متغيرات نظام Environment Variable وهي الطريقة لكي ترسل أي متغيرات واعدادات للبرامج، حيث وافقنا على الشروط، ووضعنا كلمة مرور ويجب ان تكون معقدة Complex والا سوف تحصل على خطأ، وأيضاً حددنا أنه نريد ال Express Edition وتم تشغيل ال Container وحصلنا على ال ID
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=P@ssw0rd" -e "MSSQL_PID=Express" -p 1434:1433 -d microsoft/mssql-server-linux
سوف نقوم بمشاهدة السجلات logs لل Container وهي قد تحتاجها في حال لم تعمل أي Container فعليك استخدام الأمر docker logs id حيث تشاهد كل السجلات وتعرف الخطأ الذي صدر:
الأن سوف نقوم بالاتصال مع ال SQL Server من خلال ال SQL Server Management Studio وسوف أقوم في النظام الأساسي Host بفتحه والاتصال من خلال اسم المستخدم وعنوان IP الجهاز الحالي لأن ال Container تعمل عليه وقمت بعمل Mapping للبورت وبالتالي أستطيع الوصول له من خلال ذلك البورت.
من المهم ان تستخدم نسخة حديثة من ال SQL Server Management Studio مثلاً 2017 حيث هناك مشاكل تحدث عندما تحاول الوصول للسيرفر من كلاينت يعمل بنسخة قديمة، سواءً كان يعمل بداخل دوكر او حتى بشكل عادي، لذلك قم بتحميل ال Microsoft SQL Server Management Studio 2017.
لاحظ طريقة الاتصال وهو برقم ال IP للجهاز ويمكن الحصول عليه من خلال ipconfig ومن ثم فاصلة ورقم البورت الذي قمت بعمل Mapping ولأنه يتواجد لدى في جهازي الأساسي SQL Server يعمل على البورت 1433 الافتراضي فقمت بتغيير البورت لبورت اخر.
هكذا تم الاتصال بين ال SQL Server Client المتواجد على النظام الأساسي في ويندوز، وتستطيع انشاء أي قاعدة بيانات تريدها بشكل طبيعي.
تشغيل MySQL بداخل ال Container
يمكنك تحميل النسخة الرسمية ل MySQL من خلال Docker Hub:
وسوف تجد في هذه الصفحة تفاصيل تشغيل الداتابيس وما هي البورت التي يجب عمل Mapping لها، وسوف نقوم بتشغيلها كالتالي:
لاحظ أننا لم نقوم بعمل Mapping لل container وبالتالي لن نستطيع الوصول لها من النظام الأساسي، ويمكن القيام بذلك أو يمكن ان نستخدم ال MySQL Client المتواجد في هذه ال Container، لذلك سوف نقوم بالدخول عليها من خلال الأمر docker exec ونقوم بالاتصال مع الكلاينت لكي نستعرض قاعدة البيانات التي تعمل الآن.
حفظ البيانات في ال Volumes
تحدثنا سابقاً عن مفهوم ال Volume وأنه يمكن عمل Mounting لمجلد من النظام الأساسي الى مسار بداخل ال Container، ولقد ذكرنا ان هناك استخدام آخر لل Volumes الا وهو في حفظ البيانات حتى لو تم إيقاف او حذف ال Container سوف تبقى البيانات محفوظة في حال تم استخدام ال Volume.
لنقوم بكتابة الأمر التالي لعرض كل ال Volume الموجودة في الجهاز docker volume ls:
لنجرب الان إيقاف ال mysql وذلك من خلال الأمر docker stop some-mysql وقم بتنفيذ الأمر docker volume ls مجدداً وسوف تجد ال volume متواجد ايضاً، وهذه ال Volume الموجودة تم انشائها عند تشغيل ال mysql أول مرة.
وهذا الأمر جيد فحتى لو حذفت ال database container فسوف تكون البيانات موجودة، والبيانات سوف تكون موجودة على النظام الأساسي في مجلد باسم غير محدد (لكن بالإمكان تحديده كما سيلي) مع مسار تخزين البيانات بداخل ال container وهذه يتم تحديدها بواسطة ال image ومن قام ببنائها، وبالتالي لن يتم تخزين أي بيانات في ال Container وانما ستكون بنفس فكرة ال Volume التي تحدثنا عنها سابقاً وأنها مشاركة للمجلد المتواجد على النظام الأساسي.
بالتالي في حال قمت بتشغيل new MySQL container فسوف تجد انه يعمل بنفس البيانات بالضبط، وهذه ميزة جيدة حيث بالإمكان ترقية ال database version وتشغيله على نفس البيانات بالضبط.
سوف نقوم بتشغيل MySQL instance جديدة وسوف نحدد named volume لكي يستخدمها، وبعد الانشاء كما تلاحظ سوف يتم انشاء volume بالاسم الذي تم تحديده بدلاً من رقم عشوائي
سوف نقوم الان بالدخول لل MySQL وننشئ قاعدة بيانات جديدة بالاسم firstDb كما يلي:
بعد ذلك سنقوم بحذف ال MySQL container ونتأكد من أنه لا يوجد أي MySQL Container تعمل:
بعد حذف ال container فلن يتم حذف ال Volume، وفي حال قم بتشغيل new MySQL container بدون تحديد ال volume فسوف يتم انشاء volume جديد، ولكن في حال قمت بتحديد volume موجود لديك فسوف يتم استخدامه، الصورة التالية تبين اولاً عرض ال volume ومن ثم قمنا بتشغيل ال MySQL container بال volume المحدد، وبعد ذلك عرضنا ال volume للتأكد من عدم انشاء volume جديدة، واخيراً قمنا بالدخول على ال container وعرضنا الداتابيس وفعلاً وجدتا قاعدة البيانات التي أنشأناها مسبقاً.
وهكذا تكون قواعد البيانات محفوظة بغض النظر عن ال container الذي قام بأنشائها.
الحذف – إيقاف ال Containers
عند تعاملك مع ال containers سوف تجد أنك تقوم بتحميل العديد من ال images وقد تكون كبيرة ولذلك قد تود حذف البيانات التي لا تريدها.
نريد أولاُ إيقاف ال Containers التي تعمل، وذلك من خلال الأمر docker stop id ولكن في حال لديك عدة containers تعمل وتريد ايقافهم جميعاً فيمكنك استخدام الأمر docker ps –q والذي يعرض ال Id لل containers، الصورة التالية توضح الأمر docker ps –q حيث ظهر كل ال containers id، والأمر الثاني هو دمج docker stop مع docker ps –q وبالتالي إيقاف كل ال containers التي تعمل.
لاحظ قمنا بالدخول أولاً على ال PowerShell حتى يسمح لنا باستخدام معامل $ وهكذا كما هو واضح تم إيقاف كل ال containers التي تعمل.
الحذف – حذف ال Containers
عند ايقافك لل containers فسوف تتوقف من العمل ولكنها تكون موجودة ويمكن تشغيلها مجددأً، وإذا اردت حذفها فهذا عن طريق الأمر docker rm id وسوف نقوم الان بعرض كافة ال containers (التي تعمل والمتوقفة) وهم جميعهم الآن Stopped ونقوم بحذفهم جميعاً وذلك من خلال دمج الأمر docker ps –a مع الأمر docker rm مع إضافة q الى docker ps –aq حتى نحصل على ال ids لهم فقط، كما يلي:
وايضاً يمكن استخدام الأمر docker container prune والذي سوف يقوم بحذف كل ال containers المتوقفة. إذا لم تكن تريد حذف كل شيء، وذلك لأن الأمر docker ps –a سوف يظهر جميع ال containers التي تعمل والتي لا تعمل.
الحذف – حذف ال Volumes
كما ذكرنا يتم انشاء ال Volume بواسطة ال Database Containers غالباً حيث نريد الاحتفاظ بالبيانات حتى بعد حذف ال containers، وفيما يلي سوف نستخدم أمر الحذف docker volume rm ونمرر لها اسم ال volume، أو نقوم بحذفهم جميعاً عن طريق الدمج docker volume ls –q مع أمر الحذف كما يلي:
ويمكن ايضاً استخدام الأمر docker volume prune لحذف ال volume غير المستخدمة بواسطة containers. وايضاً يمكن استخدام الأمر docker rm –fv id عند إيقاف وحذف ال container وتحديد v لحذف ال volume المرتبطة به، ولكن يجب ان تكون بدون اسم، وسيتم حذفها معهم.
عندما يتم حذف ال container المرتبط بال volume سوف تعتبر dangling volume لأنها غير مستخدمة وال container تم حذفها ايضاً، فيمكن استخدام امر لحذف ال dangling volume كما يلي، وسيتم أولاً انشاء 2 containers وبعدها سنقوم بحذف واحد منهم، وبالتالي أحد ال volume سوف يكون dangling، وسوف نقوم بعرضه اولاً ومن ثم حذفه:
الآن ما زالت هناك container تعمل وبها ايضاً volume موجودة، فيمكن حذفهم بالطرق السابقة، كما يلي:
الحذف – حذف ال Images
لحذف ال image يتم استخدام docker rmi image_name ويتم تمرير اسم أو معرف ال Image الذي تريد حذفها:
ولن تستطيع حذف Image مستخدمة بواسطة container ويجب إيقافه اولاً وحذفه قبل حذف ال image المستخدمة. ولحذف جميع ال images يمكن تطبيق الأمر docker rmi $(docker images –q) وسيتم حذفها جميعاً.
ويمكن استخدام الأمر docker image prune لحذف كل ال dangling image، وهي ال Image التي لا Tag واسم لها، وهي تحدث عندما تقوم ببناء الImages في جهازك بشكل متكرر بنفس ال tag، فقد تجد النسخ القديمة أصبحت بدون تاق. ويمكن حذفها بهذا الأمر.
خلاصة
هناك نوعين من ال Volumes:
- الأول لمشاركة الملفات عن طريق Mounting لملفات من النظام الأساسي لل Container
- النوع الثاني Managed Volume وهي التي يتم انشائها بواسطة الأمر docker volume سواءً للإنشاء او الحذف وغيرها، وهي كأنه يتم انشاء قرص صلب hard disk ومن ثم عمل mount له الى ال container.
ال Managed Volume تكون غير متعلقة بال Container فهي تعتبر قرص صلب إضافي ولكن تم عمل mount له لل Container، فاذا تم حذف تلك ال Container فتكون البيانات متواجدة، ويمكن عمل mount لها مجدداً في Container جديد يتم انشاءه.
وايضاً البيانات في ال Volume ليست موجودة في ال Image، فمثلاً إذا قمت بإنشاء container ونسخت بيانات الموقع الى ال volume فعند اخذ صورة commit له فلن تحصل على البيانات لأنها لا تعتبر جزءاً من ال image.
لذلك دائماً ضع البيانات الخاصة بالقراءة heavy read-only data في image، وضع البيانات التي ستكتب في ال Volumes مثل قواعد البيانات وغيرها.
مرحبا استاذ ..كيف يمكنني التواصل معك