لا شك أن أداة بودمان ممتازة لإدارة الحاويات بما تقدمه من ميزات متعددة، لكنها لا توفر خاصية التشغيل التلقائي للحاويات عند إقلاع النظام، سنتعلم في هذا المقال كيف نجد حلًا لهذه المشكلة.
على الرغم من أن أداة بودمان لا تعمل كبرنامج خفي daemon، وتسمح للمستخدم محدود الصلاحيات unprivileged user بتشغيل الحاويات دون الحاجة إلى الوصول إلى الجذر، مما يزيد من أمان النظام. لكنها ليست أداةً مثاليةً بالكامل فهي لا تُتيح إعادة تشغيل الحاويات تلقائيًا بعد إقلاع الخادم.
سياسة إعادة تشغيل الحاويات
عند الاطلاع على صفحة التعليمات man الخاصة بالأمر podman-run
ستجد أن خيار إعادة التشغيل restart--
لا يعيد تشغيل الحاويات عندما يقلع النظام. وسبب هذا يرجع إلى أن بنية بودمان لا تعتمد مبدأ البرنامج الخفي، أي إن بودمان لا يعمل تلقائيًا عند إقلاع النظام، وبالتالي فإن الحاويات لا تعمل عند الإقلاع أيضًا. على عكس أداة دوكر التي تعتمد مبدأ البرنامج الخفي الذي يعمل عند إقلاع النظام ويُشَغّل الحاويات المحددة.
حل مشكلة عدم التشغيل التلقائي للحاويات
أيًّا كانت توزيعة نظام التشغيل التي تعمل عليها فلا بد أنها تستخدم systemd كنظام تمهيد init، وهذا ما سنحاول الاستفادة منه في إيجاد حل للمشكلة.
الخطوة الأولى: إعداد الحاوية وتشغيلها
ثمة عدة طرق ممكنة لتشغيل الحاوية. إن كان لديك حاوية بسيطة فبإمكانك استخدام الأمر podman run
. أو يمكنك استخدام ملف دوكر إن أردت حاويةً بإعدادات معقدة واحتجت لمزيد من التحكم بهذه الإعدادات. لتوضيح ذلك، سننشئ حاويةً من صورة الحاوية mariadb
وسنسميها chitragupta-db
.
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 422eed872347 docker.io/library/mariadb:latest --transaction-iso... 58 seconds ago Up 58 seconds ago chitragupta-db
يمكنك إيقاف الحاوية الجديدة لاحقًا.
الخطوة الثانية: إنشاء خدمة systemd
كما ذكرنا سابقًا، فإن بودمان ليس برنامجًا خفيًا أي إنه daemon-less لإدارة الحاويات. إذًا، فإن تشغيل حاويات بودمان يحتاج إلى تشغيل يدوي أو خارجي. سننفذ ذلك من خلال إنشاء خدمة systemd. حيث إن خدمة systemd هي نظام تمهيد init يدير الخدمات والبرامج الخفية في أنظمة تشغيل لينكس.
إنشاء ملف وحدة systemd
ليس عليك إنشاء ملف وحدة systemd يدويًا، إذ يمكن تنفيذ ذلك باستخدام الأمر podman generator systemd
على النحو التالي:
podman generate systemd --new --name CONTAINER_NAME
لإنشاء ملف وحدة systemd للحاوية استخدم الأمر podman generate systemd
متبوعًا باسم الحاوية، اسم الحاوية في مثالنا هو chitragupta-db:
كما تلاحظ فإن الأمر السابق نفّذ العمل المطلوب، ولكننا لم ننته من العمل بعد.
إن خرج الأمر podman generate systemd
هو ما يجب أن يكون موجودًا في ملف وحدة systemd، لكن ثمة خيار مفيد يمكنك الاستعانة به بدلًا من نسخ الخرج ولصقه، وهو الخيار files --
أو اختصارًا f-
. إذ سيؤدي استخدام هذا الخيار أولًا إلى ملء الملف بالمحتوى المطلوب بدلاً من طباعته على الطرفية، وثانيًا، إنشاء ملف باسم Container-CONTAINER_NAME.service
في مجلد العمل الحالي.
$ podman generate systemd --new --name chitragupta-db -f /home/pratham/container-chitragupta-db.service $ ls *.service Container-chitragupta-db.service
لاحظ أن اسم الحاوية في مثالنا هو chitragupta-db
، وأنه أصبح لدينا ملف باسم container-chitragupta-db.service
في المجلد الحالي. بما أن الأمر podman generate systemd
سوف ينشئ ملف وحدة systemd
فإن بإمكانك استخدام الخيارات التالية =after=
, --requires=
, --wants--
لتحديد الاعتماديات للحاويات.
نقل ملف خدمة systemd إلى موقع محدد
كما لاحظت فإن الأمر السابق سينشئ ملف وحدة systemd جديد في مجلد العمل الحالي، لكن ذلك ليس الخيار الأنسب. إليك المسار المناسب للملف بالنسبة للمستخدم المسؤول superuser: /etc/systemd/system/
أما بالنسبة للمستخدم محدود الصلاحيات non-root user فهو: ~/.config/systemd/user/
والآن عليك نقل الملف إلى المجلد المناسب. بما أن الحاوية في مثالنا هي حاوية محدودة الصلاحية، فعليك نقلها إلى المجلد config/systemd/user/.~
.
$ mv -v container-chitragupta-db.service ~/.config/systemd/user/ renamed 'container-chitragupta-db.service' -> '/home/pratham/.config/systemd/user/container-chitragupta-db.service'
وهكذا بعد أن أنشأت ملف وحدة systemd بالاستعانة بأوامر الطرفية ونقلته إلى المجلد الصحيح، ما تبقى عليك الآن هو تفعيله.
الخطوة الثالثة: تفعيل حاوية خدمة systemd
عليك الآن أن تعيد إقلاع systemd
كي تتفعل الخدمة التي أنشأتها في الخطوة السابقة. استخدم الأمر التالي لإعادة تشغيل خدمة systemd
للمستخدم الجذر:
sudo systemctl daemon-reload
أما بالنسبة للمستخدم محدود الصلاحيات فعليك إزالة الأمر sudo
وإضافة الخيار user--
، كي يصبح الأمر على الشكل التالي:
systemctl --user daemon-reload
وهكذا سيُعاد تشغيل خدمة systemd
دون إعادة إقلاع النظام، وسيُحدّث وتظهر الخدمة الجديدة container-chitragupta-db.service
.
والآن أصبح بإمكانك تفعيل الخدمة الجديدة. استخدم الأمر التالي لتفعيل الخدمة للمستخدم الجذر:
sudo systemctl enable SERVICE_NAME.service
أما بالنسبة للمستخدم محدود الصلاحيات فعليك إزالة الأمر sudo
وإضافة الخيار user--
، كي يصبح الأمر على الشكل التالي:
systemctl --user enable SERVICE_NAME.service
ستحصل على الخرج التالي عند تفعيل الحاوية محدودة الصلاحية root-less container:
$ systemctl --user enable container-chitragupta-db.service Created symlink /home/pratham/.config/systemd/user/default.target.wants/container-chitragupta-db.service → /home/pratham/.config/systemd/user/container-chitragupta-db.service.
يمكنك التحقق من حالة الخدمة بعد تفعيلها بإضافة الأمر status
على الأمر السابق للمستخدم الجذر والمستخدم محدود الصلاحية وفقًا لما يلي:
# للمستخدم الجذر sudo systemctl status SERVICE_NAME.service # للمستخدم محدود الصلاحية systemctl --user status SERVICE_NAME.service
إليك حالة الخدمة container-chitragupta-db
:
$ systemctl --user status container-chitragupta-db.service ○ container-chitragupta-db.service - Podman container-chitragupta-db.service Loaded: loaded (/home/pratham/.config/systemd/user/container-chitragupta-db.service; enabled; vendor preset: disabled) Active: inactive (dead) Docs: man:podman-generate-systemd(1)
لا تقلق لأن حالة الخدمة تظهر غير نشطة inactive (dead)، إذ فعّلنا الخدمة الآن ويجب أن تعمل الخدمة عند إقلاع النظام، وليس الآن، وهذا هو المطلوب. إذا لم توقف الحاوية في الخطوة الأولى، فهذا هو الوقت المناسب لإيقافها عن طريق استخدام الأمر podman stop
ثم استخدام
الأمر podman container rm
لحذفها، وإعادة إقلاع النظام بعدها لتشغيل خدمة الحاوية.
الخطوة الرابعة: تفعيل خدمة إعادة التشغيل
قد تحتاج في بعض التوزيعات إلى تفعيل خدمة إعادة التشغيل في بودمان أيضًا. ينطبق هذا على التوزيعات غير المعتمدة على نظام فيدورا، وخاصةً توزيعة NixOS.
لتفعيل خدمة إعادة التشغيل عليك استخدام الأمر التالي:
systemctl --user enable podman-restart.service
يحرص الأمر podman-restart
على إعادة تشغيل جميع الحاويات التي ضُبطت ليُعاد تشغيل دائمًا أي عند ضبط الأمر restart-policy
على الخيار always
.
الخطوة الخامسة، تفعيل بقاء المستخدم محدود الصلاحية نشطًا (خطوة اختيارية)
بما أنك فعّلت هذه الخدمة بواسطة مستخدم عادي محدود الصلاحية وليس المستخدم الجذر، هذا يعني أن المستخدم يحتاج إلى تسجيل الدخول عند التشغيل ويجب أن يظل نشطًا إن خرج من جلسة واجهة المستخدم الرسومية GUI أو من الطرفية. ويمكن تحقيق ذلك باستخدام الأمر loginctl
من طرفية المستخدم نفسه، على النحو التالي:
sudo loginctl enable-linger
يضمن هذا الأمر تفعيل جلسة المستخدم عند الإقلاع وبقاءها نشطةً حتى بعد تسجيل الخروج من واجهة المستخدم الرسومية أو الطرفية.
وبهذا تكون قد فعّلتَ إعادة تشغيل حاويات بودمان عند الإقلاع. حيث ستؤدي إعادة تشغيل النظام إلى التشغيل التلقائي للحاويات التي أنشأت لها ملف وحدة systemd.
تعديل خدمة systemd
نعلم جميعًا أن الإعدادات الافتراضية تفيد المبتدئين دائمًا، إذ تساعد على تخفيف شعور الارتباك لديهم. تُعد الإعدادات الإفتراضية لملف systemd الذي أنشأته مثاليةً لمعظم الأشخاص، لكن إن لم تكن مبتدئًا فبإمكانك إضافة مزيد من التعديلات من خلال تعديل ملف systemd أو إنشاء خدمة مخصصة جديدة من الصفر.
الخلاصة
تعلمنا في هذا المقال كيفية إنشاء ملفات وحدة systemd للتشغيل التلقائي لحاويات بودمان عند إقلاع النظام. حيث أن استخدام خدمة systemd سيساعدك في مراقبة الحاويات التي تستخدم واجهة systemd.
ترجمة وبتصرّف للمقال Autostarting Podman Containers من موقع Linux Handbook.
تعليقات
إرسال تعليق