Docker چیست و چه کاربردی دارد؟
اگر شما یک توسعهدهنده نرمافزار هستید، حتماً با نام “Docker” آشنا هستید. Docker یک پلتفرم منبعباز است که به توسعهدهندگان کمک میکند تا با استفاده از قابلیت مجازیسازی در سطح سیستمعامل، نرمافزارها را در قالب بستههایی به نام “کانتینر” ارائه دهند. در این مقاله از بایت گیت، قصد داریم به شما توضیح دهیم که Docker در واقع چیست. همچنین، درباره مفاهیم مهمی مانند کانتینر، ابزارها، اصطلاحات مرتبط با Docker و نحوه عملکرد آن صحبت خواهیم کرد. لطفاً توجه داشته باشید که برای بهرهبرداری بهتر از این مقاله، آشنایی با برخی از مفاهیم ابتدایی Docker ضروری است.
در این مقاله، قصد داریم یکی از پلفترم های متخصص در زمینه مجازیسازی سیستمعامل را معرفی و بررسی کنیم. این محصول به نام Docker است و یک پلتفرم متنباز است. برای درک دقیق تر در مورد مفهوم و عملکرد Docker، با ما تا انتهای این مقاله همراه باشید.
کانتینر (Container) چیست؟
کانتینر در مفهوم Docker یک واحد اجرایی است که تمامی نیازمندیهای یک نرمافزار را در خود جای میدهد، از جمله کدهای برنامه، کتابخانهها، فایلهای تنظیمات و سایر وابستگیها. کانتینر به طور مجازی از منابع سیستمی مانند سیستمعامل، حافظه و شبکه جداگانه میشود و با استفاده از تکنولوژی مجازیسازی در سطح سیستمعامل، قابل اجرا است. هر کانتینر به صورت مستقل و جداگانه از دیگر کانتینرها اجرا میشود و از منابع سیستمی مستقل خود برخوردار است. این ویژگیها باعث میشود که کانتینرها بتوانند بهطور موثر و قابلانتقال در محیطهای مختلف اجرا شوند و مشکلاتی مانند تداخل منابع بین برنامهها را به حداقل برسانند.
مزایای استفاده از کانتینر چیست؟
استفاده از کانتینرها در توسعه نرمافزار و محیطهای تولید دارای مزایای فراوانی است. برخی از اصلیترین مزایا عبارتند از:
- قابلیت قابلیت انتقال و قابلیت اجرا در هر محیط: کانتینرها، به عنوان بستههای قابل حمل و مستقل، قادر به اجرا در هر محیطی هستند. این به شما امکان میدهد برنامهها را بدون نگرانی از تفاوتهای سیستم عامل یا تنظیمات محیطی به سادگی اجرا کنید.
- جدا بودن و سازگاری: هر کانتینر مجزا و جداگانه اجرا میشود، بنابراین تداخل بین برنامهها کاهش مییابد و همچنین امکان سازگاری با برنامهها و وابستگیها متفاوت فراهم میشود.
- بهرهوری منابع: کانتینرها از منابع سیستمی بهینهتری استفاده میکنند و به شما اجازه میدهند چندین کانتینر را روی یک سرور میزبانی کنید، که منجر به بهرهوری بالاتر و استفاده بهینهتر از سختافزار میشود.
- مدیریت آسان: کانتینرها از مزیتهای مدیریتی برخوردارند. آنها قابلیتهایی مانند مقیاسپذیری خودکار، مانیتورینگ و مدیریت محیطی را سادهتر میکنند. همچنین، با استفاده از ابزارهای مدیریتی مانند Docker Compose و Kubernetes، میتوانید کانتینرها را به راحتی مدیریت و مورد کنترل قرار دهید.
- امنیت: کانتینرها بازواردی اضافی در امنیت فراهم میکنند. زیرا هر کانتینر جداگانه و منفصل اجرا میشود و از جدارهها و محدودیتهای امنیتی محیطی بهره میبرد.
به طور کلی، استفاده از کانتینرها باعث ارتقای قابلیتهای اجرایی، قابلیت انتقال و قابلیت مقیاسپذیری نرمافزار شما میشود و فرآیند توسعه و مدیریت نرمافزار را سادهتر و کارآمدتر میکند.
چگونه میتوانم از ابزار Docker Compose برای مدیریت کانتینرها استفاده کنم؟
Docker Compose ابزاری است که به شما امکان میدهد برنامههای چند کانتینری را با استفاده از یک فایل تنظیمات ساده و خوانا مدیریت کنید. این ابزار برای تعریف و مدیریت سرویسها، شبکهها و مخزنها در محیط Docker استفاده میشود. در زیر، مراحل اصلی برای استفاده از Docker Compose را شرح خواهم داد:
- نصب Docker Compose: ابتدا باید Docker Compose را در سیستم خود نصب کنید. مراحل نصب برای سیستمعامل مختلف ممکن است متفاوت باشد. میتوانید از مستندات Docker راهنمای نصب را برای سیستمعامل خود مشاهده کنید.
- ایجاد فایل تنظیمات Docker Compose: باید یک فایل با نام “docker-compose.yml” ایجاد کنید. این فایل حاوی تنظیمات کانتینرها، شبکهها و سرویسهای مورد نیاز شما است.
- تعریف سرویسها: در فایل docker-compose.yml، باید سرویسهای مورد نیاز خود را تعریف کنید. هر سرویس شامل نام، تصویر Docker، پورتها، محیطهای متغیر، اتصالات شبکه و تنظیمات دیگر است.
- تعریف شبکه: اگر نیاز به تعریف شبکه خاصی برای ارتباط بین کانتینرها دارید، میتوانید در فایل docker-compose.yml شبکههای مورد نیاز را تعریف کنید.
- اجرا و مدیریت سرویسها: با استفاده از دستور “docker-compose up”، میتوانید سرویسها را ایجاد و اجرا کنید. Docker Compose سرویسها را به صورت همزمان و با تنظیمات مشخص شده اجرا میکند.
با استفاده از Docker Compose، میتوانید به راحتی سرویسهای چند کانتینری خود را مدیریت کنید. همچنین، میتوانید از دستورات مختلفی مانند “docker-compose start”، “docker-compose stop” و “docker-compose restart” برای کنترل و مدیریت سرویسها استفاده کنید.
Dockerfile دقیقا چیست؟
هر کانتینر داکر با استفاده از یک فایل داکر شروع به کار میکند. Dockerfile ها در واقع فایلهای تنظیمات داکر هستند که با استفاده از آنها میتوانیم به داکر بگوییم که یک کانتینر را چگونه بالا بیاورد و تنظیم کند. این فایلها تعیین میکنند که کدام سرویسها فعال شوند و چگونه به آنها دسترسی داده شود. همچنین، Dockerfile مشخص میکند که کانتینر ما از کدام سیستم عامل استفاده کند، از چه زبانها، متغیرهای محلی، پورتهای شبکه و غیره استفاده کند. و در اصل، مهمترین وظیفه Dockerfile این است که تعیین کند که کانتینر ما پس از اجرا چه کاری را انجام دهد.
در زیر کلمات کلیدی رایج در Dockerfile همراه با توضیحات آنها به صورت یک جدول آورده شده است:
کلمه کلیدی | توضیحات |
---|---|
FROM | تعیین تصویر پایه مورد استفاده برای ساخت تصویر Docker |
COPY | کپی فایلها از محیط محلی به داخل تصویر Docker |
RUN | اجرای دستورات مشخص شده در محیط تصویر Docker |
WORKDIR | تعیین مسیر کاری فعلی درون تصویر Docker |
EXPOSE | مشخص کردن پورتهایی که برنامه داخل تصویر Docker برای ارتباط با بیرون استفاده میکند |
ENV | تعریف متغیرهای محیطی داخل تصویر Docker |
CMD | تعیین دستور اجرایی پیشفرض در زمان اجرای کانتینر بر اساس تصویر Docker |
ENTRYPOINT | تعیین دستور اجرایی پیشفرض و پارامترهای آن در زمان اجرای کانتینر بر اساس تصویر Docker |
VOLUME | مشخص کردن مسیرهای تعریف شده برای انتقال دادهها بین کانتینر و میزبان اصلی (host machine) |
این کلمات کلیدی برای تعیین تصویر پایه، کپی فایلها، اجرای دستورات، تنظیمات محیطی، پورتها، مسیر کاری، دستور اجرایی پیشفرض و سایر تنظیمات مورد نیاز در Dockerfile استفاده میشوند.
Docker image چیست؟
وقتی که کار نوشتن Dockerfile را به پایان میرسانید، با استفاده از قابلیت Docker Build، قادر خواهید بود یک تصویر (Image) بر اساس محتویات Dockerfile خود ایجاد کنید. Dockerfile شامل یک سری دستورات ساخت تصویر است، در حالی که Docker Image یک فایل قابل حمل است که شامل مجموعهای از دستورات است که مشخص میکند کدام کامپوننتهای نرمافزاری درون کانتینر اجرا شوند و نحوه اجرای آنها. احتمالاً Dockerfile نیاز خواهد داشت تا تعدادی فایل را از مخازن مختلف (Repository) دانلود کند و در اینجا باید به صراحت مشخص کنید که کدام نسخهها باید دریافت شوند. همچنین تصویر ساخته شده توسط Docker Image ثابت است، به این معنی که یک بار ساخته شده و نیازی به تغییر آن ندارید. همانطور که از نام آنها مشخص است، Docker Image یک تصویر از سیستم عامل اصلی است.
چگونه Docker Image ساخته شده استاتیک است؟
طراحی Docker Image به صورت استاتیک به این معنی است که پس از ساختن یک تصویر Docker، آن تصویر تغییر نمیکند و در حالت فعلی خود ثابت باقی میماند. به عبارت دیگر، هر تغییری که در محتوای یک کانتینر مربوطه اعمال شود، نیاز به ساخت تصویر جدید Docker دارد.
هنگامی که Docker Image ساخته میشود، Dockerfile شامل توصیفاتی است که تعیین میکند کدام کامپوننتها و برنامهها در داخل کانتینر اجرا شوند و چگونه آنها پیکربندی شوند. سپس Docker این توصیفات را استفاده میکند تا محیط کانتینر را بر اساس آن تنظیم کند و فرایند ساخت تصویر Docker را آغاز کند.
در فرآیند ساخت تصویر، هر دستور در Dockerfile (مانند COPY، RUN، ENV و…) به ترتیب اجرا میشود و تغییرات محیطی و نصب برنامههای مورد نیاز در داخل کانتینر را اعمال میکند. اما بعد از ساخت تصویر Docker، دستورات اجرا شده و تغییرات اعمال شده در داخل کانتینر ثابت میمانند و هیچ تغییری در آنها اعمال نمیشود.
این ویژگی استاتیک بودن Docker Image از نظر عملی بسیار مفید است، زیرا به شما اجازه میدهد تا تصویر را در هر محیطی که Docker در آن اجرا میشود، به صورت یکپارچه و بدون نیاز به تغییرات اضافی استفاده کنید. همچنین، این ویژگی میتواند امکان به اشتراک گذاری تصویر راحتتر و قابل انتقال بین سیستمها را فراهم کند.
Docker run, Docker Hub, Docker Engine
در اینجا لازم است به طور خلاصه با چند اصطلاح دیگر نیز آشنا شوید:
- Docker Run:
Docker Run یک دستور است که در Docker CLI (Command Line Interface) استفاده میشود و برای اجرای یک کانتینر بر اساس یک تصویر Docker مشخص استفاده میشود. با استفاده از دستور Docker Run، میتوانید تنظیمات مختلفی را برای کانتینر تعیین کنید، مانند پورتها، متغیرهای محیطی، مسیرها و غیره. این دستور معمولاً برای ایجاد یک نمونه از یک کانتینر مورد استفاده قرار میگیرد و کانتینر را در حالت فعال اجرا میکند. - Docker Hub:
Docker Hub یک رجیستری عمومی برای تصاویر Docker است. این سرویس توسط Docker ارائه میشود و به کاربران اجازه میدهد تصاویر Docker را بارگیری (pull) و به اشتراک گذاری (push) کنند. Docker Hub یک منبع اصلی برای جستجو و دسترسی به تصاویر Docker است و شامل تصاویر رسمی ارائه شده توسط تیم Docker و تصاویر بارگذاری شده توسط جامعه کاربری میشود. همچنین، Docker Hub امکان میزبانی (hosting) و مدیریت تصاویر شخصی را برای کاربران فراهم میکند. - Docker Engine:
Docker Engine محرک اصلی و موتور اجرایی پشت Docker است. این مجموعه نرمافزاری مسئول مدیریت ساخت، اجرا و مدیریت کانتینرها است. Docker Engine شامل سرویسهایی مانند دیمون (Docker Daemon)، محیط اجرای کانتینرها (Container Runtime)، مدیریت شبکه (Networking) و مدیریت ذخیرهسازی (Storage) میشود. Docker Engine به عنوان پایه Docker به صورت مستقیم با سیستم عامل تعامل میکند و برنامهها و سرویسها را درون کانتینرها جدا از بستر سیستم عامل اجرا میکند.
داکر چگونه کار میکند؟
همانطور که گفتیم Docker یک پلتفرم مجازیسازی سطح سیستم عامل است که به شما امکان میدهد برنامهها و سرویسها را درون کانتینرهای مجازی اجرا کنید. کانتینرها محیطی جداگانه و مستقل از یکدیگر ایجاد میکنند، که در آن برنامهها و تنظیمات مورد نیاز برای اجرای آنها به صورت بستهبندی شدهاند. این کانتینرها قابلیت حمل و انتقال بین سیستمها را دارند، بدون نیاز به نگرانی در مورد تفاوتهای محیطی، و به صورت یکپارچه و قابل استفاده در هر محیطی قرار میگیرند.
عملکرد Docker به این صورت است:
- ساخت تصویر (Image): شما با استفاده از Dockerfile یک تصویر را ساخته یا از Docker Hub تصویری را دریافت میکنید. Dockerfile شامل دستوراتی است که محیط کانتینر را توصیف میکنند، از جمله نحوه نصب برنامهها و تنظیمات لازم.
- ایجاد کانتینر (Container): با استفاده از تصویر ساخته شده، Docker یک کانتینر از آن تصویر ایجاد میکند. کانتینر شامل همه برنامهها و تنظیمات مورد نیاز برای اجرای برنامه خاص است. هر کانتینر محیط اجرایی خود را دارد و از بقیه کانتینرها و سیستم میزبان جداست.
- مدیریت کانتینرها: شما میتوانید کانتینرها را مدیریت کنید، به عنوان مثال، راه اندازی و توقف کانتینرها، مشاهده و ثبت لاگها، مدیریت شبکه و اتصال به کانتینرها برای اجرای دستورات خاص.
Docker از تکنولوژیهای مانند محیط اجرایی کانتینر (Container Runtime) مانند Docker Engine و تکنولوژیهای مجازیسازی سطح سیستم عامل (Operating System Level Virtualization) مانند کانتینرهای Linux (مانند LXC) برای ایجاد و مدیریت کانتینرها استفاده میکند.
توسعهدهندگان و مدیران سیستم از Docker برای ایجاد و مدیریت برنامهها و سرویسها در محیطهای مختلف استفاده میکنند. این فناوری مزایایی مانند قابلیت پرتابلیته (Portability)، مقیاسپذیری (Scalability)، تکرارپذیری (Reproducibility) و کارآیی بالی را فراهم میکند و به شما امکان میدهد برنامهها را با سرعت و کارآیی بالا اجرا کنید.
تفاوت Docker با ماشین مجازی چیست؟
به طور کلی، Docker و ماشینهای مجازی (VMs) هر دو روشهای متفاوتی برای ایزولهسازی و اجرای برنامهها را فراهم میکنند. اما رویکردهای آنها در ایجاد و مدیریت محیط اجرا متفاوت است. در ادامه تفاوتهای اصلی بین Docker و ماشینهای مجازی را توضیح میدهم:
۱. سطح ایزولهسازی: در Docker، ایزولهسازی برنامهها با استفاده از تکنولوژی کانتینر صورت میگیرد. هر کانتینر دارای محیط اجرایی جداگانه خود است و تمامی وابستگیها و کتابخانههای مورد نیاز برنامه درون کانتینر قرار میگیرند. این به معنی این است که چندین کانتینر میتوانند روی یک هسته سیستم عامل به طور همزمان اجرا شوند و با هم به اشتراک منابع سیستم عامل میپردازند. در مقابل، در ماشینهای مجازی، هر ماشین مجازی دارای سیستم عامل مجزا و منابع سختافزاری (مثل پردازنده، حافظه و دیسک) است و هر ماشین مجازی به طور جداگانه مدیریت میشود.
۲. سرعت و بازدهی: به دلیل استفاده از ایزولهسازی سطح کانتینر، Docker به طور کلی سریعتر و بسیار کمهزینهتر از ماشینهای مجازی است. چرا که در Docker، هیچ نیازی به اجرای سیستم عامل جداگانه برای هر کانتینر نیست و از هسته سیستم عامل میزبان استفاده میشود. در نتیجه، زمان راهاندازی کانتینرها بسیار کمتر از ماشینهای مجازی است و حجم مصرف منابع سختافزاری نیز کمتر است.
۳. حجم فضای ذخیرهسازی: در Docker، فضای ذخیرهسازی بستههای برنامه وابسته به کانتینرها بسیار کمتر از ماشینهای مجازی است. زیرا در Docker، فقط آن بخشی از سیستم عامل و کتابخانههای مورد نیاز برای اجرای برنامه در کانتینر ذخیره میشود. این باعث کاهش فضای مورد نیاز برای ذخیرهسازی میشود و امکان ایجاد و استفاده از تعداد بیشتری کانتینر را فراهم میکند.
در کل، Docker به عنودر کل، Docker و ماشینهای مجازی (VMs) به صورت متفاوت ایزولهسازی و اجرای برنامهها را فراهم میکنند. اینها تفاوتهای زیر را دارند:
- سطح ایزولهسازی: در Docker، ایزولهسازی در سطح کانتینر انجام میشود. هر کانتینر دارای محیط اجرایی جداگانه است که تمامی وابستگیها و کتابخانههای مورد نیاز برنامه درون کانتینر قرار میگیرند. اما در ماشینهای مجازی، هر ماشین مجازی دارای سیستم عامل مجزا است و به صورت جداگانه مدیریت میشود.
- سرعت و بازدهی: Docker به دلیل استفاده از ایزولهسازی سطح کانتینر، سریعتر و کمهزینهتر از ماشینهای مجازی است. زمان راهاندازی کانتینرها در Docker کمتر از ماشینهای مجازی است و مصرف منابع سختافزاری نیز کمتر است.
- حجم فضای ذخیرهسازی: در Docker، فضای ذخیرهسازی بستههای برنامه وابسته به کانتینرها کمتر از ماشینهای مجازی است. در Docker، فقط بخشی از سیستم عامل و کتابخانههای مورد نیاز برنامه در کانتینر ذخیره میشوند که به کاهش فضای مورد نیاز برای ذخیرهسازی منجر میشود.
در کل، Docker امکانهایی مشابه ماشینهای مجازی را فراهم میکند، اما با سرعت و کارایی بالاتر و مصرف منابع کمتر.
Docker چگونه منابع سختافزاری را کمتر مصرف میکند؟
داکر به عنوان یک پلتفرم مجازیسازی سطح کانتینر، با بهرهگیری از تکنولوژیهای خاص، منابع سختافزاری را بهینهتر استفاده میکند و به کمک موارد زیر میتواند مصرف منابع سختافزاری را کاهش دهد:
۱. اشتراک منابع: یکی از قابلیتهای اصلی داکر اشتراک منابع است. با استفاده از تکنولوژیهایی مانند cgroups و namespaces، داکر به چندین کانتینر اجازه میدهد که روی یک هسته سیستم عامل به طور همزمان اجرا شوند و با هم منابع سیستم عامل (مانند پردازنده، حافظه و دیسک) را به اشتراک بگذارند. این باعث میشود که نیاز به اجرای سیستم عامل جداگانه برای هر کانتینر از بین برود و منجر به صرفهجویی در مصرف منابع میشود.
۲. سرعت راهاندازی: به دلیل استفاده از ساختار سبک و سریع کانتینرها، زمان راهاندازی کانتینرها در داکر بسیار کمتر از ماشینهای مجازی است. این به این معنی است که برای راهاندازی یک برنامه با داکر، نیازی به اجرای یک سیستم عامل جداگانه نیست و تنها زمان کمی برای شروع کانتینر لازم است. این کاهش زمان راهاندازی منجر به بهینهسازی مصرف منابع سختافزاری میشود.
۳. حجم فضای ذخیرهسازی: در داکر، بستههای برنامه وابسته به کانتینرها به صورت لایهها (layers) ذخیره میشوند. لایهها به صورت مشترک بهرهگیری میکنند و تکراری نیستند. این به معنی این است که اگر چند کانتینر از یک لایه مشترک استفاده کنند، فقط یک نسخه از آن لایه در سیستم ذخیره میشود. این روش باعث کاهش فضای مورد نیاز برای ذخیرهسازی میشود و امکان ایجاد و استفاده از تعداد بیشتری کانتینر را فراهم میکند.
۴. مدیریت منابع: داکر امکانات مدیریتی را فراهم میکند که به شما امکان میدهد منابع سختافزاری مورد استفاده توسط کانتینرها را محدود کنید.با استفاده از دستورات و تنظیمات مربوطه در داکر، میتوانید میزان منابع سختافزاری مورد استفاده توسط کانتینرها را کنترل کنید. به عنوان مثال، میتوانید محدودیتهای مربوط به پردازنده (CPU) و حافظه (RAM) را تعیین کنید.
برای محدود کردن استفاده از پردازنده، میتوانید از دستور --cpus
استفاده کنید. برای مثال، با اجرای دستور زیر، کانتینر تنها میتواند حداکثر ۰.۵ واحد پردازنده را استفاده کند:
docker run --cpus 0.5 my-container
همچنین، میتوانید حداکثر میزان حافظه مصرفی توسط کانتینر را با استفاده از دستور --memory
محدود کنید. برای مثال، با اجرای دستور زیر، کانتینر تنها میتواند حداکثر ۵۱۲ مگابایت حافظه را استفاده کند:
docker run --memory 512m my-container
همچنین، میتوانید محدودیتهای بیشتری را برای منابع دیگر مانند حجم دیسک و پهنای باند شبکه اعمال کنید.
با استفاده از این نکات و تنظیمات مربوطه، میتوانید مصرف منابع سختافزاری را در داکر بهینهتر کنید و بیشترین استفاده ممکن را از آنها ببرید.
نتیجه گیری
داکر یک ابزار اوپن سورس با قابلیتهای بسیار بالا برای طراحی و ساخت برنامهها با استفاده از کانتینر است. کانتینر به برنامهنویس کمک میکند تا پروژه خود را به همراه تمامی اجزا و وابستگیهای آن را به صورت یک بسته درآورده و تحویل دهد. با استفاده از این تکنیک، برنامهنویس میتواند اطمینان حاصل کند که پروژه او بدون نیاز به تنظیمات و ابزارهای خاص، در سیستمهای مختلف به درستی اجرا میشود.
داکر یک ابزار متن باز است که برای ساخت و مدیریت کانتینرها استفاده میشود. این ابزار قابلیتهای مجازیسازی سطح سیستم عامل را به کاربران ارائه میدهد، اما بازدهی بهتری نسبت به ماشینهای مجازی دارد. به عبارت دیگر، داکر به شما امکان میدهد برنامهها را در کانتینرهای جداگانه و مستقل اجرا کنید که محیطی مشابه با ماشینهای مجازی ایجاد میکنند، اما سبکتر و کمهزینهتر هستند.
اگر قبلاً تجربه استفاده از داکر را داشتهاید، خوشحال میشویم اگر تجربیات و نکات خود را با ما و سایر کاربران به اشتراک بگذارید.