داکر

**داکر** () برنامه‌ای رایانه‌ای و ابزاری است که ایجاد، توسعه و اجرای اپلیکیشن‌ها را با استفاده از کانتینر (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. را برای سیستم خود دانلود کرده و به صورت دستی نصب کنید. برای این کار:

۱. به `` بروید و نگارش اوبونتوی خود را انتخاب کنید و سپس به `pool/stable` بروید و از میان `amd64 یا armhf یا arm64` انتخاب کنید و فایل با پسوند deb. را برای نگارش موتور داکر دلخواه خود برای نصب، انتخاب کنید.

۲. موتور داکر را نصب کنید و مسیر کد زیر را به مسیری که بسته مربوط به موتور داکر را دانلود کرده‌اید تغییر دهید:
```bash
$ sudo dpkg -i /path/to/package.deb
```
Daemon داکر به طور خودکار شروع به کار خواهد کرد.

۳. با فرمان زیر بررسی کنید که موتور داکر به درستی نصب شده:
```bash
$ sudo docker run hello-world
```
فرمان بالا باعث می‌شود که داکر، یک Image تست دانلود کرده و آن را در کانتینر اجرا کند. این برنامه عبارت Hello World را چاپ می‌کند.

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

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

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

در زیر یک dockerfile نمونه به همراه توضیحات آن آمده است:
```docker
# 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 اساساً سه مرحله پردازش دارد:

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

۲. سرویس‌هایی که اپلیکیشن شما را در `docker-compose.yml` درست می‌کنند را تعریف کنید. در نتیجه آن‌ها می‌توانند همراه هم در محیطی جداگانه و ایزوله اجرا شوند.

۳. `docker-compose up` را اجرا کنید و Compose شروع به کار می‌کند. در نهایت کل محیط اپلیکیشن شما را اجرا می‌کند.
فایل `docker-compose up` شبیه این است:
```yaml
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: {}
```
برای مطالعه بیشتر در مورد Compose file این لینک را مشاهده کنید. 

برای نصب Docker Compose از دستور زیر استفاده کنید:
```bash
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) فعال و حداقل یک گره مدیر برای مدیریت بهینه منابع گره‌های دیگر و اطمینان‌دهی از بهینگی فعالیت کلاستر وجود دارد.

به طور خلاصه و به زبان ساده تر می توان گفت :Docker Swarm ابزاریست که به شما این امکان را می‌دهد تا چندین سرور یا ماشین مختلف را به یک گروه بزرگتر به نام خوشه (Cluster) تبدیل کنید. این خوشه به شما کمک می‌کند که برنامه‌ها و کانتینرها را به‌طور خودکار و به صورت هماهنگ بین سرورهای مختلف پخش و مدیریت کنید. به طور ساده، Docker Swarm به شما این امکان را می‌دهد که بار کاری یک برنامه را بین چندین سرور تقسیم کنید، و به‌طور اتوماتیک کانتینرها بر روی این سرورها توزیع شود تا برنامه به راحتی مقیاس‌پذیر و کارا باشد.

## جستارهای وابسته
* تحویل پیوسته

## منابع

* 

## پیوند به بیرون
* 

رده:امنیت سیستم‌عامل
رده:فناوری‌های سیستم‌عامل
رده:نرم‌افزار آزاد
رده:نرم‌افزارهای ۲۰۱۳ (میلادی)
رده:نرم‌افزارهای مجازی‌سازی
رده:نرم‌افزارهای مجازی‌سازی آزاد
رده:نرم‌افزارهای مرتبط با مجازی‌سازی لینوکس
رده:نرم‌افزارهایی که از پروانه آپاچی استفاده می‌کنند