المراجع — البذور الذهنية وأدوات الكشف
إن نسيت كل التفاصيل وبقيت هذه، تستطيع إعادة بناء الباقي. ثلاثة أقسام: نماذجٌ ذهنية، أوامر كشفٍ بحسب البُعد، وخريطة الإعداد ← البدائية كاملة.
النماذج الذهنية الجوهرية
١. «لا يوجد كونتينر»
الكونتينر ليس كائناً؛ هو عمليةٌ واحدة يراها المضيف في ps، وُضعت خلف أربع عدساتٍ تشوّه رؤيتها. أعِد صياغة كل سؤالٍ من «ماذا يفعل الكونتينر» إلى «ماذا تفعل هذه العملية، وأي عدسةٍ بينها وبين الحقيقة».
٢. أبعاد العزل الأربعة المتعامدة
أي إعدادٍ في 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 يعكس هذا كله.
٩. الطبقات الأربع المعمارية = فصل اهتمامات
كلٌّ قابلٌ للاستبدال لأن الحدود عقودٌ معيارية (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 | --memory | cgroup memory.max |
cpus | --cpus | cgroup cpu.max |
pids_limit | --pids-limit | cgroup pids.max |
cap_add / cap_drop | نفسها | capabilities |
security_opt | --security-opt | seccomp / LSM |
read_only | --read-only | mount ro |
pid: host | --pid=host | namespace |
network_mode | --network | net namespace |
ports | -p | DNAT |
volumes | -v | mount (mnt ns) |
userns_mode | --userns | user namespace |
privileged | --privileged | يفتح كل الدفاعات |
الجداول الأشمل (daemon.json، كل العلامات، أعمدة «أين تتحقّق» و«ماذا يحدث لو أزلته») في ملفات المنهج النصية: ref/config-to-primitive-map.md وref/mental-models.md وref/cheatsheet.md.