**داکر** (انگلیسی: Docker) برنامه‌ای رایانه‌ای و ابزاری است که ایجاد، توسعه و اجرای اپلیکیشن‌ها را با استفاده از کانتینر (container) آسان می‌کند. کانتینر به توسعه‌دهندگان این امکان را می‌دهد که تمام پیش‌نیازها و نیازمندی‌های اپلیکیشن خود را برای استفاده و اجرا جمع‌آوری کنند؛ مانند کتابخانه‌ها (Libraries) و زیرساخت‌های لازم.

می‌توان گفت که داکر به توسعه‌دهندگان این اطمینان را می‌دهد که می‌توانند اپلیکیشن خود را بدون نگرانی از سیستم‌های میزبان برنامه خود در مرحله توسعه و تست و بر روی سیستم‌های مختلف، بدون هیچ‌گونه اشکال و به صورت کاملاً مشابه اجرا کنند و مشکلی از بابت تغییر سیستم‌عامل‌های اجراکننده برنامه خود نخواهند داشت.

داکر تا حدی شبیه به ماشین مجازی (Virtual Machine) است با این تفاوت که در ماشین مجازی، قسمتی از سخت‌افزار سیستم به ماشین مجازی اختصاص داده می‌شود و روی آن یک سیستم‌عامل کامل نظیر ویندوز یا لینوکس نصب می‌شود. در واقع می‌توان گفت در ماشین مجازی امکانات سخت‌افزاری سیستم تقسیم می‌شود و بر روی هر قسمت، سیستم‌عامل بخصوصی بالا می‌آید اما در داکر این‌طور نیست. در داکر امکانات سخت‌افزاری به تناسب نیاز هر کانتینر به صورت موقت اختصاص داده می‌شود و داکر این امکان را فراهم می‌آورد که اپلیکیشن‌ها برای مثال روی کرنل لینوکس اجرا شوند. در این حالت دیگر نیازی به نصب پیش‌نیازها و نیازمندی‌هایی که اپلیکیشن ما می‌خواهد و به‌طور پیش‌فرض روی سیستم وجود ندارد، نیست.

داکر ابزاری است متن‌باز (Open Source) و کدهای آن بر روی گیت‌هاب قرار دارد و هر فرد علاقه‌مند می‌تواند در توسعه آن مشارکت کند.

داکر در سال ۲۰۱۳ شروع به کار کرد و توسط شرکت داکر توسعه داده می‌شود. این سرویس به دو نوع رایگان و پولی در دسترس است.

داکر برای چه کسانی مناسب است؟
-----------------------------

داکر طراحی شده‌است تا هم به توسعه‌دهندگان نرم‌افزارها سود برساند و هم به مدیران سیستم‌ها. و امروزه به یکی از ابزارهای مهم DevOps تبدیل شده‌است. داکر باعث می‌شود که توسعه‌دهندگان تمرکز خود را روی نوشتن کد بگذارند و نگران این نباشند که در نهایت قرار است اپلیکیشن آن‌ها روی چه سیستمی اجرا شود. همچنین به آن‌ها کمک می‌کند که پروژه خود را با استفاده از برنامه‌های از پیش طراحی شده در کانتینرها آغاز کنند که به عنوان بخشی از اپلیکیشن آن‌ها استفاده خواهد شد. ضمناً باعث انعطاف عمل تیم عملیات (Operation) شده و نیاز به سیستم‌های مورد نیاز را کم‌تر می‌کند.

کانتینر (Container)
-------------------

کانتینر، یک واحد استاندارد نرم‌افزار است که کدها و تمام نیازمندی‌های آن را جهت اجرا و توسعه اپلیکیشن‌ها، تجمیع می‌کند و باعث می‌شود که این اجرا به‌طور سریع و قابل اعتماد انجام شود. کانتینرها، نرم‌افزار را از محیط خودش ایزوله می‌کنند و اطمینان می‌دهند که علی‌رغم تفاوت‌های احتمالی در سیستم‌های میزبان، نرم‌افزار به طرز مشابه و یکسان اجرا خواهد شد.

کانتینرهای داکر قسمتی از نرم‌افزار را در یک سیستم فایل کامل تعبیه می‌کند. به صورتی که شامل هر آنچه جهت اجرا شدن (مانند کد زمان اجرا، ابزارهای سیستم و تنظیمات سیستم) لازم است و هر آنچه که می‌تواند بر روی یک سرور نصب شود می‌باشد. این امر اجرای برنامه را به صورت ثابت در هر نوع محیطی تضمین می‌کند.

به‌طور کلی می‌توان گفت داکر این قابلیت را به ما می‌دهد تا یک اپلیکیشن را در یک محیط ایزوله به نام کانتینر (Container) اجرا کنیم. ایزوله بودن و امنیت کانتینرها باعث می‌شود که بتوانیم تعداد زیادی کانتینر را روی ماشین میزبان اجرا کنیم. کانتینرها سبک و سریع هستند زیرا نیازی ندارند که مانند ماشین‌های مجازی سربار Hypervisor را به ماشین تحمیل کنند و مستقیماً روی هسته (Kernel) کامپیوتر سرویس‌دهنده اجرا می‌شوند. این بدان معناست که می‌توان تعداد بیشتری کانتینر را روی یک ماشین نسبت به حالتی که از ماشین مجازی استفاده می‌کنیم اجرا کرد. البته حتی این قابلیت را نیز داریم که از داکر درون ماشین مجازی نیز استفاده کنیم.

Container یک نمونه قابل اجرای یک Image است. می‌توان یک کانتینر را به وسیله Docker API یا کلاینت ایجاد، اجرا، حذف یا متوقف کرد.

معمولاً کانتینرها از دیگر کانتینرهای در حال اجرا به خوبی ایزوله می‌شوند. شما می‌توانید میزان ایزوله بودن کانتینرها را در مواردی مانند دسترسی شبکه‌ای، حافظه مورد استفاده آن‌ها و سیستم‌های پایه‌ای مورد استفاده‌شان تنظیم کنید.

یک کانتینر در واقع با Image آن و همهٔ تنظیماتی که در زمان اجرای آن انجام می‌دهید تعریف می‌شود. هنگامی که کانتینر حذف می‌شود، هر تغییر فایلی که در آن به وجود آمده از بین می‌رود.

Docker Container Image
----------------------

Docker Container Image یک پکیج نرم‌افزاری سبک، خوداتکا (Stand-alone) و قابل اجراست. Imageها حاوی تمامی نیازمندی‌های اپلیکیشن برای اجرا مانند کدها، ابزارهای سیستمی، کتابخانه‌ها (Libraries) و تنظیمات سیستمی هستند. Image‌ها در زمان اجرا تبدیل به کانتینر شده و روی Docker engine اجرا می‌شوند. Image‌ها برای هر دو نوعِ اپلیکیشن‌های بر پایهٔ لینوکس و ویندوز در دسترس هستند. containerized شدن این نرم‌افزارها همیشه به صورت کاملاً مشابه و یکسان، بدون در نظرگرفتن زیرساخت، انجام می‌شود.

یک Image در واقع یک Read-Only Template حاوی دستوراتی برای ساخت یک کانتینر داکر است. معمولاً استفاده ما از Imageها به این‌صورت است که با تغییر یک Image, Image دیگری را که برای ما مناسب‌تر است می‌سازیم؛ مثلاً می‌توانیم Image ای بسازیم که برپایه Image اوبونتو است اما یک سرور Apache نیز روی آن نصب می‌شود. شما می‌توانید از Imageهای آماده استفاده کنید یا Image مناسب خود را بسازید. برای ساختن Image جدید کافی است یک Dockerfile ساده بسازید که در آن دستوراتی برای نشان‌دادن چگونگی ساختن و اجرا کردن Image موجود است. وقتی که Dockerfile خود را تغییر می‌دهیم و Image جدیدی می‌سازیم، تنها بخش‌های جدید دوباره ساخته می‌شوند و این یکی از دلایل عمده سرعت و عملکرد بهتر داکر نسبت به بقیه فناوری‌های شبیه‌سازی (Virtualization) است.

موتور داکر (Docker Engine)
--------------------------

موتور داکر یک تکنولوژی Containerize برای ساختن و اجرای کانتینر اپلیکیشن‌هاست. این موتور اعمال خود را به عنوان یک اپلیکیشن کلاینت-سرور انجام می‌دهد با:

* یک سرور که نوعی نرم‌افزار با مدت زمان اجرای طولانی است که به آن پروسه Daemon گفته می‌شود.
* یک REST API که واسط کاربری نرم‌افزارها برای ارتباط و دادن دستورات به Daemon است.
* یک کلاینت خط فرمان یا (Command Line Interface (CLI

کلاینت از APIهای داکر برای کنترل و تعامل با Daemon استفاده می‌کند. این استفاده از طریق اسکریپت‌ها یا فرمان‌های مستقیم کلاینت انجام می‌شود. Daemon وظیفه دارد که اشیای داکر مانند Imageها، Containerها، شبکه‌ها و Volumeها را ایجاد و مدیریت کند.

تفاوت داکر و ماشین مجازی
------------------------

یک کانتینر به صورت native روی لینوکس اجرا می‌شود و به صورت مشترک با سیستم‌عامل از کرنل استفاده می‌کند. کانتینر یک فرایند مجزا را اجرا می‌کند و مانند یک فرایند معمولی حجم کمی از RAM را می‌گیرد. در مقابل، ماشین مجازی یا همان VM یک سیستم‌عامل کامل مجازی guest را با دسترسی مجازی و شبیه‌سازی شده به منابع اصلی سیستم، توسط یک hypervisor اجرا می‌کند. ماشین‌های مجازی مقدار بسیار زیادی سربار نسبت به حجم فرایند مورد نیاز ما برای سیستم ایجاد می‌کنند.

نصب داکر
--------

برای نصب داکر راه‌های مختلفی وجود دارد. بهترین روش آنست که بسته docker را از مخزن اصلی توزیع لینوکس مورد استفاده خود دریافت و آن را با استفاده از مدیر بسته (Package Manager) مربوط روی سیستم‌عامل خود نصب کنید.

در اینجا اسکریپت‌های ارائه شده توسط سایت داکر را توضیح می‌دهیم. این اسکریپت‌ها برای نصب داکر روی اوبونتو است. محتوای کامل نحوه نصب در سایت داکر قرار دارد و محتوای این نوشته هم در این لینک است که توصیه می‌شود آن را مطالعه کنید. برای نصب سه راه وجود دارد:

* نصب از طریق مخزن اصلی داکر
* دانلود DEB Package و نصب دستی آن
* نصب از طریق اسکریپت‌های convenience

در این نوشته راه دوم ارائه می‌شود. اگر نمی‌توانید نصب را با راه اول انجام دهید این راه را امتحان کنید. ابتدا فایل deb. را برای سیستم خود دانلود کرده و به صورت دستی نصب کنید. برای این کار:

۱. به `https://download.docker.com/linux/ubuntu/dists` بروید و نگارش اوبونتوی خود را انتخاب کنید و سپس به `pool/stable` بروید و از میان `amd64 یا armhf یا arm64` انتخاب کنید و فایل با پسوند deb. را برای نگارش موتور داکر دلخواه خود برای نصب، انتخاب کنید.

۲. موتور داکر را نصب کنید و مسیر کد زیر را به مسیری که بسته مربوط به موتور داکر را دانلود کرده‌اید تغییر دهید:

```
$ sudo dpkg -i /path/to/package.deb

```
Daemon داکر به‌طور خودکار شروع به کار خواهد کرد.
۳. با فرمان زیر بررسی کنید که موتور داکر به درستی نصب شده:

```
$ sudo docker run hello-world

```
فرمان بالا باعث می‌شود که داکر، یک Image تست دانلود کرده و آن را در کانتینر اجرا کند. این برنامه عبارت Hello World را چاپ می‌کند.

الان موتور داکر نصب شده و در حال اجراست. docker group ایجاد شده اما کاربری به آن اضافه نشده. شما برای اجرای فرمان‌های داکر نیاز دارید تا از دسترسی مدیر سیستم (sudo) استفاده کنید. برای دیدن مراحل بعد از نصب به پیوندی که در ابتدای این بخش قرار داده شد مراجعه کنید.

چگونه باید اپلیکیشن خود را به یک کانتینر اضافه کنیم؟
----------------------------------------------------

زمانی که شما container مورد نظر خودتان را پیدا کردید قطعاً می‌خواهید آن را به دلخواه خود تغییر دهید و نیازمندی‌های اپلیکیشن خود را به آن اضافه کنید. اینجا جایی است که Dockerfile مورد استفاده قرار می‌گیرد.

داکر فایل مشخص می‌کند که کانتینر شما چگونه باشد، یعنی از چه Image ای به عنوان پایه استفاده کند و چه تغییراتی روی آن اعمال کند و هنگام اجرا چه دستوراتی را اجرا کند.

در زیر یک dockerfile نمونه به همراه توضیحات آن آمده‌است:

```
 # Use the official Node.js runtime as a base image
 FROM node:alpine

 # Set the directory of my web application to /app
 WORKDIR /app

 # Copy over my project’s directory into the container /app folder
 Add. /app

 # Install all the dependencies for my web application
 RUN yarn install

 # Make the port 3000 accessible outside of Docker
 EXPOSE 3000

 # Execute the command yarn start
 CMD ["yarn", "start"]

```
از روی این داکر فایل یک Image جدید ساخته شده و اجرا می‌شود. می‌توان از روی یک Image که در اینجا به صورت داکر فایل است هر تعدادی Container ساخت. با ساختن یک Image که تنظیمات شخصی خود را روی آن اعمال می‌کنیم، می‌توانیم هر بار یک کانتینر با تنظیمات شخصی‌سازی‌شده را بدون دوباره‌کاری اجرا کنیم.

Docker Compose
--------------

Compose ابزاری است برای تعریف و اجرای مالتی-کانتینر اپلیکیشن‌های داکر است. به وسیلهٔ Compose شما می‌توانید از یک فایل YAML استفاده کنید تا بتوانید سرویس اپلیکیشن خود را پیکربندی (Configure) کنید. سپس فقط با استفاده از یک کامند می‌توانید تمام سرویس‌های خود را بر اساس پیکربندی دلخواه خود ایجاد و فعال کنید. برای مطالعه بیشتر در مورد تمام ویژگی‌های Compose این لینک را مشاهده کنید.

Compose در تمام محیط‌ها کار می‌کند؛ برای مثال مراحل تولید، Staging، توسعه، تست و همچنین CI Workflows.

استفاده از Compose اساساً سه مرحله پردازش دارد:

1. محیط اپلیکیشن خود با داکر فایل تعریف کنید که باعث می‌شود در هر سیستم و محیطی خود را از ابتدا بازتولید کند.
2. سرویس‌هایی که اپلیکیشن شما را در `docker-compose.yml` درست می‌کنند را تعریف کنید. در نتیجه آن‌ها می‌توانند همراه هم در محیطی جداگانه و ایزوله اجرا شوند.
3. `docker-compose up` را اجرا کنید و Compose شروع به کار می‌کند. در نهایت کل محیط اپلیکیشن شما را اجرا می‌کند.

فایل `docker-compose up` شبیه این است:

```
version: "3.9" # optional since v1.27.0
services:
 web:
 build: .
 ports:
 - "5000:5000"
 volumes:
 - .:/code
 - logvolume01:/var/log
 links:
 - redis
 redis:
 image: redis
volumes:
 logvolume01: {}

```
برای نصب Docker Compose از دستور زیر استفاده کنید:

```
sudo apt install docker-compose

```

Docker Hub
----------

داکر هاب، سرویس ارائه شدهٔ شرکت Docker، مخزنی از imageهای آمادهٔ داکر است. در این مخزن هزاران برنامه وجود دارد که می‌توان به آن image افزود.

هر فردی می‌تواند imageهای خود را با دیگران به اشتراک بگذارد. برای این کار می‌بایست مخزنی در Docker Hub ایجاد کنید. البته برای دریافت imageها نیازی به ایجاد حساب و داشتن مخزن شخصی نیست ولی برای اصلاح و ارسال فایل، باید حساب ساخت.

Docker Swarm
------------

**Docker Swarm چیست؟** یک Docker Swarm گروهی از ماشین‌های مجازی یا فیزیکی است که اپلیکیشن داکر را اجرا می‌کنند و همچنین برای پیوستن به همدیگر در یک دسته (خوشه یا Cluster) پیکربندی (Configuration) می‌شوند. وقتی گروهی از ماشین‌ها با هم کلاستر می‌شوند شما می‌توانید فرمان‌های داکر را که مورد استفاده شماست همچنان استفاده کنید، اما آن‌ها الان دیگر توسط ماشین‌های کلاستر شما اجرا می‌شوند. فعالیت کلاستر تحت کنترل Swarm Manager است و ماشین‌هایی که به کلاستر می‌پیوندند به عنوان یک گره گراف یا Node به حساب می‌آیند.

**استفاده Docker Swarm برای چیست؟** Docker Swarm ابزاری است برای تنظیم ارتباط کانتینرها و ماشین‌های میزبان حاضر در یک خوشه. به معنای دیگر Docker Swarm به کاربر این امکان را می‌دهد که چند کانتینر را که روی چند ماشین میزبان توسعه‌داده شده مدیریت کند.

یکی از مزیت‌های کار با Docker Swarm، دسترسی بالای آن روی اپلیکیشن‌هاست. در یک Docker Swarm به لحاظ نوعی، چندین گره (Node) فعال و حداقل یک گره مدیر برای مدیریت بهینه منابع گره‌های دیگر و اطمینان‌دهی از بهینگی فعالیت کلاستر وجود دارد.

جستارهای وابسته
---------------

* تحویل پیوسته

منابع
-----

1. ↑  "Docker Engine release notes".
2. ↑  "Opensource.com". *Opensource.com* (به انگلیسی). Retrieved 2020-12-14.
3. ↑  "Opensource.com". *Opensource.com* (به انگلیسی). Retrieved 2020-12-14.
4. ↑  "Empowering App Development for Developers | Docker". *www.docker.com* (به انگلیسی). Retrieved 2020-12-14.
5. ↑  آشنایی با مفهوم Container. «داکر چیست». *linux.tosinso.com*. دریافت‌شده در ۲۰۲۳-۰۴-۱۴.
6. ↑  "mostafaghadimi/web\_workshop". *GitHub* (به انگلیسی). Retrieved 2020-12-14.
7. ↑  "mostafaghadimi/web\_workshop". *GitHub* (به انگلیسی). Retrieved 2020-12-14.
8. ↑  "Empowering App Development for Developers | Docker". *www.docker.com* (به انگلیسی). Retrieved 2020-12-14.
9. ↑  "mostafaghadimi/web\_workshop". *GitHub* (به انگلیسی). Retrieved 2020-12-14.
10. ↑  "Empowering App Development for Developers | Docker". *www.docker.com* (به انگلیسی). Retrieved 2020-12-14.
11. ↑  "Empowering App Development for Developers | Docker". *www.docker.com* (به انگلیسی). Retrieved 2020-12-14.
12. ↑  "mostafaghadimi/web\_workshop". *GitHub* (به انگلیسی). Retrieved 2020-12-14.
13. ↑  "Docker Guide". *Docker Guide* (به انگلیسی). 2021-04-25. Archived from the original on 25 April 2021. Retrieved 2021-04-25.
14. ↑  "Docker Documentation". *Docker Documentation* (به انگلیسی). 2020-12-18. Retrieved 2020-12-20.
15. ↑  «Cloud Log Management, Monitoring, SIEM Tools». *Sumo Logic* (به انگلیسی). دریافت‌شده در ۲۰۲۰-۱۲-۲۰.

* مشارکت‌کنندگان ویکی‌پدیا. «Docker (software)». در *دانشنامهٔ ویکی‌پدیای انگلیسی*، بازبینی‌شده در ۱۴ مارس ۲۰۱۵.

پیوند به بیرون
--------------

* وبگاه رسمی