🔧 چطور یک داکر برای خودمون بسازیم؟ – قسمت دوم
در قسمت قبل با cgroups آشنا شدیم و دیدیم چطور میتونیم مصرف منابع مثل RAM و CPU رو برای یک پراسس محدود کنیم. حالا وقتشه به سراغ دومین جزء اصلی کانتینرها بریم:
🧩 namespace چیه و چرا مهمه؟
Namespaceها مکانیزمی در کرنل لینوکس هستن که اجازه میدن یک پراسس (یا گروهی از اونها) نمای متفاوتی از بخشهای مختلف سیستم ببینن. به زبان سادهتر، با namespaceها میتونیم یک محیط ایزوله برای پراسسها بسازیم.
مثال:
1️⃣ هر کانتینر PIDهای خودش رو داشته باشه و PIDهای بیرونی رو نبینه.
2️⃣ فضای شبکهی مخصوص خودش رو داشته باشه، با IP و interface جدا.
3️⃣ فقط فایلهای خاصی از سیستم فایل رو ببینه، نه کل چیزی که روی سیستم هست.
📦 چه namespaceهایی به صورت دیفالت وجود داره؟:
-
-
-
-
-
-
-
🧪 چطور با یک namespace جدید پراسس هارو ایزوله کنیم؟
با استفاده از ابزار
حالا توی این شِل جدید اگر
🧩 چطور با cgroup ترکیبش کنیم؟
وقتی namespace رو با cgroup ترکیب کنیم، عملاً داریم پایهی یک کانتینر واقعی رو میسازیم: یه محیط ایزوله که هم منابعش محدوده، هم چیزی از بیرون نمیبینه.
🎯 مثال:
حالا که داخل شل جدید هستیم، میخوایم این پراسس جدید رو به cgroupای که قبلاً ساختیم اضافه کنیم. همونطور که گفتیم، باید این کار از داخل شل انجام بشه چون فقط از داخل میتونیم بهراحتی به PID فعلی (با $$) دسترسی داشته باشیم:
حالا برای اینکه چک کنیم محدودیت ها اعمال شدن از این دستور داخل شل استفاده میکنیم:
با این کار، شل جدید ما (و تمام پراسسهایی که از داخل اون اجرا میشن) تحت محدودیتهایی که برای cgroup تعریف کردیم قرار میگیرن مثل محدودیت RAM، CPU یا I/O. به این ترتیب، کمکم داریم ساختار اولیه یک container ساده رو شکل میدیم.
✍️ جمعبندی
در این پست با namespaceها آشنا شدیم و دیدیم چطور میتونن محیط یک پراسس رو از بقیهی سیستم جدا کنن به صورت عملی یه کانتینر خیلی جمع و جور ساختیم. در قسمت بعد، سراغ root filesystem و mount namespace میریم تا بتونیم فایلسیستم اختصاصی برای کانتینرمون بسازیم.
اگه سوالی درباره namespaceها داشتید توی کامنت ها با ما در میون بزارید.
➖➖➖➖➖➖➖➖➖➖
در قسمت قبل با cgroups آشنا شدیم و دیدیم چطور میتونیم مصرف منابع مثل RAM و CPU رو برای یک پراسس محدود کنیم. حالا وقتشه به سراغ دومین جزء اصلی کانتینرها بریم:
🧩 namespace چیه و چرا مهمه؟
Namespaceها مکانیزمی در کرنل لینوکس هستن که اجازه میدن یک پراسس (یا گروهی از اونها) نمای متفاوتی از بخشهای مختلف سیستم ببینن. به زبان سادهتر، با namespaceها میتونیم یک محیط ایزوله برای پراسسها بسازیم.
مثال:
1️⃣ هر کانتینر PIDهای خودش رو داشته باشه و PIDهای بیرونی رو نبینه.
2️⃣ فضای شبکهی مخصوص خودش رو داشته باشه، با IP و interface جدا.
3️⃣ فقط فایلهای خاصی از سیستم فایل رو ببینه، نه کل چیزی که روی سیستم هست.
📦 چه namespaceهایی به صورت دیفالت وجود داره؟:
-
pid
: برای جداسازی فضای پراسس ها (Process IDs) -
net
: برای جداسازی تنظیمات شبکه مثل interface، routing و ... -
mnt
: برای مدیریت جداگانهی mountها و filesystem -
uts
: برای جداکردن hostname و domainname -
ipc
: برای جداکردن فضای ارتباط بین پردازهها (مثل shared memory) -
user
: برای جداسازی فضای کاربری و دسترسیها -
cgroup
: برای اینکه هر پراسس فقط cgroup خودش رو ببینه 🧪 چطور با یک namespace جدید پراسس هارو ایزوله کنیم؟
با استفاده از ابزار
unshare
میتونیم پراسس جدیدی بسازیم که در namespaceهای جداگانه اجرا میشه. مثلاً برای اجرای یک شِل با PID namespace جداگانه:sudo unshare --pid --fork --mount-proc bash
حالا توی این شِل جدید اگر
ps
بگیریم، فقط پراسس خودمون رو میبینیم و PID ما از دید درون این namespace معمولاً 1
خواهد بود. 🧩 چطور با cgroup ترکیبش کنیم؟
وقتی namespace رو با cgroup ترکیب کنیم، عملاً داریم پایهی یک کانتینر واقعی رو میسازیم: یه محیط ایزوله که هم منابعش محدوده، هم چیزی از بیرون نمیبینه.
🎯 مثال:
# ساخت cgroup با محدودیت RAM
sudo mkdir /sys/fs/cgroup/mycontainer
echo 268435456 | sudo tee /sys/fs/cgroup/mycontainer/memory.max # ۲۵۶ مگابایت RAM
# اجرای یک شِل در namespace جدید با PID مجزا
sudo unshare --pid --fork --mount-proc bash
حالا که داخل شل جدید هستیم، میخوایم این پراسس جدید رو به cgroupای که قبلاً ساختیم اضافه کنیم. همونطور که گفتیم، باید این کار از داخل شل انجام بشه چون فقط از داخل میتونیم بهراحتی به PID فعلی (با $$) دسترسی داشته باشیم:
echo $$ | sudo tee /sys/fs/cgroup/mycontainer/cgroup.procs
حالا برای اینکه چک کنیم محدودیت ها اعمال شدن از این دستور داخل شل استفاده میکنیم:
cat /sys/fs/cgroup/mycontainer/memory.max
با این کار، شل جدید ما (و تمام پراسسهایی که از داخل اون اجرا میشن) تحت محدودیتهایی که برای cgroup تعریف کردیم قرار میگیرن مثل محدودیت RAM، CPU یا I/O. به این ترتیب، کمکم داریم ساختار اولیه یک container ساده رو شکل میدیم.
✍️ جمعبندی
در این پست با namespaceها آشنا شدیم و دیدیم چطور میتونن محیط یک پراسس رو از بقیهی سیستم جدا کنن به صورت عملی یه کانتینر خیلی جمع و جور ساختیم. در قسمت بعد، سراغ root filesystem و mount namespace میریم تا بتونیم فایلسیستم اختصاصی برای کانتینرمون بسازیم.
اگه سوالی درباره namespaceها داشتید توی کامنت ها با ما در میون بزارید.
#️⃣ #linux #containers #namespaces #build_your_own_docker
➖➖➖➖➖➖➖➖➖➖
🐧 CHANNEL | GROUP
🔥5