۱ آبان ۱۴۰۵ codeandcake.dev ۳ دقیقه مطالعه

نگاهی به ابعاد عجیب و فنی داکر از دیدگاه یک توسعه‌دهنده

نگاهی به ابعاد عجیب و فنی داکر از دیدگاه یک توسعه‌دهنده — Docker is weird

خلاصه

مقاله پیش رو به بررسی لایه‌های زیرین و ساختار عجیب داکر هنگام ساخت یک کانتینر ران‌تایم شخصی می‌پردازد. این نوشته ابزارهایی مانند Namespaceها، چالش‌های زبان Go و مسئله سطح دسترسی روت را واکاوی می‌کند.

در دنیای مهندسی نرم‌افزار، ابزارهایی مانند Docker روزانه مورداستفاده قرار می‌گیرند، اما کمتر کسی به جزئیات پیاده‌سازی و ساختار داخلی آن‌ها سرک می‌کشد. نویسنده این مقاله با تصمیم جذاب خود برای نوشتن یک کانتینر ران‌تایم (Container Runtime) شخصی، به کشف حقایق عجیب و غریبی درباره نحوه کارکرد داکر رسیده است.

کانتینرها واقعاً وجود خارجی ندارند!

برخلاف ماشین‌های مجازی (VMها) که سیستم‌عامل مجزایی را اجرا می‌کنند، کانتینرها در واقع فقط پروسه‌هایی هستند که توسط کرنل لینوکس ایزوله شده‌اند. اگر بدانید کجا را نگاه کنید، می‌توانید این پروسه‌ها را به راحتی در مسیر /proc سیستم خود پیدا کنید.

در واقع چیزی به نام «کانتینر» به عنوان یک ویژگی مستقل در هسته لینوکس وجود ندارد. کانتینرها ترکیبی از چند قابلیت کلیدی لینوکس هستند:

  • Namespaces: برای ایزوله‌سازی و پنهان‌سازی منابعی که پروسه می‌بیند.
  • Cgroups: برای محدود کردن مصرف منابع سخت‌افزاری توسط پروسه.
  • Network Stack: قابلیت‌های پیچیده شبکه برای مدیریت ارتباطات کانتینر.

تصاویر داکر فقط پوشه‌هایی ساده هستند

ایمیج‌های داکر در نهایت پوشه‌های ساده‌ای هستند که روی هاست ذخیره می‌شوند. هنگامی که یک کانتینر را اجرا می‌کنید، داکر با استفاده از دستورات سیستم‌عامل مانند chroot یا pivot_root مسیر ریشه (Root Directory) آن پوشه را به عنوان ریشه پروسه کانتینر شما تنظیم می‌کند.

چالش‌های Go در توسعه Container Runtime

ابزار runc که ران‌تایم اصلی داکر است، با زبان Go نوشته شده است. با این حال، انتخاب Go برای این منظور چالش‌برانگیز بوده است:

  • ران‌تایم زبان Go به صورت پیش‌فرض چندرشته‌ای (Multi-threaded) است، در حالی که بسیاری از سیست‌کال‌های (Syscalls) لینوکس برای کانتینرها باید در یک محیط تکرشته‌ای اجرا شوند. به همین دلیل، داکر مجبور شده از ماژول‌های متمایز C پیش از راه‌اندازی ران‌تایم Go استفاده کند.
  • زبان Go از دستور fork به شکل سنتی پشتیبانی نمی‌کند؛ زیرا fork تنها رشته اصلی را کپی می‌کند که برای مدیریت پروسه‌ها خطرناک است. برای دور زدن این مشکل، runc ترفندهایی مانند اجرای مجدد proc/self/exe با آرگومان‌های خاص را به کار می‌گیرد.

مسئله سطح دسترسی Root و امنیت

یکی از چالش‌های تاریخی داکر نیاز به دسترسی Root است، زیرا بسیاری از APIهای کرنل لینوکس در گذشته نیازمند این سطح دسترسی بودند. این مسئله باعث می‌شود مدیریت امنیت بسیار پیچیده باشد. امروزه رویکردهای Rootless محبوبیت یافته‌اند، هرچند پیاده‌سازی مواردی مثل شبکه در حالت Rootless نیازمند بازنویسی کل استک شبکه در فضای کاربری (Userspace) است.

دیدگاه جامعه هکرنیوز

در بحث‌های هکرنیوز، نکات جالبی مطرح شد:

  • Solomon Hykes (سازنده داکر) در کامنت‌ها حضور یافت و از مرور خاطرات طراحی این سیستم ابراز خرسندی کرد.
  • یکی دیگر از کاربران پیشنهاد کرد برای درک بهتر مفاهیم بدون نیاز به دیمن یا دسترسی روت، ابزارهایی مثل Podman بررسی شوند که مدل ساده‌تر و امن‌تری دارند.

این مطلب به‌صورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل

این خبر را با دیگران به اشتراک بگذارید

خبرهای فناوری در قالب پست و ویدیوی کوتاه، در اینستاگرام هکرنیوز بلاگ. به‌زودی
هر خبر به محض انتشار، به‌همراه پادکست روزانه در کانال تلگرام هکرنیوز بلاگ.