Linux Zone | لینوکس زون
146 subscribers
5 photos
1 video
26 links
اینجا هر چیزی که درباره لینوکس می‌دونیم باهاتون به اشتراک می‌ذاریم 🐧

©️ این کانال بخشی از مجموعه @ninja_learn_ir است.
Download Telegram
🔧 چطور یک داکر برای خودمون بسازیم؟ – قسمت دوم

در قسمت قبل با 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