اگر عضوی از جامعه برنامهنویسها و یا دواپسکارها باشید، حتما آشنایی هرچند جزئی با داکر دارید. داکر (Docker) یکی از ابزارهای بسیار کاربردی در حوزه توسعه نرمافزار است که به یکی از دستیارهای اصلی برنامهنویسها و به خصوص، کارشناسان دواپس تبدیل شده است.
در این مقاله قصد داریم به سوالهایی مانند داکر چیست؟ چگونه کار میکند؟ و چه اجزایی دارد را پاسخ بدهیم. با ما همراه باشید.
داکر Docker چیست؟
داکر یک پروژه متن باز است که به توسعهدهندگان در راحتی هرچه بیشتر فرایند توسعه (Developement)، بیلد (Build)، انتشار (Deployment)، اجرا (Run) و بهروزرسانی برنامهها کمک میکند. در واقع داکر با کمک کانتینرها، فرایند توسعه و انتشار نرمافزار را ساده میکند. علاوه بر این Docker به شرکت سازنده و صاحب امتیاز پروژه متن باز داکر هم اشاره میکند که در کنار بسیاری از شرکتهای دیگر، در حال توسعه و بهبود این پروژه هستند.
تاریخچه Docker
داکر در سال ۲۰۱۳ توسط سالومون هایکس که در شرکت dotCloud مشغول به کار بود، ساخته شد. کانتینرها که تقریبا از سال ۲۰۰۰ ایجاد شده بودند، تا قبل از داکر استفاده خاصی نداشتند. اما Docker با ایجاد یک پلتفرم با کاربری آسان، کانتینرها را به یکی از ابزارهای محبوب توسعهدهندگان تبدیل کرد. در واقع داکر یک ابزار درون سازمانی برای راحتی بیشتر توسعه و استقرار نرمافزار بود. اما در سال ۲۰۱۴، تکنولوژی داکر به صورت متن باز منتشر و به یکی از معروفترین پروژهها GitHub با سرمایهگذاری میلیون دلاری تبدیل شد. امروزه هم داکر، در صدر لیست ابزارهای محبوب دواپس قرار دارد.
داکر چگونه کار میکند؟
داکر تکنولوژیای است به شما امکان ایجاد، اجرا، تست و استقرار برنامههای توزیعشده را میدهد. Docker برای این کار، از مجازیسازی در سطح سیستم عامل استفاده میکند تا نرمافزار را در بستههایی با عنوان کانتینر تحویل بدهد. نحوه عملکرد داکر اینگونه است که یک برنامه و تمام نیازمندیهای آن را در یک کانتینر مجازی که قابلیت اجرا روی هر سیستمی را دارد قرار میدهد. این کانتینرسازی به نسبت ماشین مجازی، قابلیت حمل و کارایی بیشتری دارد.
کانتینرهای ساخته شده توسط داکر روی یک سیستم عامل، کاملا از هم مجزا و ایزوله هستند و هر کدام، مجموعهای از ابزارها، کتابخانهها و تنظیمات خود را به همراه دارند. البته این Containerها میتوانند توسط کانالهای ارتباطی با هم ارتباط برقرار کنند. تمام این کانتینرها روی هسته تنها یک سیستم عامل اجرا میشوند و به همین خاطر، از منابع کمتری استفاده میکنند.
قبل از هر چیز، با کانتینرها آشنا شوید
از ابتدای مقاله چندین بار به کانتینرها (Containers) اشاره کردیم. برای کار با داکر ، اول باید با مفهوم کانتینرها و کاربرد آنها آشنا شوید و سپس، کاربرد کانتینرهای داکر را بشناسید.
مفهوم Container چیست؟
کانتینر، یک واحد استاندارد و قابل اجرا از نرمافزار است که شامل بستهای از کد برنامه، کتابخانهها و نیازمندیهای اجرای برنامه میشود. کانتینرها به نحوی طراحی میشوند که برنامه مد نظر، قابلیت اجرا بر روی انواع سیستمهای مختلف، اعم از سیستم دسکتاپ، سیستمهای سنتی و حتی فضای ابری را داشته باشد.
برای این کار، Containerها از نوعی از مجازیسازی سیستم عامل استفاده میکنند که در آن ویژگیهای سیستم عامل، برای ایزوله کردن فرایندهای مختلف و مدیریت منابعی که هر فرایند نیاز دارد، بهینه و اختصاصی میشود.
به عبارتی هر کانتینر، درصد مشخصی از ظرفیت و منابع سیستم عامل را با توجه به نیاز برنامه، به خود اختصاص میدهد تا منابع به بهینهترین شکل ممکن بین کانتینرهای مختلف توزیع شوند. در واقع ویژگیهای ایزوله کردن فرایندها و مجازیسازی که در هسته لینوکس وجود دارد (مانند control groups و namespace) امکان ساخت کانتینرها را فراهم کرده است.
چرا باید از کانتینر استفاده کنیم؟
کانتینرها سبک، سریع و قابل حمل هستند و چندین کانتینر میتوانند همزمان با تخصیص بهینه منابع، بر روی یک سیستم عامل کار کنند؛ برعکس ماشینهای مجازی که هر ماشین، نیاز به سیستم عامل اختصاصی (Guest OS) خود را دارد. به همین خاطر امروزه containerها تقریبا جایگزین ماشینهای مجازی شدهاند.
علاوه بر این، موارد زیر را هم میتوانیم به عنوان مزیت استفاده از کانتینرها معرفی کنیم:
- سبک و سریع (به دلیل به اشتراکگذاری هسته سیستم عامل)
- قابل حمل و مستقل از پلتفرم (کانتینرها تمام نیازمندیهای خود را با خود همراه دارند)
- پشتیبانی از روشهای جدید معماری و توسعه نرمافزار
- بهینهسازی و بهبود استفاده از منابع
- امنیت بالا
- ایزوله بودن
- انعطافپذیری
- مقیاسپذیری
- تکرارپذیری برای ایجاد محیطهای مشابه در فرایند توسعه
Docker Container شامل چه مواردی میشود؟
کانتینرهای داکر یا داکر Containers در واقع کانتینرهایی هستند که با استفاده از image ساخته میشوند. Image در واقع یک قالب فقط خواندنی (Read-only) است که شامل تمام تنظیمات و نیازمندیهای اجرای یک برنامه میشود.
شاید فکر کنید که تعریف ایمیج و کانتینر یکسان است. در واقع کانتینر نمونه اجرا شده از یک ایمیج است؛ کانتینر چیزی است که ایمیج پس از اجرا در حافظه به آن تبدیل میشود. یک داکر ایمیج (داکر Image) میتواند با دستورهای Dockerfile یا Docker commit ساخته شود.
Docker Container شامل هر چیزی است که نرمافزار برای اجرا به آن نیاز دارد از جمله:
- کد برنامه
- زمان اجرا
- کتابخانهها
- متغیرهای محیط
- فایل تنظیمات
علاوه بر این، یک کانتینر داکر از سه بخش اصلی تشکیل شده است:
- داکرفایل (Dockerfile) که برای ساخت ایمیج از آن استفاده شده است.
- Image که یک قالب فقط خواندنی است و دستورالعمل لازم برای ایجاد کانتینر داکر را دارد.
- کانتینر که یک نسخه اجرا شده از ایمیج است.
معماری و عملکرد داکر
داکر از یک معماری کلاینت-سرور استفاده میکند. داکر کلاینت با داکر دیمون (docker daemon)، که مسئول بخش سخت عملیات یعنی بیلد، اجرا و توزیع کانتینر است، در ارتباط است. کلاینت و دیمون میتوانند روی یک سیستم باشند یا حتی میتوانید کلاینت خود را به صورت ریموت به یک داکر دیمون وصل کنید.
داکر کلاینت و داکر دیمون با استفاده از REST API از طریق سوکت UNIX یا رابط شبکه با یکدیگر ارتباط برقرار میکنند. نوع دیگری از داکر کلاینتها، داکر کامپوز (docker compose) است که به شما این امکان را میدهد تا با نرمافزارهایی کار کنید که از چند کانتینر ساخته شدهاند.
داکر دیمون (Docker Daemon)
داکر دیمون (با دستور dockerd) به درخواستهای API Docker گوش میدهد و اشیای داکر مانند ایمیجها، کانتینرها، شبکهها و ولومها را مدیریت میکند. همچنین یک دیمون میتواند برای مدیریت سرویسهای داکر، با سایر دیمونها ارتباط برقرار کند.
داکر کلاینت (Docker Client)
داکر کلاینت (با دستور docker) اولین راه ارتباطی کاربران با داکر است. وقتی از دستورهای مختلف داکر مانند docker run استفاده میکنید، کلاینت این دستور را به دیمون میرساند. کلاینت با استفاده از API داکر کار میکند و میتواند با بیش از یک دیمون در ارتباط باشد.
داکر دسکتاپ
داکر دسکتاپ (Docker Desktop)، یک اپلیکیشن با نصب بسیار آسان است که میتوانید روی ویندوز، مکبوک یا لینوکس نصب کنید و از آن برای ایجاد و اشتراک برنامههای کانتینری و میکروسرویسها استفاده کنید. Docker Desktop شامل عناصر مختلفی مانند دیمون، کلاینت، Docker Compose، Docker Content Trust، کوبرنتیز و … میشود.
رجیستریهای داکر(Docker Registries)
رجیستری Docker جایی است که Imageها در آن نگهداری میشوند. داکر هاب (Docker hub) یک رجیستری عمومی است که داکر به صورت پیشفرض از آن برای پیدا کردن ایمیجها استفاده میکند. البته شما میتوانید یک رجیستری خصوصی برای خود ایجاد کنید.
زمانی که از دستورهای docker pull یا docker run استفاده میکنید، ایمیجها از رجیستری شما فراخوانی میشوند و اگر از دستور docker push استفاده کنید، ایمیج در رجیستری شما قرار میشود.
اشیای داکر (Docker Objects)
زمانی که شما از داکر استفاده میکنید، در حال ساخت اشیای مختلفی مانند Imageها، Containerها، شبکهها، Volumeها، پلاگینها و … هستید. تمام این موارد با عنوان اشیا داکر (Docker Objects) شناخته میشوند.
بخشها و ابزارهای مختلف داکر
داکر از بخشهای مختلفی ایجاد شده است که هر کدام، در اجرای صحیح و بدون مشکل فرایندهای داکر نقش دارند. این بخشها عبارتند از:
- Docker Engine: یک محیط برای اجرای کانتینرها.
- Docker Command Line Client: ابزار و بخشی که با داکر انجین تعامل دارد.
- Docker Hub: یک سرویس ابری که سرویسهای رجیستری و repository را برای داکر ایمیج فراهم میکند.
علاوه بر این بخشهای کلیدی، ابزارهای دیگری نیز وجود دارند که با داکر کار میکنند. از جمله:
- Swarm: یک ابزار خوشهبندی و زمانبندی برای برنامههای داکری.
- Docker Desktop: وارث Docker ماشین و سریعترین راه برای کانتینری کردن برنامهها
- Docker Compose: ابزاری برای تعریف و اجرای برنامههای چند کانتینری در داکر
- Docker Registry: یک سرویس رجیستری داخلی، برای ذخیره و مدیریت داکر ایمیجها
- Kubernetes: ابزاری برای هماهنگسازی کانتینرها در داکر
- Rancher: پلتفرم مدیریت کانتینر با رویکرد Kubernetes-as-a-Service
کاربرد، مزایا و معایب استفاده از Docker
امروزه داکر به قدری محبوب شده است که بسیاری از افراد، عبارتهای داکر و Container را به جای یکدیگر استفاده میکنند. اما در واقع اولین تکنولوژی کانتینر-محور، سالها قبل از Docker معرفی شده بود و تا سال ۲۰۱۳ هم از آن استفاده میشد. Docker به برنامهنویسها این امکان را میدهد تا از ویژگیهای کانتینر و مجازیسازی که در هسته لینوکس قرار دارد، با کمک دستورهای ساده استفاده کنند.
همچنین با استفاده از API (رابط برنامهنویسی اپلیکیشن) بسیاری از فرایندها را اتوماتیک میکند. در مقایسه با سیستمهای قدیمی مدیریت کانتینر، داکر مزایای زیر را دارد:
- قابلیت حمل بهبودیافته و بدون مشکل کانتینرها
- حجم و وزن کمتر و بهروزرسانیهای جزئی
- ساخت کانتینر خودکار (اتوماتیک)
- امکان ساخت نسخههای مختلف از یک کانتینر و انتخاب از بین نسخهها
- امکان بازاستفاده از کانتینرها
- کتابخانه مشترک بین کانتینرها با استفاده از رجیستری متن باز (Open-source)
Best Practiceهای داکر
زمانی که از داکر استفاده میکنید، best practiceها یا بهروشهایی وجود دارند که بهتر است به آنها توجه کنید:
- از فایل .dockerignore برای خارج کردن فایلها و مسیرها از بیلد خود استفاده کنید.
- Dockerfile خود را ساده و خوانا ایجاد کنید.
- بهتر است زمان کار با داکر از دستور sudo استفاده نکنید.
- با استفاده از دستور docker network یک شبکه تعریف شده توسط کاربر (user-defined) برای برنامه خود بسازید.
- از Docker secrets برای مدیریت اطلاعات محرمانه و حساس که توسط کانتینرها به کار میروند، استفاده کنید.
رایجترین دستورات یا Commandها در داکر
برای شروع کار با داکر، میتوانید از لیست دستورات زیر کمک بگیرید:
- داکر برای مدیریت کانتینرهای سیستم
- docker build برای ساخت یک ایمیج جدید از یک Dockerfile
- docker images برای نمایش لیست تمام ایمیجهای موجود روی سیستم
- docker run برای اجرای یک کانتینر جدید از یک ایمیج
- docker ps برای نمایش لیست تمام کانتینرهای در حال اجرا روی سیستم
- docker stop برای توقف بدون مشکل یک کانتینر فعال (در حال اجرا)
- docker rm برای پاک کردن یک کانتینر متوقف شده از روی سیستم
- docker rmi برای پاک کردن یک ایمیج از روی سیستم
- docker login برای ورود به رجیستری داکر
- docker push برای ذخیره (پوش کردن) یک ایمیج در داکر رجیستری
- docker pull برای فراخوانی (پول کردن) یک ایمیج از داکر رجیستری
- docker exec برای اجرای دستور در یک کانتینر فعال
- docker export برای ذخیره کانتینر به صورت tar archive
- docker import برای باز کردن یک tar archive به صورت ایمیج
در نهایت، میتوانید از یک ویرایشگر متنی مانند Vim یا Emacs برای ویرایش Dockerfile خود استفاده کنید.
جمعبندی
در این مقاله ابتدا با تعریف داکر، کاربردهای آن و عناصر مهمی که در آن نقش دارند آشنا شدیم. سپس کانتینر را که به نوعی زیربنای اصلی داکر است تعریف کردیم و از مزیتهای استفاده از کانتینر برای توسعه نرمافزار گفتیم. امروز داکر به یکی از عناصر اصلی مدیریت فرایندها در دواپس تبدیل شده است و اگر قصد ورود به این حوزه را دارید، خوب است که بتوانید از ابزارهایی مانند Docker، Kubernetes و … استفاده کنید تا فرایندهای خود را در بهینهترین حالت انجام دهید.
دیدگاهتان را بنویسید