این روزها صحبت داکر (Docker) در محافل فناوری داغ است و به احتمال زیاد از گوشه و کنار تعریفهای داکر به گوش شما خورده است. به همین منظور در ادامه قصد داریم با هم ببینیم داکر چیست و چرا اینقدر محبوبیت پیدا کرده است؟
حدود ۵ سال پیش فردی با نام سالامان هایکز (Solomon Hykes)، سازوکاری با نام داکر را راهاندازی کرد. هدف از این کار تعامل راحتتر با کانتینرها (Containers) بود. این ایده با موفقیت روبرو شد و در سال ۲۰۱۴ پس از انتشار داکر نسخه ۱.۰ شاهد افزایش محبوبیت آن بودیم.
در نتیجه شرکتها یکی پس از دیگری اپلیکیشنهای تحت سرور را به جای ماشینهای مجازی در بستر داکر راهاندازی کردند. جالب است بدانید چندین بانک بزرگ در زمانی که داکر هنوز در نسخه ۱.۰ به سر میبرد از این فناوری کمک گرفتند که این امر برای فناوری که در نسخه اولیه قرار دارد از امنیت بالای داکر حکایت میکند.
این روزها داکر و Moby که به عنوان مجموعه بالاسری داکر شناخته میشود، مخاطبین بسیار زیادی جذب کرده و بنا به گزارش داکر چیزی بیشتر از ۳.۵ اپلیکیشن در کانتینرها از طریق فناوری داکر قرار دارند و بیشتر از ۳.۷ میلیارد اپلیکیشن از این طریق دانلود شده است.
داکر (Docker) چیست؟
داکر امکانی را فراهم آورده است که پروسهها و نرمافزارها به صورت مجزا در محیط کاملا ایزولهای بر روی کرنل لینوکس راهاندازی شود که به این محیط و بستهی ایزوله، کانتینر (Container) میگویند.
کانتینر این امکان را برای برنامه نویسان و توسعه دهندگان اپلیکیشن ها فراهم می کند تا یک برنامه را با تمام ماژول ها و کامپوننتهای وابسته آن ( مانند کتابخانه ها ، توابع و … ) یکی کرده و به صورت یک پکیج درآورده تا آن برنامه تولید شده در پلتفرم ها و سیستمهای مختلف بدون مشکل اجرا شود، در حقیقت بدون نگرانی از تنظیمات و وابستگیهای یک Application خاص در پلتفرم های دیگر، آن برنامه در هر محیطی اجرا شود. پس اگر برنامه نویسی می کنید حتما استفاده از داکر را به شما توصیه می کنیم.
داکر که در بالا به آن اشاره شد وظیفه مدیریت کانتینرها را به عهده دارد و بیشتر شبیه یک ماشین مجازی عمل میکند، تفاوت داکر با ماشین مجازی در این است که در VM (یا ماشین مجازی) برای اجرای اپلیکیشن و برنامه های مختلف که بخواهیم به صورت ایزوله و مجزا از هم کار کنند باید VM های مختلف ساخته شود که همین موضوع بار پردازشی و هدر رفت منابع سیستمی را روی سرور به همراه دارد.
ولی در Docker روی یک VM خاص که میتواند دارای سیستم عامل ویندوز یا لینوکس باشد، ماژول داکر نصب شده و سپس روی سرویس داکر، کانتینرهای مختلف حاوی برنامه ها و اپلیکیشن های مختلف نصب و اجرا میشوند بدون اینکه کانتینرها به هم دسترسی داشته باشند. بدین صورت کانتینرها از هم ایزوله هستند و نیاز ما برای ایجاد چندین VM را مرتفع میسازند.
کانتینر (Container) چیست؟
نگهداری برنامهها در محیطی ایزوله و به صورت مستقل، از اهداف سیستمهای جدید توسعه نرم افزار است. به این ترتیب فعالیت آنها بر روی یکدیگر تاثیری نداشته و کاملا مستقل از هم کار میکنند. یکی از راههای پیاده کردن این تکنولوژی استفاده از ماشین مجازی (Virtual Machine) است که برنامهها را روی یک سخت افزار اما جدا از هم نگهداری میکند. در این حالت component ها با هم تداخل نداشته و رقابت برای استفاده از منابع سخت افزاری به حداقل میرسد.
اما کانتینر چیست؟ در مقابل ماشینهای مجازی، کانتینرها (Container) قرار دارند، آنها میتوانند جایگزین مناسبی برای ماشینهای مجازی باشند. کانتینرها محیطهای اجرایی را جدا کرده و هسته سیستم عامل را به اشتراک میگذارد. کانتینرها نسبت به ماشینهای مجازی از منابع کمتری استفاده میکنند و همچنین خیلی سریع قابلیت اجرا پیدا میکنند.
اجزای داکر
داکر در آغاز بهشکل یکپارچه طراحی شده بود، اما اکنون به سه بخش اصلی Docker Engine، Docker-containered و Docker-runc، به همراه تعدادی بخشهای جانبی تقسیم شده است. در این قسمت، به معرفی بخشهای مختلف داکر میپردازیم.
- Docker Engine یا dockerd: شامل daemon، API interface و CLI میشود که بهشکل خاص Daemon مسوول ساخت Docker Images است.
- Docker-containerd یا containerd: یک Daemon دیگر که مسوول دانلود کردن Docker Images و اجرای آنها به عنوان یک Container است.
- Docker-runc یا runc: همان Container Runtime که مسوول ایجاد Namespaces و Control groups مورد نیاز Container است.
در کنار اجزای اصلی داکر، برای ساختن، اجرا کردن و به اشتراک گذاشتن Container موارد زیر لازم است:
Docker Daemon
(همان dockerd): معماری کلاینت-سرور دارد و مسوول تمام موارد مرتبط با Containerها است.
Docker Client: وظیفهی ارتباط با Docker Daemon را بر عهده دارد و بهوسیلهی آن میتوان دستورات را ارسال کرد.
Docker Images: پایهای ترین بخش Docker است. برای اجرای Docker Container به یک Image نیاز داریم که شامل کتابخانهی سیستمعامل، ملزومات و ابزارهای اجرای هر برنامه است. برای مثال اگر بخواهیم Nginx Web Server را بهعنوان Ubuntu Container اجرا کنیم، باید یک Docker Image با Nginx Binary و تمام کتابخانههای لازم سیستمعامل برای اجرای Nginx بسازیم. برای ساختن Imageها نیز میتوان از Dockerfile استفاده کرد که یک فایل متنی شامل دستورات اجرایی در هر خط است.
Docker Imageها ساختاری لایهای دارند و هر دستور Dockerfile یک لایه به Image اضافه می کند. بالاترین لایهی قابل نوشتن Image یک Container است. هر Image از یک Base Image ایجاد می شود و میتواند مجددن بهوسیلهی Dockerfile یک لایهی جدید به خود بگیرد و به یک Image دیگر تبدیل شود. برای مثال، میتوان از یک Base Image دارای Ubuntu استفاده کرد و یک Image دیگر با Nginx Application در آن ایجاد کرد.
Docker Containers
بهشکل کلی، Container از Image ساخته میشود و کاربر میتواند برنامهاش را در آن قرار دهد. Containerها میتوانند Start ،Stop ،Commit و Terminate شوند. دو یا چند Container را میتوان برای ایجاد معماری مخصوص به یکدیگر متصل کرد. برای مدیریت این کار باید از ابزارهای Container Orchestration مانند Kubernetes استفاده کرد.
Docker Registry: یک مخزن از Docker Imageها است که میتوان بهشکل خصوصی یا عمومی با آن کار کرد. Docker Inc یک سرویس Docker Registry را پشتیبانی میکند که به Docker Hub معروف است و به کاربران اجازه آپلود و دانلود Image میدهد. اگر یک مخزن عمومی باشد، سایر کاربران Docker Hub به Imageهای آن دسترسی خواهند داشت. با استفاده از Docker Registry به سادگی میتوان Docker Imageها را جابجا کرد.
با دستور Docker Build میتوان از روی Dockerfile یک Image ساخت. سپس آن را با استفاده از دستور docker run اجرا کرد. برای تعریف و اجرای برنامه های Multi-Container نیز از docker compose استفاده می شود. بهوسیلهی یک فایل YAML میتوان سرویسهای مورد نیاز برنامه را تعریف و پیکربندی کرد، به گونهای که هر کدام از یک Container مستقل ایجاد شده باشند.