نگاهی به درون Docker Engine؛ نقش containerd، runc و Shim

Docker Engine به‌جای یک برنامه یکپارچه بزرگ، از اجزای کوچک و تخصصی متعددی ساخته شده است. این مقاله بررسی می‌کند که containerd، runc و shim چگونه در کنار هم کانتینرها را می‌سازند و اجرا می‌کنند، و چطور Open Container Initiative این معماری را شکل داد.

Docker Enginecontainerdrunc

~4 دقیقه مطالعه · آخرین به‌روزرسانی ۱۴ شهریور ۱۴۰۵

مقدمه

Docker Engine به اجزای سمت سرور داکر اشاره دارد که مسئول ساخت، اشتراک‌گذاری و اجرای کانتینرها هستند. برخلاف تصور رایج، این موتور یک برنامه یکپارچه نیست، بلکه سیستمی ماژولار متشکل از ابزارهای کوچک و تخصصی است که از پروژه‌هایی مانند OCI، CNCF و پروژه Moby گرفته شده‌اند.

از یکپارچگی تا طراحی ماژولار

در ابتدای عرضه داکر، موتور از دو بخش اصلی تشکیل می‌شد: daemon داکر، یک باینری یکپارچه که مسئولیت API، ساخت ایمیج و اجرای کانتینر را بر عهده داشت، و LXC که مستقیماً با kernel لینوکس تعامل می‌کرد.

وابستگی به LXC مشکلاتی ایجاد کرد، زیرا این ابزار مخصوص لینوکس بود و مستقل از نیازهای داکر توسعه می‌یافت. داکر در نهایت آن را با ابزار مستقل از پلتفرم خود به نام libcontainer جایگزین کرد.

با گذر زمان، خود daemon یکپارچه به مانعی برای نوآوری تبدیل شد، به همین دلیل داکر به‌تدریج آن را به ابزارهای کوچک‌تر و قابل استفاده مجدد تقسیم کرد. مهم‌ترین نتایج این تلاش، containerd و runc بودند که اکنون فراتر از خود داکر، در پروژه‌هایی مانند Kubernetes، Firecracker و Fargate نیز استفاده می‌شوند.

تأثیر OCI

هم‌زمان با این تحولات، Open Container Initiative (OCI) در حال تعریف دو استاندارد کلیدی بود: image-spec و runtime-spec، که هر دو در سال ۲۰۱۷ به‌عنوان نسخه ۱.۰ منتشر شدند. استاندارد سومی به نام distribution-spec نیز نحوه توزیع ایمیج‌ها از طریق رجیستری‌ها را تعیین می‌کند.

شرکت Docker, Inc. از اعضای بنیان‌گذار OCI بوده و همچنان به‌طور فعال در آن مشارکت دارد. تمام نسخه‌های مدرن داکر این مشخصات را از طریق ابزارهایی مانند runc، BuildKit و Docker Hub پیاده‌سازی می‌کنند.

runc: رانتایم سطح پایین

runc پیاده‌سازی مرجع runtime-spec در OCI است. این ابزار یک لایه سبک CLI روی libcontainer است که مسئولیت تعامل با kernel برای ساخت واقعی namespaces و cgroups کانتینر را بر عهده دارد. به‌محض شروع کانتینر، فرآیند runc که آن را ایجاد کرده خاتمه می‌یابد.

containerd: رانتایم سطح بالا

containerd چرخه حیات کانتینرها را مدیریت می‌کند — شامل شروع، توقف و حذف آن‌ها — در حالی که کار سطح پایین kernel را به runc واگذار می‌کند. این ابزار در ابتدا قرار بود یک ابزار کوچک و متمرکز باشد، اما اکنون مدیریت ایمیج، شبکه و volume را نیز شامل می‌شود که پروژه‌هایی مانند Kubernetes می‌توانند به‌صورت انتخابی از آن استفاده کنند.

containerd توسط Docker, Inc. ساخته شد و بعداً به CNCF اهدا شد، جایی که اکنون یک پروژه graduated و آماده تولید محسوب می‌شود.

نحوه راه‌اندازی یک کانتینر

وقتی دستوری مانند زیر اجرا می‌شود:

docker run -d --name ctr1 nginx

CLI آن را به یک درخواست API تبدیل کرده و به daemon ارسال می‌کند. daemon این درخواست را از طریق gRPC به containerd منتقل می‌کند، containerd ایمیج را به یک بسته OCI تبدیل کرده و به runc دستور می‌دهد کانتینر را بسازد. runc با kernel تعامل کرده و namespaces و cgroups مورد نیاز را می‌سازد، سپس پس از اجرای فرآیند کانتینر خاتمه می‌یابد.

این جداسازی باعث می‌شود daemon بتواند بدون تأثیر بر کانتینرهای در حال اجرا متوقف، ری‌استارت یا به‌روزرسانی شود — مفهومی که کانتینرهای بدون daemon نامیده می‌شود.

Shim چیست؟

بین containerd و لایه OCI، یک فرآیند shim قرار دارد. برای هر کانتینر جدید، containerd یک shim و یک فرآیند runc ایجاد می‌کند؛ پس از خروج runc، shim به فرآیند والد کانتینر تبدیل می‌شود. shim سه مزیت اصلی فراهم می‌کند: امکان کانتینرهای بدون daemon، بهبود کارایی با سبک نگه‌داشتن فرآیندها، و امکان جایگزینی runc با رانتایم‌های سطح پایین دیگر.

پیاده‌سازی روی لینوکس

روی یک میزبان لینوکسی، این اجزا به‌صورت باینری‌های جداگانه وجود دارند:

  • /usr/bin/dockerd
  • /usr/bin/containerd
  • /usr/bin/containerd-shim-runc-v2
  • /usr/bin/runc

نتیجه‌گیری

طراحی ماژولار Docker Engine — بر پایه مشخصات OCI، مدیریت چرخه حیات توسط containerd و اجرای سطح پایین توسط runc — این موتور را انعطاف‌پذیرتر، قابل‌حمل‌تر و قابل‌استفاده مجدد در سراسر اکوسیستم کانتینر کرده است. درک این لایه‌ها کلید تسلط واقعی بر نحوه کارکرد داکر در پشت صحنه است.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

داکر چگونه از فناوری‌های امنیتی لینوکس استفاده می‌کند

مدل امنیتی داکر بر پایه دفاع چندلایه ساخته شده و فناوری‌های شناخته‌شده kernel لینوکس را با تنظیمات پیش‌فرض معقول ترکیب می‌کند. این مقاله توضیح می‌دهد که namespaceها، control groupها، capabilityها، Mandatory Access Control و seccomp چگونه در کنار هم کانتینرها را ایزوله و ایمن می‌کنند.

ادامه

مدیریت داده‌های ماندگار در داکر با Volume

کانتینرها به‌طور پیش‌فرض یک لایه نوشتنی موقت دریافت می‌کنند که با حذف کانتینر از بین می‌رود — این برای داده‌های موقتی خوب است، اما برای هر چیزی که ارزش نگهداری دارد ریسک‌آور است. این مقاله توضیح می‌دهد که volumeهای داکر چگونه داده‌های ماندگار را از چرخه حیات کانتینر جدا می‌کنند و نحوه ساخت، استفاده و اشتراک‌گذاری امن آن‌ها را بررسی می‌کند.

ادامه

شبکه‌های Overlay در داکر چگونه کار می‌کنند؛ نگاهی به VXLAN

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

ادامه

اتصال کانتینرهای داکر به VLAN و توزیع بار با Swarm

فراتر از شبکه‌های ساده bridge، داکر امکاناتی برای اتصال مستقیم کانتینرها به VLANهای فیزیکی موجود، تفکیک خودکار نام سرویس‌ها و توزیع ترافیک در سراسر یک کلاستر Swarm ارائه می‌دهد. این مقاله درایور macvlan، سرویس داخلی Service Discovery و مکانیزم Ingress Load Balancing در Swarm را بررسی می‌کند.

ادامه

شبکه‌سازی در داکر؛ آشنایی با CNM، Libnetwork و شبکه‌های Bridge

شبکه‌سازی در داکر بر پایه یک طراحی باز به نام Container Network Model ساخته شده که توسط libnetwork پیاده‌سازی و با درایورهای قابل‌جایگزینی گسترش می‌یابد. این مقاله تئوری پشت شبکه داکر را بررسی کرده و نحوه ساخت و تست شبکه‌های bridge تک‌هاست، از جمله تفکیک نام و نگاشت پورت را توضیح می‌دهد.

ادامه

استقرار و مدیریت کلاستر چندنودی با Docker Swarm

Docker Swarm گروهی از نودهای داکر را به یک کلاستر امن و بسیار در دسترس با قابلیت ارکستریشن داخلی تبدیل می‌کند. این مقاله ساخت یک swarm چندنودی، استقرار یک اپلیکیشن میکروسرویس به‌صورت اعلانی و انجام به‌روزرسانی‌های تدریجی بدون از دست دادن سازگاری با وضعیت مطلوب را بررسی می‌کند.

ادامه