اگر بهعنوان یک مهندس نرمافزار یا توسعهدهنده فعالیت میکنید، حتما تا به حال با واژه Docker برخورد داشتید. Docker چیست و چه مزایایی برای کاربران خود فراهم میکند؟
DevOpsمجموعهای از شیوههایی است که توسعه نرمافزار (Dev) و عملیات IT (Ops) را با هم ترکیب میکند. هدف کوتاه کردن چرخه عمر (Life Cycle) توسعه سیستمها و تحویل مداوم با کیفیت بالای نرم افزار است. درواقع DevOps مکمل توسعه نرمافزار با روش Agile است.
Docker از زمان انتشار آن در سال 2013، به یکی از فناوریهای روبهرشد در حوزهی Devops تبدیل شده است. با این حال، مانند دیگر تکنولوژیهای جدید، داکر دارای محدودیتها، یا به عبارتی مزایا و معایبی است که نمیتواند برای استفاده در تمام پروژهها مناسب باشد. با خواندن این مقاله ضمن آشنایی با مفاهیم اولیه و کاربردهای این فناوری، میتوانید تشخیص دهید که آیا استفاده از داکر برای پروژه شما انتخاب مناسبی است یا نه!
Container چیست؟
قبل از آنکه به تعریف Docker بپردازیم، ابتدا مفهوم Container (کانتینر) را بیان میکنیم.
Container یک واحد نرمافزاری استاندارد است، که کد نرمافزار و همه وابستگیهای آن را به یک پکیج تبدیل میکند تا نرمافزار موردنظر با سرعت و اطمینان بیشتری در محیطهای محاسباتی اجرا شود. ایمیج کانتینر (Container Image) در داکر یک بسته نرمافزاری سبک، مستقل و قابل اجرا است، که شامل همه موارد مورد نیاز برای اجرای یک نرمافزار میشود: کد (Code)، محیط زمان اجرا (Runtime)، ابزار سیستم (System Tools)، کتابخانههای سیستم (System Libraries) و تنظیمات (Settings). Containerها میتوانند از طریق کانالهای مشخص با یکدیگر ارتباط برقرار کنند و از آنجایی که همه containerها تمامی سرویسهای هسته (Kernel) سیستمعامل واحدی را به اشتراک میگذارند، از منابع کمتری نسبت به ماشینهای مجازی استفاده می کنند.
ایمیج کانتینر زمانیکه روی Docker Engine اجرا شود، به container تبدیل میشود. نرمافزارهای کانتینرشده (Containerized applications) که برای هر دو سیستمعامل لینوکس و ویندوز موجود است، بدون توجه به زیرساختها همیشه یکسان عمل میکنند. درواقع، containerها نرمافزار را از محیط خود جدا کرده و اطمینان حاصل میکنند که علیرغم تفاوتهای بین development و staging، بطور یکسان عمل کنند.
Docker چیست؟
Docker (داکر) یک پلتفرم منبعباز برای ساخت، استقرار (Deployment) و مدیریت نرمافزارهای کانتینرشده است. این فناوری، امکان ایجاد، اجرا و تست پروژههای نرمافزاری را در قالب container قابل حمل و مجزا روی ابر (Cloud)، دیتاسنتر مشتری یا سیستمعاملهای مختلف (مثل ویندوز یا لینوکس) برای توسعهدهندگان (Developers) فراهم میکند. این کار به توسعهدهندگان امکان میدهد تا نرمافزارهای خود را بهصورت container بستهبندی کنند.
توسعهدهندگان میتوانند بدون داکر نیز container ایجاد کنند، اما این پلتفرم دارای مجموعه ابزارهایی است که توسعهدهندگان را قادر میسازد تا با استفاده از اتوماسیون و یکسری دستورات ساده و صرفهجویی در کار از طریق یک API واحد، containerهای خود را بهراحتی بسازند و مستقر کنند و در هر زمان که بخواهند آنها را اجرا و بهروزرسانی کرده یا متوقف کنند.
Docker چه مزایایی دارد؟
Docker مزایای منحصربفرد خود را دارد که در ادامه به برخی از آنها اشاره میکنیم:
- قابلیت تکرارپذیری: اجرای داکر در هر سیستمی که بتواند آن را اجرا کند، تضمین شده است. مشخصات دقیق Container در فایل Dockerfile ذخیره میشود. با توزیع این فایل در بین اعضای تیم، یک سازمان میتواند تضمین کند که تمام فایلهای image ساخته شده با همان Dockerfile یکسان کار میکنند. علاوهبراین، داشتن محیطی ثابت و مستند، باعث میشود که track کردن نرم افزار شما و شناسایی مشکلات نیز آسانتر شود.
- عدم تداخل تنظیمات: متعلقات و تنظیمات یک container، روی برنامههای دیگر رایانهی شما تاثیر نمیگذارند، حتی اگر یک container دیگر نیز همزمان درحال اجرا باشد. با استفاده از containerهای جداگانه برای هر جزء از یک برنامه (به عنوان مثال، یک وب سرور، رابط کاربری و یا پایگاه داده برای میزبانی یک وبسایت)، میتوانید از مغایرت متعلقات جلوگیری کنید و بدون نگرانی، پروژههای متعددی را روی یک سرور داشته باشید.
- امنیت: جداسازی اجزای مختلف یک برنامه بزرگ در containerهای مختلف میتواند مزایای امنیتی داشته باشد. برای مثال، اگر یک container در معرض خطر قرار بگیرد، بقیهی اجزا امن باقی خواهند ماند. اما به یاد داشته باشید که داکر در بحث امنیت، ضعفهایی هم دارد که در ادامه به آن میپردازیم.
- مدیریت محیط توسعه (Development environment): داکر مدیریت و نگهداری از ورژنهای مختلف را آسان میکند؛ مثلا میتوان ورژنهای مختلف یک وبسایت که از nginx استفاده میکند را ذخیره کرد. شما میتوانید برای هریک از اهداف آزمایش، توسعه و تولید، یک container جداگانه در یک Linode داشته باشید و به راحتی هریک را توسعه دهید.
- یکپارچه سازی مداوم: داکر به عنوان جزئی از سری پیوسته integration با ابزارهایی مانند Travis ، Jenkins و Wercker کار میکند. هر بار که کد اصلی نرم افزار شما به روز شود، این ابزار میتواند نسخه جدید را به عنوان یک Docker Image ذخیره کرده و برچسبگذاری کند. سپس، آن را به Docker Hub منتقل کرده وdeploy کند.
در چه برنامههایی از Docker استفاده کنیم؟
اگر نرمافزار شما در یک یا چند دسته زیر جای میگیرد، استفاده از داکر ممکن است برای شما مناسب باشد:
- یادگیری فناوریهای جدید: اگر میخواهید از ابزارهای جدید – بدون صرف زمان برای نصب و پیکربندی آنها – استفاده کنید، داکر میتواند محیطی جداگانه و یکبار مصرف را برای این منظور به شما ارائه دهد. پروژههای زیادی وجود دارند که Docker Imageهایی با برنامههای ازپیش نصب و پیکربندیشده را نگهداری میکنند. به عنوان مثال، اگر میخواهید یک سیستم ردیابی توزیع شده مانند Zipkin را بررسی کنید، میتوانید به سادگی با دستور زیر، آن را روی localhost داشته باشید:
sudo docker run -d -p 9411:9411 openzipkin/zipkin
- موارد استفاده پایه: اگر برنامه شما به قدری استاندارد یا پایه باشد که با یک ایمیج (Image) پیشفرض داکر کار کند، دریافت ایمیج از Docker Hub نیز راهحل خوبی است. مواردی مانند میزبانی وبسایت با استفاده از یک استک LAMP، استفاده از Reverse Proxy یا تنظیم یک سرور Minecraft اغلب دارای یک ایمیج رسمی و پشتیبانی در Docker Hub هستند. اگر تنظیمات پیشفرض این ایمیجها برای نیازهای شما قابل قبول باشد، دریافت آنها میتواند موجب صرفهجویی در زمان شود. درحالیکه اگر از داکر استفاده نکنید، تنظیمات محیط و نصب ابزارهای ضروری زمان زیادی میبرد.
- توسعهی بیش از یک برنامه بصورت همزمان: همانطور که قبلا هم اشاره شد، اگر میخواهید برنامههای متعددی را روی یک سرور اجرا کنید، نگهداری هر برنامه در containerهای جداگانه، از مشکلات مربوط به مدیریت متعلقات جلوگیری میکند. بنابراین، توسعهی بیش از یک برنامه بصورت همزمان با استفاده از داکر میتواند ایده خوبی باشد.
- توسعه نرمافزار بصورت تیمی: اگر تیم شما توسعهدهندگانی دارد که با تنظیمات مختلف کار میکنند، داکر راهی مناسب برای ایجاد محیط توسعه فراهم میکند، که نیازی به SSH به یک سرور خارجی ندارد.
در چه مواردی نباید از Docker استفاده کنیم؟
گاهیاوقات استفاده از داکر بهترین راه حل نیست. در اینجا به چند نمونه اشاره میکنیم:
- برنامه شما پیچیده است و یک sysadmin ندارید. برای برنامههای بزرگ و پیچیده، استفاده از یک Dockerfile از پیش ساخته شده یا دریافت یک ایمیج موجود، گزینهی مناسبی نخواهد بود. ساخت، ویرایش و مدیریت ارتباط بین چند container در چندین سرور، کار بسیار زمانبری است.
- بازدهی برنامه برای شما بسیار مهم است. زمانی که بحث بازدهی به میان میآید، داکر در مقایسه با ماشینهای مجازی، عملکرد بهتری دارد. داکر، kernel (کرنل) میزبان را به اشتراک میگذارد و سیستمعامل کامل را شبیهسازی نمیکند. با این حال، داکر هزینههایی در زمینهی بازدهی دارد. فرایندهایی که درون یک container اجرا میشوند، به اندازهی فرایندهایی که در سیستمعامل اصلی اجرا میشوند، سریع نیستند. بنابراین، اگر نیاز دارید که بهترین بازدهی ممکن را از سرور خود داشته باشید، بهتر است از داکر استفاده نکنید.
- شما نمیخواهید بهروزرسانیهای عجیب و غریب انجام دهید! داکر یک تکنولوژی جدید و در حال توسعه است. برای به دستآوردن ویژگیهای جدید، احتمالا باید به طور مرتب بهروزرسانی کنید و نکتهی حائز اهمیت در این روند، این است که پشتیبانی از نسخههای قبلی تضمینشده نیست.
- امنیت برنامه برای شما حائز اهمیت است. همانطور که پیشتر ذکر شد، نگه داشتن اجزای مختلف یک برنامه در containerهای جداگانه، مزایای امنیتی را فراهم میآورد، زیرا اختلال در یک container نمیتواند به راحتی بر سایر سیستمهای شما تاثیر بگذارد. با این حال، رویکرد مبتنی بر container در برنامههای پیچیدهتر، چالشهای زیادی را به همراه دارد. پس، اگر برنامه پیچیدهای دارید و نگران مسئله حفظ امنیت آن هستید، از داکر استفاده نکنید.
- شما میخواهید Clusterسازی کنید. Containerهای داکر میتوانند در سرورهای جداگانه ترکیب شوند تا با Docker Swarm کلاستر بسازد. با این حال، داکر نمیتواند جایگزین ابزارهای تولید و یا اتوماتیکسازی مانند Ansible، SaltStack و Chef باشد. علاوه بر این، داکر اخیرا پشتیبانی از Kubernetes را اعلام کرده است، که یعنی Docker Swarm به عنوان یک مدیر کلاستر مستقل کافی نیست.
- برنامهای با سیستمعامل چندگانه. از آنجایی که Docker Container سیستمعامل میزبان را به اشتراک میگذارد، اگر میخواهید برنامه کاربردی مشابهی را در سیستمعاملهای مختلف اجرا یا آزمایش کنید، به جای این روش، باید از ماشینهای مجازی استفاده کنید. در ادامه به تفاوت میان داکر و ماشینمجازی نیز میپردازیم.
تفاوت Containers و Virtual Machine چیست؟
Containerها و ماشینهای مجازی (VM) دارای تخصیص منابع و مزایای یکسانی هستند، اما هر کدام عملکرد متفاوتی دارند. Container به جای سختافزار، سیستمعامل را مجازی میکند، و از طرفی، Container قابل حمل و کارآمدتر از ماشین مجازی است.
- مشخصات CONTAINER: Container یک انتزاع در لایه اپلیکیشن است که کدهای نرمافزار و وابستگیهای آن را با هم بستهبندی میکند. چندین Container میتوانند روی یک دستگاه اجرا شوند و هسته سیستمعامل آن را با دیگر Containerها به اشتراک بگذارند، که هر کدام به صورت فرایندهای جداگانه در فضای کاربر اجرا میشوند. Containerها نسبت به VMها حجم کمتری اشغال میکنند، که این ویژگی باعث میشود بتوانند نرمافزارهای بیشتری را هندل کنند و به ماشین مجازی و سیستمعاملهای کمتری احتیاج داشته باشند.
- مشخصات VIRTUAL MACHINE: ماشینهای مجازی (VMs) نرمافزارهایی هستند که میتوانند از نظر سختافزاری و بصورت مجازی یک سرور را به چندین سرور تبدیل کنند. هایپروایزر (hypervisor) به چندین ماشین مجازی اجازه میدهد تا روی یک دستگاه اجرا شوند. هر ماشین مجازی شامل یک نسخه کامل از یک سیستمعامل، اپلیکیشن، فایلهای دودویی لازم و کتابخانهها است که دهها گیگابایت حافظه را اشغال میکند. علاوه براین، بیشتر وقتها VMها بسیار کند راهاندازی میشوند.
حال که تفاوت کانتینر و ماشین مجازی را متوجه شدیم، ممکن است این سوال پیش بیاید که با توجه به مزایا و معایب هر یک، آیا میتوان از هر دوی آنها با هم استفاده کرد؟ پاسخ بله است!
Containers و VMs اگر با هم استفاده شوند، انعطافپذیری زیادی برای deploy و مدیریت اپلیکیشنها فراهم میکنند.
آیا باید از Docker Container استفاده کنیم؟
داکر یک راهحل بسیار محبوب برای پیکربندی، ذخیره و به اشتراکگذاری محیط سرور با استفاده از container است. نصب یک برنامه یا حتی یک استک بزرگ اغلب میتواند به سادگی اجرای دستورات docker pull
یا docker run
باشد. جداکردن توابع کاربرد در containerهای مختلف نیز مزایایی را در زمینه مدیریت امنیت و متعلقات ارائه میدهد.
با این حال، داکر جایگزین خوبی برای سیستمهای مهندسی و یا مدیریت پیکربندی نیست و رویکرد آن نقاط ضعفی هم دارد. توسعهدهندگان باید دربرابر وسوسهی انتقال همهی برنامههای جدیدشان به داکر، مقاومت کنند!
سؤالات متداول Docker (FAQ)
آیا داکر روی سیستمعاملهای لینوکس، مک و ویندوز اجرا میشود؟
بله. شما میتوانید برنامههای لینوکس، ویندوز و فایلهای اجرایی را در کانتینرهای Docker اجرا کنید. پلتفرم داکر به صورت بومی روی لینوکس (در x86-64، ARM و بسیاری دیگر از معماریهای CPU) و روی ویندوز (x86-64) اجرا میشود.
در واقع شما میتوانید کانتینرهای خود را روی لینوکس، ویندوز و macOS بسازید و اجرا کنید.
آیا هنگام خروج کانتینر اطلاعاتم را از دست میدهم؟
خیر! هر دادهای که برنامه شما روی دیسک کانتینر مینویسد، تا زمانی که به صراحت کانتینر را حذف نکنید، در محفظه آن حفظ میشود. تمامی اطلاعات ذخیرهشده روی کانتینر پس از توقف کانتینر نیز باقی میماند.
کانتینر داکر تا چه اندازه قابل مقیاس است؟
برخی از بزرگترین مزارع سرور در جهان امروز بر پایه کانتینرها هستند. بسیاری از سازمانهای بزرگ در زمینه وب مانند گوگل و توییتر و ارائهدهندگان پلتفرمهایی مانند Heroku بر اساس فناوری کانتینر در مقیاس صدها هزار یا حتی میلیونها کانتینر اجرا میشوند.
آیا میتوانم بیش از یک فرآیند را در یک کانتینر داکر اجرا کنم؟
استفاده از این رویکرد اصلا توصیه نمیشود. برای بالا بردن کارایی، هر کانتینر باید به یک مسئله خاص رسیدگی کند. با این حال، بله میتوانید در یک کانتینر چندین سرویس و فرآیند را اجرا کنید.
ایمیج داکر (docker image) چیست؟
ایمیج داکر بستههای اجرایی هستند (همراه با کد برنامه، بستههای نرمافزاری و غیره) به منظور ایجاد کانتینرها. ایمیج داکر را میتوان در هر محیطی از داکر مستقر کرد و کانتینرها را میتوان برای اجرای برنامه در آنجا ایجاد و تنظیم کرد.
DockerFile چیست و چه کاری انجام میدهد؟
داکر فایل یک فایل متنی است که در آن تمام دستورات اجرایی لازم برای ساخت ایمیج در آن نوشته شده است.
Docker Hub چیست و چگونه از آن استفاده کنم؟
داکر هاب یک رجیستری مبتنی بر ابر عمومی است که توسط Docker برای ذخیره ایمیج کانتینرها به همراه امکان “پیدا کردن” و “به اشتراکگذاری” آنها ارائه شده است. ایمیجها را میتوان از طریق دستور docker push به Docker Hub فرستاد.
امیدواریم با خواندن این مقاله با مفاهیم Docker و Container آشنا شده و تفاوت آنها را با ماشین مجازی به خوبی درک کرده باشید. به یاد داشته باشید که قبل از تصمیم به استفاده از این پلتفرم، الزامات هر پروژه را با دقت زیاد بررسی کنید.