VM یا Docker؟

چگونه متوجه می شوید که به Docker نیاز دارید و نه VM؟ شما باید تعیین کنید که دقیقاً چه چیزی را می خواهید جدا کنید. اگر می خواهید سیستمی را با منابع اختصاصی تضمین شده و سخت افزار مجازی ایزوله کنید، انتخاب باید VM باشد. اگر می خواهید برنامه های در حال اجرا را به عنوان فرآیندهای سیستمی جداگانه ایزوله کنید، به Docker نیاز دارید.

بنابراین تفاوت بین کانتینرهای Docker و VM چیست؟

ماشین مجازی (VM) یک رایانه مجازی با تمام دستگاه های مجازی و یک هارد دیسک مجازی است که یک سیستم عامل مستقل جدید به همراه درایورهای دستگاه مجازی، مدیریت حافظه و سایر اجزاء روی آن نصب شده است. یعنی ما یک انتزاعی از سخت افزار فیزیکی به دست می آوریم که به ما اجازه می دهد بسیاری از کامپیوترهای مجازی را روی یک کامپیوتر اجرا کنیم.
یک ماشین مجازی نصب شده می‌تواند به روش‌های مختلفی فضای روی دیسک کامپیوتر شما را اشغال کند:

  • فضای دیسک سخت ثابت، که امکان دسترسی سریعتر به هارد دیسک مجازی را فراهم می کند و از تکه تکه شدن فایل جلوگیری می کند.
  • تخصیص حافظه پویا هنگام نصب برنامه های اضافی، حافظه به صورت پویا برای آنها تخصیص می یابد تا زمانی که به حداکثر مقدار اختصاص داده شده به آن برسد.

هر چه تعداد ماشین‌های مجازی در هر سرور بیشتر باشد، فضای بیشتری را اشغال می‌کنند و همچنین به پشتیبانی دائمی از محیط مورد نیاز برای اجرای برنامه شما نیاز دارند.

کارگر بارانداز نرم افزاری برای ایجاد برنامه های کاربردی مبتنی بر کانتینر است. کانتینرها و ماشین های مجازی مزایای مشابهی دارند، اما عملکرد متفاوتی دارند. ظروف فضای کمتری را اشغال می کنند زیرا ... استفاده مجدد از منابع مشترک سیستم میزبان نسبت به VM، زیرا برخلاف VM، مجازی سازی را در سطح سیستم عامل ارائه می دهد، نه در سطح سخت افزار. این رویکرد منجر به ردپای حافظه کمتر، استقرار سریع‌تر و مقیاس‌بندی آسان‌تر می‌شود.

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

ظرف - چگونه کار می کند؟

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

هر ظرف را می توان از طریق یک فایل در پروژه docker-compose موجود در راه حل اصلی - docker-compose.yml پیکربندی کرد. در آنجا می توانید پارامترهای مختلفی مانند نام کانتینر، پورت ها، شناسه ها، محدودیت های منابع، وابستگی ها بین سایر کانتینرها را تنظیم کنید. اگر نام کانتینر را در تنظیمات مشخص نکنید، داکر هر بار یک کانتینر جدید ایجاد می‌کند و به صورت تصادفی نامی به آن می‌دهد.

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

هنگامی که Docker برای اولین بار یک کانتینر را راه اندازی می کند، لایه خواندن و نوشتن اولیه خالی است. هنگامی که تغییرات رخ می دهد، آنها به این لایه اعمال می شوند. به عنوان مثال، اگر می خواهید یک فایل را تغییر دهید، آن فایل از لایه فقط خواندنی زیر به لایه خواندن و نوشتن کپی می شود.
نسخه فقط خواندنی فایل همچنان وجود خواهد داشت، اما اکنون در زیر کپی پنهان شده است. حجم ها بدون توجه به چرخه عمر ظرف برای ذخیره داده ها استفاده می شوند. حجم ها هنگام ایجاد کانتینر مقدار دهی اولیه می شوند.

ارتباط تصویر با ظرف چگونه است؟

تصویر - عنصر اصلی برای هر ظرف. تصویر از یک Dockerfile اضافه شده به پروژه ایجاد می‌شود و مجموعه‌ای از سیستم‌های فایل (لایه‌ها) است که روی هم قرار گرفته‌اند و با هم گروه‌بندی شده‌اند، فقط خواندنی. حداکثر تعداد لایه ها 127 است.

در قلب هر تصویر یک تصویر پایه وجود دارد که با دستور FROM مشخص می شود - نقطه ورودی هنگام ساخت تصویر Dockerfile. هر لایه یک لایه فقط خواندنی است و با یک فرمان منفرد نشان داده می شود که سیستم فایل را تغییر می دهد که در یک Dockerfile نوشته شده است.
برای ترکیب این لایه‌ها در یک تصویر واحد، داکر از سیستم فایل چند لایه‌ای پیشرفته اتحادیه استفاده می‌کند (AuFS در بالای UnionFS ساخته شده است)، به فایل‌ها و دایرکتوری‌های مختلف از لایه‌های فایل مختلف اجازه می‌دهد تا به صورت شفاف روی هم قرار بگیرند و یک سیستم فایل منسجم ایجاد کنند.

لایه ها حاوی ابرداده هایی هستند که به شما امکان می دهد اطلاعات مربوط به هر لایه را در طول زمان اجرا و زمان ساخت ذخیره کنید. هر لایه حاوی پیوندی به لایه بعدی است؛ اگر لایه ای پیوندی نداشته باشد، بالاترین لایه در تصویر است.

Dockerfile ممکن است حاوی دستوراتی مانند:

  • FROM - نقطه ورود هنگام تشکیل یک تصویر.
  • MAINTAINER - نام صاحب تصویر.
  • RUN - اجرای دستور در هنگام مونتاژ تصویر.
  • ADD - کپی کردن فایل میزبان در یک تصویر جدید؛ اگر URL فایل را مشخص کنید، Docker آن را در دایرکتوری مشخص شده دانلود می کند.
  • ENV - متغیرهای محیطی؛
  • CMD - ایجاد یک ظرف جدید را بر اساس تصویر شروع می کند.
  • ENTRYPOINT - فرمان با شروع کانتینر اجرا می شود.
  • WORKDIR دایرکتوری کاری برای اجرای دستور CMD است.
  • USER - UID را برای ظرف ایجاد شده بر اساس تصویر تنظیم می کند.
  • VOLUME - دایرکتوری میزبان را در ظرف نصب می کند.
  • EXPOSE مجموعه ای از پورت هایی است که در کانتینر به آنها گوش داده می شود.

UnionFS چگونه کار می کند؟

UnionFS - سیستم فایل پشته ابزار (FS) برای لینوکس و FreeBSD. این FS مکانیزم کپی روی نوشتن (Copy-On-Write, COW) را پیاده سازی می کند. واحد کاری UnionFS یک لایه است؛ هر لایه باید به عنوان یک سیستم فایل کامل مجزا با سلسله مراتبی از دایرکتوری ها از خود ریشه در نظر گرفته شود. UnionFS برای سایر سیستم‌های فایل یک اتصال اتصال ایجاد می‌کند و به فایل‌ها و دایرکتوری‌ها از سیستم‌های فایل مختلف (به نام فورک) اجازه می‌دهد تا در یک سیستم فایل منسجم واحد و شفاف برای کاربر ترکیب شوند.

محتویات دایرکتوری ها با مسیرهای یکسان با هم در یک فهرست یکپارچه (در یک فضای نام واحد) از سیستم فایل حاصل ظاهر می شوند.

UnionFS لایه ها را بر اساس اصول زیر ترکیب می کند:

  • یکی از لایه ها به لایه سطح بالا تبدیل می شود، لایه دوم و لایه های بعدی به لایه های سطح پایین تبدیل می شوند.
  • اشیاء لایه "از بالا به پایین" در دسترس کاربر هستند، یعنی. اگر شی درخواست شده در لایه "بالا" باشد، صرف نظر از وجود شیئی با همان نام در لایه "پایین"، برگردانده می شود. در غیر این صورت شیء لایه "پایین" برگردانده می شود. اگر شیء درخواستی نه آنجا باشد و نه آنجا، خطای "هیچ فایل یا دایرکتوری وجود ندارد" برگردانده می شود.
  • لایه کاری "بالا" است، یعنی تمام اقدامات کاربر برای تغییر داده ها فقط در لایه سطح بالا منعکس می شود، بدون اینکه بر محتوای لایه های سطوح پایین تاثیر بگذارد.

Docker رایج ترین فناوری برای استفاده از کانتینرها برای اجرای برنامه ها است. این به استاندارد در این زمینه تبدیل شده است و بر اساس cgroup ها و فضاهای نام ارائه شده توسط هسته لینوکس ساخته شده است.

Docker به ما اجازه می دهد تا به سرعت برنامه ها را مستقر کنیم و با تقسیم هسته سیستم عامل بین همه کانتینرها، به عنوان فرآیندهای سیستم عامل مجزا، بهترین استفاده را از سیستم فایل داشته باشیم.

منبع: www.habr.com

اضافه کردن نظر