Docker چیست؟
آشنایی با Docker
FreeBSD Jails و Solaris Zones، نمونهای از Container های لینوکس هستند که دارای محفظههای محرمانه خود هستند.
( با پردازنده مجزا، حافظه، I / O بلوک و منابع شبکه ) که هسته سیستم عامل میزبان را به اشتراک میگذارند. در Docker نتیجه چیزی است که احساس میکنید مانند یک ماشین مجازی است.
اما تمام وزن و سربار راهاندازی سیستمعامل مهمان را از بین میبرد.
در یک سیستم در مقیاس بزرگ، وقتی در حال اجرا ماشین مجازی هستید. به این معناست که شما بسیاری از نمونههای تکراری همان سیستمعامل و تعداد زیادی از نسخههای بوت سیستم را بارگیری میکنید.
ازآنجاکه Container ها سادهتر و سبکتر نسبت به ماشین مجازیها هستند. ممکن است بتوانید ظرفیتهای شش تا هشت برابر ظرفیتهای ماشین مجازی را با همان سختافزار اجرا کنید.
Docker
در محیط برنامهای که نیاز به مقیاس وب دارد، Containers ها یکراه حل جذاب در مقایسه با مجازیسازی سنتی سرورها هستند.
برای درک Containers ها، ما باید با Cgroups و Namespace های لینوکس که از ویژگیهای هسته لینوکس هستند آشنا شویم.
که مابین containers و سایر فرآیندهای موجود در میزبان قرار میگیرند. Namespace لینوکس، که ابتدا توسط IBM ایجاد شد مجموعهای از منابع سیستم را دربرمی گیرد.
آنها را به یک فرایند ارائه میکند تا آنطور به نظر برسد که به این فرآیند اختصاصیافته است.
Cgroups های لینوکس، که ابتدا توسط Google توسعه یافتند. Namespace ها در لینوکس برای جداسازی و استفاده از منابع سیستم، مانند CPU و حافظه، برای یک گروه از فرایندها مدیریت میکنند.
بهعنوانمثال، اگر شما یک برنامه داشته باشید که مقدار زیادی چرخه CPU و حافظه را به خود اختصاص دهد،
مانند یک برنامه محاسباتی علمی، میتوانید برنامه را در Cgroup قرار دهید تا CPU و استفاده از حافظه را محدود کنید.
Namespace با جداسازی منابع برای یک فرآیند واحد به کار میرود، درحالیکه Cgroups مدیریت منابع برای یک گروه از فرایندها را انجام میدهد.
از LXC به Docker
تکنولوژی اصلی لینوکس Container لینوکس است که معمولا بهعنوان LXC شناخته میشود. LXC یک روش مجازیسازی برای سیستمعامل لینوکس که اجرای چندین سیستم جداشده لینوکس در یک میزبان را فراهم میکند.
Namespaces و Cgrpoupsها امکان ایجاد LXC را میدهد.
namespace برنامهها را از سیستمعامل جدا میکند. بدین معنا که کاربران میتوانند یک سیستمعامل لینوکس پاکیزه و حداقل داشته باشند.
علاوه بر این هر چیز دیگری را در یک container جداگانه اجرا کنند. همچنین، به دلیل اینکه سیستمعامل از Container خارج میشود.
میتوانید یک Container را در هر سرور لینوکس که از Containerها پشتیبانی میکند، انتقال دهید.
داکر که به عنوان یک پروژه برای ساخت Single-application LXC Containers آغاز شد.
چندین تغییر قابلتوجه در LXC ایجاد کرد که Container را قابلحمل و انعطافپذیر برای استفاده قرارداد.
Docker چیست؟
با استفاده از containers Docker شما میتوانید گسترش، جابجایی و پشتیبان گیری را سریعتر و راحتتر از ماشینهای مجازی انجام دهید. بنابراین داکر به دلیل Container های مدرنش محبوبیت پیدا کرد.
در این بخش ما به جزییات داکر و تفاوت آن با LXC نگاهی خواهیم کرد.
اگرچه داکر به عنوان یک پروژه منبع باز برای ساخت LXC متفاوتی شروع به کارکرد، اما بعدا به محیط برنامه زمانبندی Containers خود متصل شد.
داکر یک ابزار لینوکس است که میتواند بهطور مؤثر ایجاد، حمل و نگهداری Containers را مدیریت کند. اساساً، Containers Docker و LXC مکانیسمهای مجازیسازی سبکوزن کاربر هستند.
البته Cgroups و Namespace ها را برای ایزوله کردن منابع اجرا میکنند.
تعدادی از تفاوتهای کلیدی بین ظروف Docker و LXC
Singleprocess and Multiprocess
Docker ،Containersها را مجبور میکند که اگر برنامه شما که متشکل از فرآیندهای همزمان x باشد، به تعداد ایکس Containers را اجرا کنید.
هرکدام با یک فرآیند متمایز در مقابل، containers LXC یک فرآیند init معمولی دارند و میتوانند چندین فرآیند را اجرا کنند.
برای اجرای یک برنامه ساده چند سطحی وب در داکر شما نیاز به یک php containerدارید. به علاوه ی یک nginx container (برای وب سرور ) و یک mysql container برای پایگاه داده
و چندین Containers داده برای ذخیره جداول پایگاه داده و دیگر دادههای برنامه دارید. استفاده از Container تک پروسه مزایای بسیاری ازجمله بهروزرسانی آسان دارد.
همچنین Container تک پروسهای یک معماری کارآمد برای ساخت برنامههای کاربردی مبتنی بر سرویسهای میکرو است.
محدودیتهایی نیز برای Container تک پروسه وجود دارد. به عنوان مثال، شما نمیتوانید Agent و Login scrips و SSH را درون یک Container اجرا کنید.
همچنین برای تغییرات کوچک در سطح برنامه شما اساسا مجبور به ایجاد یک Container جدید بهروز شده هستید.
Stateless and Stateful
Container Docker بهصورت Stateless طراحیشدهاند.
اولا، داکر حافظه دائمی را پشتیبانی نمیکند. اما این امکان را به شما میدهد که قسمتی از فضای هاست را بهعنوان Docker volume به container خود اختصاص دهید.
دوما، Container Docker شامل لایههای فقط خواندنی هستند. این بدان معنی است که وقتی Container image ایجاد شد، تغییری نمیکند.
در طول زمان اجرا، اگر فرایند در یک Container باعث تغییرات در وضعیت داخلی آن شود. بین ساختار داخلی و Image که از آن Container ساختهشده است، تفاوت ایجاد میشود.
Stateless container یک موجود جالب است. شما میتوانید یک container را بهروزرسانی کنید.
این بهروزرسانیها یک سری Container image جدید ایجاد میکنند، بنابراین عقبگرد سیستم آسان است.
Portability
این احتمالا مهمترین پیشرفت داکر در مورد LXC است. داکر شبکه، ذخیرهسازی، و جزئیات سیستمعامل از برنامه را بیشتر از LXC خلاصه میکند.
هنگامیکه یک Container را از یک میزبان داکر به دستگاه دیگری انتقال دهید. داکر تضمین میکند که محتوا برای برنامه باقی خواهد ماند.
مزیت مستقیم این رویکرد این است که داکر توسعهدهندگان را قادر میسازد. تا محیطهای توسعه محلی را که دقیقه مانند یک سرور هستند، تنظیم کنند.
هنگامیکه یک توسعهدهنده نوشتن و تست کد خود را پایان میدهد، میتواند آن را در یک Container قرار دهد. هم چنین آن را بهطور مستقیم به سرور AWS یا ابر خصوصی خود منتشر کند.
با LXC، یک توسعهدهنده وقتی چیزی را بر روی دستگاه خود اجرا میکند. وقتی در سرور راهاندازی میکند، بهدرستی اجرا نمیشود.
داکر این پیچیدگی را برداشت، این چیزی است که Container Docker را قابلحمل و آسان برای استفاده در محیطهای مختلف ابر و مجازی میسازد.
یک معماری Developer-friendly
جدا کردن برنامهها از سختافزار پایه مفهوم اساسی در پشت مجازیسازی است. Container ها یک گام به جلو برداشتند و برنامهها را از سیستمعامل اصلی جدا میکنند.
این باعث انعطافپذیری Cloudly، ازجمله قابلیت حمل و مقیاس کارایی میشود. Container سطوح دیگری از کارایی، قابلیت حمل و انعطافپذیری را برای توسعهدهندگان بیش از مجازیسازی به ارمغان میآورند.
تنها راه برای کشف محدودیتهای ممکن این است که پا فراتر از ناممکنها بگذاریم.