DOCKER::ROOT المراجع · mental models · cheat · map kernel live
REFERENCE المخرجات المرافقة

المراجع — البذور الذهنية وأدوات الكشف

إن نسيت كل التفاصيل وبقيت هذه، تستطيع إعادة بناء الباقي. ثلاثة أقسام: نماذجٌ ذهنية، أوامر كشفٍ بحسب البُعد، وخريطة الإعداد ← البدائية كاملة.

النماذج الذهنية الجوهرية

١. «لا يوجد كونتينر»

الكونتينر ليس كائناً؛ هو عمليةٌ واحدة يراها المضيف في ps، وُضعت خلف أربع عدساتٍ تشوّه رؤيتها. أعِد صياغة كل سؤالٍ من «ماذا يفعل الكونتينر» إلى «ماذا تفعل هذه العملية، وأي عدسةٍ بينها وبين الحقيقة».

٢. أبعاد العزل الأربعة المتعامدة

ماذا ترى؟namespaces (مفكّكة لـ ٧ أنواع، كلٌّ يُضبط وحده) كم تستهلك؟cgroups (حدٌّ جماعي يرثه الأبناء، لا فردي) مِمّ تتكوّن؟overlay fs (طبقات للقراءة فقط + طبقة كتابة) ماذا تفعل؟caps + userns + seccomp + LSM (٤ بوّابات متعامدة)

أي إعدادٍ في Docker يلمس بُعداً واحداً (نادراً اثنين). صنّفه أولاً، يتّضح.

٣. «ليش قبل كيف» مُجسّداً

كل أداةٍ وُلدت من ألمٍ محدّد، ثم أُسيء استعمالها: chroot وُلد للبناء لا الأمان → انكسر. cgroups لأن ulimit فردي → صارت جماعية. الطبقات من «لا تنسخ» → صارت content-addressable. الـ shim لأن runc يموت → صار أباً خالداً. حين تواجه ميزةً جديدة: أي ألمٍ تداويها؟

٤. العزل سهل، الوصل فن

إنشاء عزلٍ شبكي = سطرٌ واحد ينتج جزيرةً ميتة. القيمة في الوصل: veth (كابل) + bridge (مبدّل) + NAT (بوّابة). الفصل رخيص، إعادة الربط الانتقائي هي الهندسة.

٥. العنونة بالمحتوى = شجرة Merkle

tag → index → manifest → config + layers، كلٌّ معنونٌ بـ sha256. تصميمٌ واحد يعطي مجاناً: ثبات، إزالة تكرار (تخزيناً وشبكياً وبين المستخدمين)، كاش بناء، نزاهة. تغيير بايتٍ يغيّر الهوية كلها.

٦. الطبقات تتراكم ولا تُطرح

الحذف = قناع (whiteout) فوق طبقة، لا إزالة. لهذا تنظّف في نفس RUN، وحجم الصورة لا ينقص بالحذف، والأسرار في طبقةٍ تبقى للأبد ولو «حُذفت».

٧. الكاش هاشٌ متسلسل

مفتاح كاش الطبقة = هاش(السابقة) + التعليمة + محتوى الملفات. إبطال طبقةٍ يُبطل كل ما بعدها. النتيجة الوحيدة: رتّب الـ Dockerfile من الأندر تغيّراً إلى الأكثر.

٨. «root» حزمةٌ لا مفتاح

root = ~٤٠ قدرة مستقلة + هوية UID 0. Docker يرمي معظم القدرات، ويستطيع (مع userns) جعل UID 0 وهمياً. لذا «root في الكونتينر» أعجزُ بكثير. و--privileged يعكس هذا كله.

٩. الطبقات الأربع المعمارية = فصل اهتمامات

dockerd → واجهة، API، بناء، شبكة، volumes (الودّي) containerd → صور، snapshots، حالة، دورة حياة (المايسترو) shim → أبٌ خالد، يحصد الخروج، يمسك stdio (الحارس) runc → ينفّذ config.json ثم يموت (الأيدي)

كلٌّ قابلٌ للاستبدال لأن الحدود عقودٌ معيارية (OCI + gRPC).

١٠. لكل عَرَضٍ بُعدٌ مسؤول

OOMKilled → cgroup memory. Operation not permitted كـ root → capability/seccomp. لا إنترنت → NAT. صورة ضخمة → layers. اسأل «أي سؤالٍ من الأربعة انتُهك؟».

أوامر الكشف والتشخيص

أدوات رؤية البدائيات بعينك — ليست أوامر Docker، بل أوامر كشف الحقيقة تحته.

namespaces (I) — ماذا ترى

bash
$ lsns # كل الـ namespaces وعملياتها $ ls -l /proc/PID/ns/ # أرقام inode للعدسات (قارن بين عمليتين) $ nsenter -t PID -a # ادخل كل namespaces عملية (= docker exec يدوياً) $ unshare --pid --net --mount --uts --fork --mount-proc bash

cgroups (II) — كم تستهلك

bash
$ cat /proc/PID/cgroup # cgroup العملية $ cat /sys/fs/cgroup/<path>/memory.max # حدّ الذاكرة $ cat /sys/fs/cgroup/<path>/memory.events # عدّاد oom_kill $ cat /sys/fs/cgroup/<path>/cpu.stat # throttling (nr_throttled)

overlay / images (III) — مِمّ تتكوّن

bash
$ cat /proc/PID/mountinfo # lowerdir/upperdir للعملية $ docker history <image> # طبقات الصورة وأحجامها $ docker save <image> -o img.tar && tar xf img.tar # تشريح يدوي

الأمان (IV) — ماذا تفعل

bash
$ grep Cap /proc/PID/status # CapEff/Prm/Inh/Bnd (hex) $ capsh --decode=<hex> # فكّ خريطة القدرات $ grep Seccomp /proc/PID/status # 0=لا 2=filter $ cat /proc/PID/uid_map # خريطة user namespace $ dmesg | grep -iE 'apparmor|seccomp|audit' # رفض الدفاعات

الشبكة (VI) — كيف تتصل

bash
$ ip link # لاحظ veth* و docker0 $ sudo iptables -t nat -L -n -v # MASQUERADE + DNAT $ sudo conntrack -L # جدول تتبّع الجلسات $ sysctl net.ipv4.ip_forward # هل التوجيه مفعّل

المعمارية (V) والبناء (VII)

bash
$ ps -ef --forest | grep -E 'dockerd|containerd|shim|runc' # شجرة الطبقات $ runc list # كونتينرات runc مباشرةً $ ctr -n moby containers list # containerd مباشرةً $ DOCKER_BUILDKIT=1 docker build --progress=plain . # شاهد DAG ينفّذ

التشخيص السريع

bash
$ docker inspect <c> --format '{{.State.ExitCode}} {{.State.OOMKilled}}' # 137 + OOMKilled=true → cgroup memory (II) $ strace -f -e trace=all <cmd> 2>&1 | grep EPERM # أي syscall فشل # ثم: capability؟ (status Cap) أم seccomp؟ (status Seccomp) أم LSM؟ (dmesg)

خريطة الإعداد ← البدائية (Compose)

نفس الخريطة الكبرى للإقليم VIII، بصياغة Compose. السؤال عند أي إعداد: أي بُعد؟ أي طبقة؟

Compose= Dockerالبدائية
mem_limit--memorycgroup memory.max
cpus--cpuscgroup cpu.max
pids_limit--pids-limitcgroup pids.max
cap_add / cap_dropنفسهاcapabilities
security_opt--security-optseccomp / LSM
read_only--read-onlymount ro
pid: host--pid=hostnamespace
network_mode--networknet namespace
ports-pDNAT
volumes-vmount (mnt ns)
userns_mode--usernsuser namespace
privileged--privilegedيفتح كل الدفاعات
للتوسّع الكامل

الجداول الأشمل (daemon.json، كل العلامات، أعمدة «أين تتحقّق» و«ماذا يحدث لو أزلته») في ملفات المنهج النصية: ref/config-to-primitive-map.md وref/mental-models.md وref/cheatsheet.md.