داکر (Docker) یک ابزار یا نرم افزار است که به شما امکان ساخت، بررسی و پیادهسازی برنامه ها یا Application ها را میدهد. داکر (Docker)، نرم افزار ها را به صورت پکیج هایی در واحد هایی استاندارد که به آنها کانتینر (Container) گفته میشود، نگهداری میکند. این کانتینر ها (Container) شامل تمام چیزهایی میباشند که برای اجرای یک نرم افزار مورد نیاز میباشند مانند؛ کتابخوانه ها، ابزارهای سیستمی، کدهای برنامه و دستورات اجرای آن. با استفاده از داکر (Docker)، میتوانید برنامه های خود را در هر محیطی پیادهسازی کرده و از اجرای آن به طور صحیح مطمئن شوید.
به صورت کلی میتوان داکر (Docker) را به عنوان یک ابزار مجازیسازی در نظر گرفت که در آن، به جای ایجاد محیط مجازی سازی شده و نصب یک سیستم عامل بر روی آن، به اپلیکشین ها اجازه اشتراک گذاری kernel در سیستم عامل را در میدهد. این طراحی باعث سبک شدن، عملکرد سریع و portable شدن کانتینر ها (Container)، در حالی که هر کدام در یک محیط ایزوله جدا از یکدیگر در حال فعالیت میباشند، میشود.
داکر (Docker) با زبان برنامه نویسی Go نوشته شده است، از سیستم عامل های مختلف مانند ویندوز، مک و لینوکس پشتیبانی میکند، از مشکلات تداخل میان کدهای در حال اجزا با جداسازی آنها جلوگیری میکند و بر خلاف باقی ابزار های مجازی سازی مانند VMware، داکر (Docker) عملیات خود را بر روی سیستم عامل انجام میدهد.
مقایسه شرایط انجام عملیات، قبل و بعد استفاده از Docker
بدون استفاده از داکر (Docker) با مشکلات مختلفی مانند مشکل در پیادهسازی برنامه ها در محیط های مجازی سازی، مشکل در پیکربندی آنها،مشکل در فراهم کردن پیشنیاز های آنها و… مواجه میشویم.

اما راه حل داکر (Docker) برای حل کردن این موضوع چیست؟
داکر (Docker) از طریق بهینه سازی محیط های اجرای برنامه ها و با ساخت تمامی بخش های برنامه و پیشنیاز های آن در کانتینتر ها (Container)، این مشکل را برطرف میکند.
داکر (Docker) قابلیت portable شدن را به برنامه ها اضافه میکند و به آنها اجازه میدهد تا بتوانند در محیط های مختلف و بدون نیاز به پیکربندی مجدد، اجرا شوند.
همچنین باعث ثبات در برنامه ها میشود تا برنامه در حالت های توسعه، بررسی و تست و در ارائه محصول نهائی، رفتار یکسانی داشته باشد.
سبک یا lightweight شدن برنامه یکی دیگر از ویژگی هایی است که داکر (Docker) در برنامه ما ایجاد میکند.
همچنین داکر (Docker) باعث افزایش کارایی و توسعه پذیری آن میشود و باعث ایجاد اطمینان در مصرف منابع سرویس، اجرای سریع و پیادهسازی در سرویس های دیگر میشود.

اجزاء داکر (Docker)
- موتور داکر یا Docker Engine: موتور داکر، بخش مرکزی آن میباشد که ساخت و مدیریت کانتینر ها (Container) به عهده آن میباشد.
- Docker Image: این فایل، یک فایل read-only شامل الگوهایی میباشد که برای ساخت کانتینتر ها (Container)، ایجاد تدام در اجرای کدها و فراهم سازی نیاز ها استفاده میشود.
- Docker Hub: یک سرویس ابری میباشد که میتوان از طریق آن، برای اشتراک گذاری و یا پیدا کردن Dockar Image های مختلف استفاده کرد.
- Dockerfile: یک فایل میباشد که در آن روند ایجاد یک Image توضیح داده شده است.
- Docker Registry: یک سیستم ذخیره سازی میباشد که میتوان در آن، Docker Image ها را به صورت Private (خصوصی) و Public (عمومی) ذخیره کرد.
موتور داکر یا Docker Engine
موتور داکر (Docker Engine)، همان بخش مرکزی میباشد که به داکر (Docker) امکان اجرای کانتینر ها (Container) را میدهد. این بخش از یک ساختار کلاینت/سرور (client-server) استفاده میکند و مسئولیت ساخت، اجرا و مدیریت کانتینر ها (Container) را به عهده دارد.
- داکر دیمون (Docker Engine Daemon) بخشی است که درخواست های ارسال شده از سمت API را بررسی میکند و مدیریت Image ها، کانتینتر ها (Container) و شبکه های مختلف را به عهده دارد.
- بخش CLI مربوط به داکر (Docker) یا Docker Client، بخشی است که از طریق REST API با داکر دیمون (Docker Daemon) ارتباط برقرار میکند. این بخش، یک محیط اجرا فراهم میکند که در آن Docker Image ها درون کانتینتر ها (Container) نمونهسازی میشوند.

بدون وجود موتور داکر (Docker Engine)، Image ها قابلیت ساخته شدن و یا اجرا شدن را نخواهند داشت.
به صورت کلی روند کار موتور داکر (Docker Engine) به صورتی است که:
- بخش Client دستورات Docker را ارسال میکند.
- بخش Daemon این دستورات را دریافت کرده و عملیات مربوط به کانتینر ها را انجام میدهد.
- و در اینجا، REST API رابطی است که امکان برقراری ارتباط را میدهد.
موتور داکر (Docker Engine) پردازشی است که با برقراری ارتباط میان کلاینت داکر (Docker Client) و داکر دیمون (Docker Daemon)، امکان کانینر سازی و مدیریت آنها را فراهم میکند
Dockerfile
Dockerfile در واقع از یک زبان مخصوص دامنه (DSL – Domain Specific Language) استفاده میکند و شامل دستوراتی است که برای ساخت یک Docker Image به کار میروند. Dockerfile مشخص میکند که فرایند تولید Image چگونه و با چه مراحلی باید انجام شود. هنگام ساخت یک برنامه، لازم است Dockerfile را به ترتیب صحیح بنویسید، زیرا داکر دیمون (Docker Daemon) تمامی دستورات موجود در آن را از بالا به پایین اجرا میکند.
داکرفایل در حقیقت حکم سورس کد (Source Code) اصلی یک Image را دارد.
داکر دیمون (Docker Daemon)، که معمولاً به صورت ساده “Docker” هم خطاب میشود، یک سرویس پسزمینه است که مدیریت کانتینرهای داکر (Docker) را در سیستم بر عهده دارد.
این فایل یک سند متنی است که مجموعهای از دستورات لازم را در خود دارد و با اجرای آنها، یک Docker Image ساخته میشود. در واقع Docker Image با استفاده از Dockerfile ایجاد میگردد.

معماری و نحوه کار داکر (Docker)
داکر از یک معماری مبتنی بر کلاینت/سرور (client-server) استفاده میکند. در این ساختار، Docker Client با Docker Daemon در ارتباط است و دیمون وظیفهٔ ساخت، اجرا و توزیع کانتینرهای داکر را بر عهده دارد.
Docker Client میتواند روی همان سیستمی اجرا شود که دیمون در آن حضور دارد، یا اینکه بهصورت ریموت به Docker Daemon متصل گردد.
ارتباط بین Docker Client و Docker Daemon از طریق یک REST API صورت میگیرد که یا از طریق UNIX socket و یا از طریق شبکه در دسترس است.

Docker CLI
رابط خط فرمان داکر (Command-line Interface) ابزاری است برای تعامل مستقیم با داکر (Docker) میباشد.
از دستورات رایج و پرکاربرد این رابط میتوان این موارد را نام برد:docker run ،docker build ،docker pull
Docker REST API
این بخش، یک API مبتنی بر HTTP است که توسط Docker CLI و سایر ابزارها مورد استفاده قرار میگیرد.
این API ارتباط میان Docker Client و Docker Daemon را تسهیل میکند.
Docker Daemon
داکر دیمون مسئول مدیریت Image ها، کانتینر ها، شبکهها و Volumeها است.
این سرویس هستهٔ اصلی Docker محسوب میشود و تمام اشیای مرتبط با داکر را مدیریت میکند.
High-Level Runtime
این بخش چرخهٔ حیات کانتینرها را مدیریت میکند.
وظایف آن شامل ایجاد (create)، شروع (start)، توقف (stop) و حذف (delete) کانتینرها است.
داکر ایمیج (Docker Image)
یک Docker Image در اصل فایلی است متشکل از چندین لایه که شامل دستورات لازم برای ساخت و اجرای یک کانتینر Docker میباشد.
این Image مانند یک بستهٔ اجرایی عمل میکند و تمام موارد لازم برای اجرای یک برنامه را در خود دارد مانند: کد برنامه، Runtime، کتابخانه ها، متغیر های محیطی و تنظیمات.
نحوه کار:
- Image تعیین میکند که یک کانتینر چگونه باید ساخته شود.
- مشخص میکند که چه اجزای نرمافزاری قرار است اجرا شوند و تنظیمات آنها چگونه خواهد بود.
- زمانی که یک Image اجرا میشود، خروجی آن یک کانتینر (Container) است.
ارتباط با کانتینرها:
کانتینر داکر (Docker Container)
یک کانیتر داکر (Docker Container) در واقع نسخهای سبک، اجرایی و مستقل از یک Docker Image است.
کانتینر شامل کد برنامه به همراه تمامی وابستگی های آن بوده و در یک محیط ایزوله اجرا میشود.
کانتینرها این امکان را فراهم میکنند که برنامه ها سریعتر، سازگارتر و قابل اعتمادتر در محیطهای مختلف اجرا شوند. چه روی لپتاپ توسعهدهنده، چه روی سرورهای تست و چه در محیط تولید.
نحوه کار:
- زمانی که یک Docker Image اجرا میشود، یک کانتینر از روی آن ساخته خواهد شد.
- کانتینر به صورت یک فرایند ایزوله روی سیستم میزبان (Host Machine) اجرا میشود، اما هسته سیستم عامل میزبان را با آن به اشتراک میگذارد.
- چندین کانتینر میتوانند بهصورت همزمان روی یک سیستم اجرا شوند، بدون اینکه در عملکرد یکدیگر تداخل ایجاد کنند.
مثال:
فرض کنید یک Image از سیستمعامل Ubuntu دارید که روی آن NGINX Server نصب شده است.
وقتی این Image را با دستور docker run اجرا میکنید:
یک کانتینر ایجاد میشود و NGINX Server روی Ubuntu درون آن کانتینر اجرا خواهد شد.
Docker Hub چیست؟
Docker Hub یک سرویس ریپازیتوری مبتنی بر فضای ابری است که کاربران میتوانند داکر ایمیج (Docker Image) های خود را در آن Push کنند (بارگذاری) یا در هر زمان و از هر مکانی به کمک اینترنت آنها را Pull کنند (دریافت).
بهطور کلی، Docker Hub فرآیند یافتن و استفادهٔ مجدد از Image ها را بسیار سادهتر میکند.
این سرویس امکاناتی مانند ذخیرهسازی Image ها بهصورت خصوصی (Private) یا عمومی (Public) را فراهم میکند تا بتوانید آنها را مدیریت و با دیگران به اشتراک بگذارید.
اهمیت Docker Hub
- بیشتر تیمهای DevOps از Docker Hub بهعنوان بخشی از چرخهٔ توسعه و استقرار خود استفاده میکنند.
- یک ابزار متن باز و رایگان است و روی تمام سیستم عامل ها قابل استفاده میباشد.
- مشابه یک فضای ذخیرهسازی ابری عمل میکند که در آن Image ها را نگهداری کرده و هر زمان نیاز باشد میتوان آنها را Pull کرد.
دستورات Docker
با معرفی مجموعهای از دستورات ضروری Docker، این ابزار به نرمافزاری قدرتمند برای سادهسازی مدیریت کانتینرها تبدیل شد.
این دستورات به ایجاد یک فرآیند توسعه و استقرار یکپارچه و روان کمک میکنند.
دستورات رایج Docker:
Docker Run
برای اجرای کانتینرها از روی Image ها استفاده میشود.
در این دستور میتوان گزینههای مختلف مربوط به Runtime و تنظیمات اجرای کانتینر را نیز مشخص کرد.
Docker Pull
این دستور Image ها را از یک Container Registry مانند Docker Hub دریافت کرده و روی سیستم محلی ذخیره میکند.
Docker ps
برای نمایش کانتینرهای در حال اجرا استفاده میشود.
اطلاعات مهمی مانند Container ID، Image مورد استفاده و وضعیت کانتینر را نشان میدهد.
Docker Stop
این دستور کانتینر های در حال اجرا را متوقف میکند و فرآیندهای داخل آنها را بهصورت کنترلشده خاموش مینماید.
Docker Start
برای شروع مجدد کانتینر هایی که قبلاً متوقف شدهاند به کار میرود و عملیات آنها را از وضعیت پیشین ادامه میدهد.
Docker Login
برای ورود به Docker Registry استفاده میشود و امکان دسترسی به ریپازیتوریهای خصوصی را فراهم میکند.
موتور داکر (Docker Engine)
نرمافزاری که وظیفه میزبانی و اجرای کانتینرها را بر عهده دارد، موتور داکر یا Docker Engine نامیده میشود.
Docker Engine یک برنامه مبتنی بر معماری Client-Server است.
این موتور سه جزء اصلی دارد:
Server (Daemon)
سرور یا دیمون (Daemon) بخشی است که مسئول ایجاد و مدیریت Docker Image ها، کانتینر ها، شبکه ها و Volume ها میباشد.
این قسمت در پسزمینه اجرا میشود و هستهٔ اصلی عملیات داکر (Docker) را تشکیل میدهد.
REST API
این API مشخص میکند که برنامهها چگونه میتوانند با سرور داکر (Docker) تعامل کنند.
REST API قوانین و مسیرهایی را فراهم میکند که با استفاده از آن ها میتوان به دیمون (Daemon) فرمان داد چه وظایفی را انجام دهد.
Client (CLI)
کلاینت همان رابط خط فرمان داکر (Docker) است که با اجرای دستورات آن، امکان برقراری ارتباط با موتور داکر (Docker Engine) را فراهم میکند.
کاربران از طریق این ابزار میتوانند دستوراتی مانند ساخت Image، اجرای کانتینر و مدیریت منابع را صادر کنند.