تشغيل دوكر بدون الحاجة للوصول للجذر, Rootless docker

السلام عليكم ورحمة الله وبركاتة.

عندما تثبت دوكر سوف يحتاج صلاحيات كامله في النظام(root)، وهذا يسبب مشكله امنيه لان الحاويات و خدمة(daemon) دوكر ستعمل كرووت.
واذا تم اختراقها سيكون للمخترق وصول كامل للنظام، ولا يوجد عزل حقيقي للحاويات.

بعد صدور مشروع Podman وهو مصمم بشكل اساسي ليعمل بدون رووت، زاد الضغط على دوكر لدعم الميزه، وهو يدعم شيء من فتره طويله، بحيث تعمل الحاويات كمستخدم عادي لكن خدمة دوكر(daemon)تعمل كرووت, تفاصيل اكثر عن وضع استخدام نطاقات المستخدم هنا

لكن ميزة تشغيل دوكر بدون صلاحيات بالكامل صدرت بشكل تجريبي في ٢٠١٩، وصدرت بشكل كامل في ٢٠٢٠.

وفي هذا الموضوع سوف اشرح كيفية تثبيت دوكر بدون وصول للجذر, هذا موضوع جزء من سلسلة عن برمجية دوكر على أسس.

لماذا Docker بدلا عن Podman

السبب الاكبر لاستخدام دوكر بدلا عن podman هو التوافقية.
فانت لا تحتاج للتعامل مع podman وتعديل اشياء لانه يختلف من دوكر. هنا هو عبارة عن دوكر بدون رووت.

اذا لا تهمك التوافقيه قد تجد البنيه التحتيه لpodman و عدم اتباعيته لاي شركة بشكل مباشر شيء ممتاز. وايضا انه يسهل عليك تشغيل ملفات k8s فا اذا انت تستخدم k8s كثيرا قد يعجبك podman.

سلبيات تشغيل دوكر بوضع rootless

أكبر سلبيه في هذا الوضع هي الشبكة, وهذه المشاكل ايضا موجودة في podman.

Rootlesskit

بشكل افتراضي دوكر يستخدم شبكة rootlesskit.
لانها الاسرع, بحيث سرعتها تصل الى 30gbitps وتدعم ipv4 و ipv6.
لكن فيها مشكلة كبيره جدا
الحاويات لن يظهر لها ال IP الخارجي للطلب, وكل الطلبات ستظهر من 127.0.0.1
هذه مشكلة كبيرة, خاصه لو مثلا تريد وضع حماية تحد من هجمات حجب الخدمة الموزعة(DDOS) لان كل الطلبات ستظهر من نفس العنوان.

Slirp4netns

هذا الوضع يحل هذه المشكلة, ويظهر العنوان الاصل للطلب.
لكن فيه مشكلتين.

متطلبات مسبقة

تاكد من تثبيت حزم newuidmap newgidmap وانه هناك 65,536 id فرعي.

id -u
1001
 whoami
testuset
 grep ^$(whoami): /etc/subuid
testuser:231072:65536
 grep ^$(whoami): /etc/subgid
testuser:231072:65536
ماذا تعني هذه الارقام

الارقام بعد اسم المستخدم تعني هذا

  • الرقم الاول هو اول id مسموح للاستخدام
  • الارقام بعد : هو كم عدد id لديك

فمثلا يبدء 231072, معناه id 0 هو 231072 و id 1000 يعني 241072

ثبت حزمة dbus-user-session و fuse-overlayfs

ينصح باستخدام كيرنل 5.11 او احدث، او كيرنل اوبونتو

تثبيت docker rootless

أتبع شرح تثبيت دوكر العادي مع عدم تمكين المستخدم استخدام دوكر بدون sudo

ثم قم بتثبيت حزمه docker-ce-rootless-extras عبر مدير الحزم الخاص بتوزيعتك.

ثم ثبته عبر هذا الامر dockerd-rootless-setuptool.sh install
اخر الامر سيكون هناك مكتوب امرين export=xxx
قم بنسخهم ولصقهم اخر ملف .bashrc او اذا تستخدم ZSH, ملف .zshrc

قم بتسجيل الخروج ثم تسجيل الدخول.

بعد التثبيت

تشغيل daemon دوكر rootless

 systemctl --user start docker

تشغيل دوكر rootless عند الاقلاع

 systemctl --user enable docker
 sudo loginctl enable-linger $(whoami)

سماح بتشغيل الحاويات ب port اقل من 1000

استخدام docker socket api مع docker rootless

في حاله لديك اي حاوية تستخدم socket api (يعني تستخدم /var/run/docker.sock
قم باستخدام ال user socket يعني مثلا لحاوية watchtowerr:

version: "3"
services:
    watchtower:
        image: containrrr/watchtower 
        volumes:
            - $XDG_RUNTIME_DIR/docker.sock:/var/run/docker.sock

متغير $XDG_RUNTIME_DIR هو موقع مجلد home, وبما ان دوكر يعمل كمستخدم عادي سيكون ال socket داخل نفس المجلد.

المصادر

ترخيص

هذا الموضوع يتبع ترخيص جميع مواضيع أسس هو CC-BY-SA 4.0

3 إعجابات

1- هل يمكن تثبيت docker وpodman معا على نفس النظام دون حدوث تعارض؟
2- هل مشروع podman مناسب لي كمستخدم بدأ حديثا في تعلم Docker ويريد تجنب صلاحيات الروت أم أن Rootless docker سيكون أفضل لي؟
نصائحك حول هذا الموضوع تهمني :slightly_smiling_face:

نعم اذا لم تقم بتفعيل وضع توافقيه دوكر. لأنة سوف يشغل docker socket ويتضارب مع دوكر العادية.

مشروع Podman بنيته مختلفه مثل عدم اعتماده على Socket.
مشكلته انه لو تريد ان تستخدم أدوات مثل Compose قد تواجه مشاكل.
لكن يمكنك حل معظمها.

اذا تريد استخدامه بأدواته الخاصة مثل helm و pods وغيره. فسيكون ممتاز, وطريقة بناءة مبدعة.

انا كنت استخدم Docker rootless من اجل التوافقية, وبعد اكتشافي لمشاكل الشبكة اصبحت استخدم Docker UserNS

إعجاب واحد (1)

شكرا جزيلا، هذه النصائح تساعدني كثيرا خصوصا وأنا في بداية الطريق لتعلم دوكر.

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

للاسف توقفت عن استخدامة, نظرا لانني استخدم خدمات دوكر مثل compose بشكل اساسي, لذلك التوافقيه الافضل مع دوكر.

ربما لما انتقل ل k8s سوف اجرب Podman مرة اخرى, لكنه فعلا مشروع واعد.

إعجاب واحد (1)

السلام عليكم عند محاولة لانشاء container تظهر لي هذه المشكلة وهي مشكلة تتعلق بصلاحية المستخدم الممنوحة ل docker كيف بامكاني حل هذه المشكلة ؟
pro_1

انت تطلب عمل مجلد في / وهذا خارج صلاحياتك انت كمستخدم لذلك لا يمكنه عمله.
استخدم مكان داخل مجلد home الخاص بالمستخدم، او شيء داخل نفس مجلد compose اذا تستخدمة، مثلا ./portainer

إعجاب واحد (1)

اقترح بقراءة هذا المقال