DOCKER::ROOT الإقليم VIII · synthesis · trust kernel live
REGION VIII الغاية the big table

اليقين: كل إعداد، وأي بدائية يحرّك

الغاية التي طلبتَها: «أن أكون واثقاً تماماً من أي إعدادٍ أعدّله». ليس مفاهيم جديدة؛ هو جمع الخيوط. بنيت كل بدائيةٍ بيدك؛ الآن نربط كل علامةٍ في Docker و Compose و daemon.json بالبدائية التي تحرّكها.

النموذج الذهني الكامل

MODEL الكونتينر = عملية + ٤ أبعاد عزل + ٣ طبقات تنظيم
السؤال: ماذا ترى؟ كم تستهلك؟ مِمّ تتكوّن؟ ماذا تفعل؟ البدائية: namespaces cgroups overlay fs caps/userns (I) (II) (III) /seccomp/LSM (IV) └──────────────┴───────┬───────┴─────────┬──────┘ التنظيم: runc يكتب config.json (V) ── shim يخلد ── containerd يدير الواجهة: dockerd: API + build (VII) + network (VI) + volumes
السؤال عند أي إعداد: «أي بُعدٍ من الأربعة يلمس؟ وأي طبقةٍ تكتبه؟»

الجدول الكبير — علامة Docker ← البدائية

عزل الرؤية — namespaces (I)

العلامةتفعلالبدائية
--hostnameاسم مضيفٍ خاصUTS namespace
--pid=hostيرى كل عمليات المضيفيلغي PID namespace
--network=hostيشارك مكدّس الشبكةيلغي net namespace
--network=container:Xيشارك شبكة كونتينر آخر = Podsetns على net ns
--ipc=hostيشارك ذاكرة IPCيلغي IPC namespace
--userns-remaproot وهمي معزولuser namespace (IV)
--inittini كـ PID 1 يحصد الأبناءسلوك PID 1

عزل الموارد — cgroups (II)

العلامةتفعلالملف
--memory=512mحدّ ذاكرةٍ صلبmemory.max
--cpus=1.5حصةٌ زمنية صلبةcpu.max
--cpu-shares=512وزنٌ نسبي تنافسيcpu.weight
--cpuset-cpus=0,1تقييدٌ على أنويةٍ بعينهاcpuset.cpus
--pids-limit=100حدّ العمليات (يمنع fork bomb)pids.max
--device-read-bpsحدّ معدّل قراءة جهازio.max

نظام الملفات — overlay + mounts (III)

العلامةتفعلالبدائية
-v /h:/c (bind)يربط مسار مضيفٍ داخل الكونتينرmount داخل mnt namespace
-v name:/c (volume)تخزينٌ يديره Dockermount من volumes/
--tmpfs /tmpنظام ملفاتٍ في الذاكرةmount tmpfs
--read-onlyrootfs للقراءة فقطmount ro + سطح هجومٍ أقل (IV)
-v ...:z / :Zإعادة وسم SELinuxLSM relabel (IV)

الصلاحية والأمان (IV)

العلامةتفعلالبدائية
--cap-drop=ALLيسقط كل القدراتcapabilities bounding set
--cap-add=NET_BIND_SERVICEيعيد قدرةً بعينهاcapability واحدة
--security-opt seccomp=p.jsonمرشّح syscalls مخصّصseccomp BPF
--security-opt no-new-privilegesيمنع تصعيد الامتيازno_new_privs bit
--user 1000:1000يشغّل بـ UID غير rootتغيير UID/GID المنفّذ
--privilegedيفتح كل الدفاعات الأربعكل القدرات + لا seccomp + أجهزة
--device=/dev/...يكشف جهازاً بعينه (بديل آمن)device cgroup + mknod

الشبكة (VI) و daemon.json

العلامة / المفتاحتفعل / يضبطالبدائية / الإقليم
-p 8080:80ينشر منفذاًDNAT في iptables/nft
--network mynetيربط بشبكةٍ معرّفة (DNS بالاسم)bridge + veth + embedded DNS
--network noneعزلٌ شبكي تامnet namespace فارغ
storage-driveroverlay2 / btrfsIII
default-runtimerunc / crun / runsc / kataV
live-restoreإبقاء الكونتينرات عند ترقية dockerdV (الـ shim)
userns-remapتفعيل user namespace عامIV

منهجية التشخيص — أين تنظر عند أي مشكلة

العَرَضالطبقةأداة الكشف
«يرى عمليات لا يجب أن يراها»namespacelsns, /proc/PID/ns/
OOMKilled / خروج 137cgroup memorymemory.events, memory.max
«بطء/خنق CPU غير مفسّر»cgroup cpucpu.stat (throttling)
«الصورة ضخمة بلا سبب»layersdocker history, whiteouts (III)
Operation not permitted كـ rootcap/seccomp/LSMstatus Cap*, dmesg
«لا يصل للإنترنت»NAT/forwardiptables -t nat, conntrack
«كونتينران لا يتحلّان بالاسم»embedded DNSافتراضية vs user-defined (VI)
«مات ولم ألتقط الخطأ»shim/logsdocker logs (V)
القاعدة الذهبية

لكل عَرَضٍ بُعدٌ واحدٌ مسؤول. اسأل «أي سؤالٍ من الأربعة انتُهك؟» فتعرف أين تنظر — بدل تخمينٍ عشوائي.

اللغز الختامي — المهندس العكسي

  1. اقرأ إعداداً، تنبّأ بالبدائية: خذ docker-compose.yml حقيقياً من مشروعٍ سابق لك. لكل خيارٍ فيه اكتب: أي بدائية kernel، أي ملف/أداة تفحصه للتحقق، ماذا يحدث لو أزلته. لا تترك خياراً مجهولاً.
  2. من البدائية للعلامة (عكسياً): «عمليةٌ لا ترى عمليات المضيف، محدودةٌ بنصف نواة و256م، بلا CAP_NET_RAW، بـ rootfs للقراءة فقط، على شبكةٍ معزولةٍ تخرج للإنترنت لكن لا تُنشر منافذها». اكتب أمر docker run الكامل، واذكر لكل علامةٍ بدائيتها. اختبار اليقين النهائي.
  3. الافتراضات: docker run alpine sleep 1000 بلا علامات، ثم شرّحه: lsns, status للقدرات، cgroup الافتراضي, seccomp, الشبكة. وثّق كل دفاعٍ يطبّقه Docker افتراضياً نيابةً عنك — الإعدادات «الآمنة» التي كنت تثق بها عمياءً، الآن تراها بعينيك.

الخلاصة الكبرى — من مستخدمٍ إلى مهندس

بدأت تعرف Docker كأوامر. الآن تعرفه كـ تركيبٍ لبدائيات kernel تستطيع بناءها بيدك. الفرق هو الفرق بين من يحفظ الوصفة ومن يفهم الكيمياء.

4
أبعاد عزل
4
طبقات تنظيم
3
بدائيات جذرية
0
حفظ — اشتقاق فقط

راجع الأوراق المرجعية في صفحة المراجع: النماذج الذهنية، أوامر الكشف، وخريطة الإعداد ← البدائية كاملةً للطباعة.

البذرة الأخيرة — لرحلةٍ قادمة لا لهذا المنهج

كل ما بنيته يدير كونتينرات على مضيفٍ واحد. حين تصير المضيفات عشرات، يظهر سؤالٌ جديد: من يقرّر أي كونتينر على أي مضيف؟ من يعيد جدولته إن مات مضيف؟ من يصل شبكاته عبر الأجهزة (حصاد بذرة overlay في VI)؟ هذا عالم Kubernetes — وستدخله ولديك ميزةٌ نادرة: تعرف ما يجري داخل كل عقدةٍ حتى الـ syscall. k8s لا يخترع كونتينراً جديداً؛ يكلّم containerd (V) عبر CRI، ويجمع كونتيناتك في Pods (التي رأيتها مراراً: مشاركة namespaces).

أنت الآن واثق. هذه كانت الغاية.