Docker چیست و چگونه می توان با آن کار کرد؟

 

Docker

در این مقاله قصد دارم Docker را به شما معرفی کنم و یاد خواهید گرفت که چگونه آن را نصب، راه اندازی و مورد استفاده قرار دهید.قبل از معرفی کامل داکر چند چیز را باید خوب بدانیم. این که کانتینرها چه هستند و به ما چه قابلیتی می دهند، سپس باید بفهمیم سیستم های توزیع پذیر چه کمکی می توانند به ما بکنند و چه فرقی با ویرچوآل ماشین دارند . در کل تعریف و تشریح داکر و سیستم های مدیریت کانتینر بسیار سخت است و لازم می دانم قبل از ورود به بحث کمی آمادگی ذهنی به شما بدهم

فرض کنید بر روی سرور شما یک سیستم عامل لینوکس نصب شده و شما می خواهید چند اپلیکیشن و یا سرویس را در یک سرور راه اندازی کنید که ممکن است سرور شما را دچار زحمت کند . اولین راه حل این است که یک VM بر روی سرور بالا بیاورید و یک سیستم عامل بر روی آن نصب کنید و سرویس خود را بر روی آن بالا بیاورید.

خوب این راه حل نسبتا خوبی است اما ریسورس شما را به شدت درگیر نگهداری VM میکند. برای حل این مشکل تفکری به اسم کانتینر را مطرح کردند که با استفاده از هسته یا همان کرنل لینوکس میتوان یک سیستم عامل دیگر را در قالب یک کانتینر هندل کرد .این به ما کمک می کند از یک کرنل واحد استفاده کنیم بی آن که از ریسورس بی جهت استفاده کنیم . با این تفکر میتوان یک اپلیکیشن یا سرویس را چند تا چند تا و به صورت توزیع در یک سیستم عامل یا یک سیستم Distributed تجربه کرد .

درگذشته شاید هر کس فکر می کرد می خواهد از سیستم های Cloud استفاده کند ، نا خود آگاه به سمت OpenStak یا سایت هایی مانند Heroku و Openshift و … می رفتند.اما امروزه داکر دنیای نرم افزاری را به فکر وادار کرده . این تفکر توانسته تمامی کمپانی های بزگ مانند RedHat, Amazon, Google, SoundCloud, RedHat, Amazon, Google, SoundCloud, DigitalOcean, Spotify, NETFLIX, و… را دچار تغییرات بسیاری کند و آن ها را وادار به کانتریبیوت و توسعه هر چه بیشترش بنماید. در ایران نیز شرکت های بزرگی مانند CoffeBazar, QuizOfKings, TeleWebion , Tapsell و بسیاری دیگر پروژه های خود را بر پایه کانتینر منیجرهایی مانند Docker پیاده سازی کرده و بر روی آن حساب ویژه ای باز کرده اند.

داکر (Docker)

در کل Docker یک سیستم متن باز برای ساخت اپلیکیشن های توزیع شده و راه اندازی سرویس های مبتنی بر لینوکس است.

همچنین یک توسعه دهنده توسط داکر می توانید اپلیکیشن های خود را سریع و راحت منتشر کند.

Docker

Docker به صورتی عمل می کند که عملیات بسته بندی، حمل و توسعه هر اپلیکیشن را بطور خودکار انجام دهد. به این معنی که کل اپلیکیشن را در قالب یک کانتیتر قرار میگیرد و قابل حمل بر روی دیگر سرور هاست . این عامل کمک میکند در زمان و سرعت دیپلوی کردن و راه اندازی و امنیت جابه جایی پروژه برنامه نویس یا ادمین، آسوده خاطر شود. در کل منظور از امنیت این است که اپلیکیشن های ما در هر کانتینر به صورت جداگانه و بدون هیج دسترسی به هم به صورت موازی فعالیت می کنند . مگر آن که آن ها را به هم لینک کرده یا از سرویس های ارائه شده آن ها استفاده کنیم. امنیت داکر با خود کرنل و آپی تیبل لینوکس تضمین می شود . اگر همه چیز در پروژه و رول های آپی تیبل رعایت شود ، خطر بسیار کمی شما را تحدید می کند.

داکر نگاه نمیکند و ببیند سرور شما از چه سیستم عاملی استفاده میکنه بلکه خودش رو با سیستم عاملتون وقف می دهد. حتی اگه ویندوز یا مک باشید. این را اضافه کنم که داکر هیچ سیستم عامل جدیدی ایجاد نمی کند بلکه این امکان را به بسته نرم افزاری ایجاد شده می دهد که از Kernel اصلی سیستم عاملی که بر روی آن نصب شده است استفاده نماید و در زمان انتقال نیز فقط Package نرم افزاری منتقل می شود نه ماشین مجازی(این برای سرور های ویندوزی صدق نمیکند.) ، در واقع Docker Engine یا موتور اصلی Docker جایگزین نرم افزار Hypervisor می شود و اینکار باعث می گردد که کارایی سیستم ما به شدت افزایش یابد زیرا یک لایه واسط به نام Hypervisor حذف شده و نرم افزار بصورت مستقیم با هسته اصلی سیستم عامل لینوکس کار میکند با این تفاوت که کاملا ایزوله شده است.

Docker

داکر Open Source است (متن باز)، بدین معنی که هر کسی می تواند Docker را تهیه و استفاده و توسعه دهد و قابلیت های جدیدی به آن اضافه کند و حتی یک پروژه مبتنی بر داکر ارائه دهد Kubernetes.

بسیاری از پروژه های در حال توسعه دچار دو دلی شده اند که بر روی این پلتفرم سرمایه گذاری کنند یا خیر؟ اما به عقیده بنده وقتی گوگل بزرگترین پروژه کلود تاریخ Kubernetes را بر روی داکر و تفکر کانتینرایز کردن برده است ، دلیلی برای دو دلی نمی ماند.

راه اندازی Docker در لینوکس

توجه داشته باشین ممکن است در تمامی فرایندهای نصب یا استفاده با خطایی ۴۰۳ که مربوط به تحریم های کشور آمریکا می باشد مواجه شود که می بایست به نحوی آن را دور بزنید . همچنین داکر در حال حاضر دو نسخه اینترپرایز و کامیونیتی دارد که ما در تمامی مراحل نسخه کامیونیتی پایدار آن را نصب و راه اندازی می کنیم.

CentOS

اگر از نسخه ۷ این دیستریبیوشن بهره می برید، لازم نیست تمامی مراحل را سپری کنید و فقط لازم است از آخرین مرحله استفاده کنید.

برای نصب می بایست ابتدا آدرس ریپازیتوری مربوط به داکر را به پکیج منیجر افزوده و آن را نصب کنید.

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum install docker-ce

هم اکنون داکر نصب شد و برای راه اندازی آن از دستور زیر استفاده نمایید :

sudo systemctl start docker

اگر به هر دلیل موفق به نصب نشدید از این آدرس فایل مربوط به سیستم عاملتان را دانلود کنید و با کامند زیر نصب کنید

sudo yum install -y AddressOfDockerFileThatYouDownload.rpm

و یا

sudo rpm -U AddressOfDockerFileThatYouDownload.rpm
Fedora-V25

sudo dnf install -y docker-ce

همکنون داکر نصب شد و برای راه اندازی آن از دستور زیر استفاده نمایید :

sudo systemctl start docker
Debian-V8

با دستور زیر به راحتی داکر را نصب کنید:

sudo apt-get update
sudo apt-get install docker-ce

همکنون داکر نصب شد و برای راه اندازی آن از دستور زیر استفاده نمایید :

sudo systemctl start docker
Ubuntu-V16

با دستور زیر به راحتی داکر را نصب کنید:

sudo apt-get update
sudo apt install docker-ce

همکنون داکر نصب شد و برای راه اندازی آن از دستور زیر استفاده نمایید :

sudo systemctl start docker

برای نصب بر روی نسخه هایی که قادر به استفاده از پکیج منیجر نیستند می بایست فایل قابل نصب ان را از آدرس دانلود و سپس با دستورات زیر آن را نصب کنند:

tar xzvf /path/to/dockerXXXX.tar.gz
sudo cp docker/* /usr/bin
sudo dockerd

برای اینکه بدانید داکر نصب شده یا خیر بهترین راه استفاده از کامند زیر است :

sudo docker --version

داکر به هر ترتیب می بایست بر روی لینوکس راه اندازی شود و بر روی سیستم عامل های با کرنل غیر لینوکسی کار نمی کند . بنابر این شرایط را به نحوی در آن ها پیاده سازی و راه اندازی می کنند تا یک کرنل لینوکس در آن ها قرار داشته باشد و آن هم استفاده از یک vm و یک لینوکس آماده استفاده برای داکر است که آن را Docker-machine می نامند. در این مقاله نصب بر روی سه سیستم عامل معروف غیر لینوکسی windows, mac, freeBSD را آموزش می دهیم :

نصب بر روی Windows:

ابتدا داکر ماشین را از لینک زیر دانلود می کنیم

https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe

توجه : همان گونه که گفته شد داکر برای کشور عزیز ما محدودیت قرار داده و ما بن هستیم و شما می بایست به نحوی آن را دور بزنید.

سپس فایل دانلود شده را نصب و مراحل نصب را انجام دهید . برای اطلاعات تکمیلی به لینک زیر مراجعه بفرمایید:

https://docs.docker.com/docker-for-windows/install/#install-docker-for-windows

نصب بر روی Mac:

ابتدا داکر ماشین را از لینک زیر دانلود کنید :

https://download.docker.com/mac/stable/Docker.dmg

سپس فایل دانلود شده را نصب و مراحل نصب را انجام دهید .

Docker

پس از نصب بر روی ایکن داکر در منو مک کلیک کنید تا آماده استفاده شود.

Docker

پس از مشاهده ایکون داکر در status bar می توانید با کامندلاین مک به داکر فرمان دهید .

Docker

داکر بر روی freeBSD:

ابتدا داکر و داکر ماشین را از پکیج منیجر دانلود کرده:

pkg install docker docker-machine docker-compose

سپس در هوم دایرکتوری خود یک فایل مخفی برای داکر ساخته:

mkdir ~/.docker

سپس یک لینک از محتویات داکر در پوشه داکر ساخته تا همه چی دم دست باشد.

ln -s /storage/docker ~/.docker/machine

سپس داکر ماشین را برای راه اندازی داکر (با استفاده معین از منابع) ساخته.

docker-machine create --driver virtualbox 
 --virtualbox-memory 2048 
 --virtualbox-cpu-count 2 
 --virtualbox-disk-size 102400 
 --virtualbox-hostonly-cidr '10.2.1.1/24' 
 docker1

اینک داکر نصب شده و می بایست برای دسترسی از دستور زیر استفاده کنیم :

eval `docker-machine env docker1`

چگونه با داکر کار کنیم؟

کار کردن با داکر به شدت آسان است ، البته به شرطی که لینوکس را خوب بشناسید و بدانید با هر کانتینر می خواهید چه کنید. اگر لینوکس را خوب نمیشناسید لطفا کمی بیشتر در مورد آن بخوانید . در پارس کلیک مقالاتی هست که می توانید کمی بیشتر لینوکس را بشناسید.

ایده داکر بسیار زیباست و به شما این اجازه را می دهد سیستم عاملی با سرویس ها و اپلیکیشن هایی زیاد داشته باشید بدون آن که در خود سیستم عامل چیزی را راه اندازی کنید.

DockerImage چیست؟

برای تولید یک کانتینر باید یک ایمیج داشت. هر ایمیج داکر به چند صورت قابل استفاده می باشد .

۱. به صورت آماده در DockerHub (ریپازیتوری داکر) یا ریپازیتوری لوکال و شخصی.

۲.استفاده از ایمیج های ذخیره شده در حافظه دستگاه.

۳.به صورت فایل قابل Build که با دستورات خاصی به شما این قابلیت را میدهد تا ایمیج شخصی بسازید.

این روش ها همه و همه به ما کمک میکنند تا ایمیج ها را در داکر ذخیره و از آن ها استفاده کنیم.

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

برای دانلود کردن یک داکر ایمیج ،نام آن را پیدا کرده و سپس آن را Pull می کنیم.

برای پیدا کردن آن به سایت داکر هاب رفته و سرویس یا اپ مورد نظر را سرچ کنید و سپس بر اساس نیاز نام یکی از آن ها را کپی و از دستور زیر استفاده نمیایید:

sudo docker pull IMAGENAME:VERSION

اگر از root یوزر استفاده می کنید (که اشتباهی بزرگ را دارید انجام میدهید) از sudo استفاده نکنید. sudo برای یوزرهایی است که sudoer هستند. من در اینجا sudo را قرار می دهم که یادتان نرود docker دسترسی روت می خواهد.

و یا اینکه نام مورد نظر را مانند مثال زیر Sreach کرده و اسامی ایمیج های مورد نظر و مشابه را دریافت نمایید و سپس آن را Pull نمایید:

sudo docker search IMAGENAME

برای متوجه شدن از ذخیره سازی ایمیج از دستور زیر استفاده نمایید :

sudo docker images

هر داکر ایمیج بعد از ذخیره شدن یک نام و یک id دارد که هر دو برای استفاده از آن ایمیج قابل استفاده می باشند.

اگر خواستید ایمیجی را در داخل دایرکتوری استور کنید و بعدا در جایی دیگر از آن استفاده کنید می بایست با کامند زیر آن را ابتدا ذخیره :

sudo docker save IMAGE_ID_OR_NAME A_NAME_FOR_NEW_IMAGE.tar
sudo docker save -o A_NAME_FOR_NEW_IAMGE.tar IMAGE_ID_OR_NAME

و پس از ذخیره در هارد می توان ان را به دستگاه دیگر منتقل و از آن استفاده کرد.

با کامند زیر می توان یک فایل ایمیج را در سیستم دیگر بار گذاری کرد(این روش به درد کسانی می خورد که نمی توانند داکر ایمیج ها را به دلیل تحریم ها داشته باشند):

sudo docker load < A_NAME_FOR_NEW_IMAGE.tar
sudo docker load -i A_NAME_FOR_NEW_IMAGE.tar

اگر بخواهید یک داکر ایمیج را پاک کنید می بایست از دستور زیر استفاده نمایید:

sudo docker rmi IMAGE_ID_OR_NAME

برای ساخت یک ایمیج اختصاصی می بایست از یک داکربیلد فایل استفاده کینیم . به این فایل ها به اختصار DockerFile می گویند .

این فایل برای ساخت یک ایمیج می بایست از فرمت خاصی بر خوردار باشد تا بتواند یک ایمیج را بیلد کند. بر فرض مثال اگر بخواهیم یک ایمیج بسازیم یک آپاچی را در اختیار ما قرار دهید می توانیم یک داکرفایل بسازیم و آن را بیلد کنیم.

مثال زیر می تواند به ما کمک کند:

FROM ubuntu:12.04
MAINTAINER infu.ir
RUN apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
EXPOSE 80
CMD ['/usr/sbin/apache2', '-D', 'FOREGROUND']

From به معنی این است که از کدام ایمیج استفاده کن.

MAINTAINER به معنای این است که چه کسی این ایمیج را می سازد.

RUN برای اجرای یک سری دستورات در آن ایمیجی که from شده است مورد استفاده قرار می گیرد تا در زمان بیلد شدن یک سری کار های مورد نیاز انجام شود.

ENV برای تعریف کردن یک Environment variable مورد استفاده قرار می گیرد.

EXPOSE یک پورت برای ایمیج تخصیص می دهد.

CMD یک دستور را در زمانی اجرا می کند که کانتینر در حال ساخته شدن است.

برای بیلد کردن نیز از دستور زیر استفاده نمیایید:

sudo docker build - < Dockerfile
sudo docker build -t DockerFile .

برای فهمیدن بیشتر و یا ساخت داکرفایل های بزرگتر می بایست از لینک های زیر استفاده نمایید چون استفاده از داکرفایل کاملا به نیاز شخصی از یک ایمیج برمیگردد:

https://docs.docker.com/engine/reference/builder/

https://www.digitalocean.com/community/tutorials/docker-explained-using-dockerfiles-to-automate-building-of-images

چگونه می توان از یک DockerImage، کانتینر ساخت؟

همانگونه که می دانید برای ساخت یک کانتینر نیاز داریم یک ایمیج داشته باشیم که فهمیدیم چگونه میتوان آن را تهیه کرد. اما برای تولید یک کانتینر از دستور docker run استفاده می کنند:

sudo docker run -d IMAGE_ID_OR_NAME
sudo docker run -itd IMAGE_ID_OR_NAME

این دو کامند ساده ترین شکل کامند است که می توان یک کانتینر را ساخت.

اما چرا از آپشن هایی چون t,i,d استفاده کردیم؟ جواب این است که هر ایمیح نیاز به مشخص کردن stdin و tty دارد تا بتواند با سیستم عامل تعامل برقرار کند.برای همین از آپشن های i و t استفاده می کنند. اما این دو آپشن شما را درون یک tty در وارد می کند و اگر می خواهید وارد نشوید آن را با آپشن d به ادغام یا به تنهایی بزنید تا وارد کانتینر نشوید و همچنین کانتینر ران باقی بماند.

آپشن های بسیار مهم در docker run:

-i Stdin را باز نگه می دارد حتی اگر متصل نباشد.

-t یک tty از کانتینر میسازد.

-p یک پورت را از داخل کانتینر به یک پورت هاست متصل میسازد.

-v یک مسیر دایرکتوری از کانتینر را به یک مسیر دایرکتری از هاست مپ می کند (یک volume می سازد)

-a میتوان به صورت دستی با stdin, stdout و stderror ارتباط برقرار کرد.

-d عملیات را به بگراند می برد و کانتینر را ران می کند.

--rm نگاه می کند اگر کانتینر مشابه بود آن را پاک می کند و جدید می سازد

--name یک نام به کانتینر اختصاص می دهد.

برای بهتر فهمیدن این بخش لازم میدانم به چند مثال بسنده کنم:

اگر قصد ساخت کانتینری را دارید و ایمیج آن را در سیستم ندارید ، دستور run خودش آن ایمیج را دانلود و کانتینر را می سازد.

برای ساخت یک کانتینر که دیستیبیوشن centOS در آن است.

sudo docker run --name infu_centos -d centos 

گاهی وقت ها لازم است بعد از ساخت دستوری را در کانتینر ران کنیم . شما می توانید بعد از نام ایمیج کامند خود را وارد کنید.

sudo docker run --rm -d centos cat /etc/redhat-release

برای داشتن یک وب سرور آپاچی که به پرت ۸۰۸۱ ما مپ شود و نیازی به تغیرات selinux نیز نباشد و همچنین آدرس فایل های پروژه را در کانفیگ فایل آپاچی نخواهیم تغییر دهیم، می بایست از دستور زیر استفاده کنیم.

sudo docker run -it --name parsckick_apache -p 8081:80 -v /home/project/infu_project:/var/www/html -d httpd

هر کانتینر ساخته شده دارای نام و id یونیک است که می توان با آن ها به آن کانتینر اشاره کرد.

اگر نیاز دارید موارد بیشتری مانند نتورک را بدانید از لینک زیر استفاده نمایید:

https://docs.docker.com/engine/reference/run

چگونه از حال یک کانتینر با خبر شویم؟

برای دیدن کانتینرهای در حال اجرا از دستور زیر استفاده می کنند:

sudo docker ps 

برای دیدین تمامی کانتینر ها از درستور زیر استفاده می کنند:

sudo docker ps -a

برای دیدن id تمام کانتینر ها از دستور زیر استفاده می کنند:

sudo docker ps -a -q

برای دیدن log یک کانتینر از دستورهای زیر استفاده کنید:

sudo docker logs ID_OR_NAME_OF_A_CONTAINER

یا

sudo docker logs -f ID_OR_NAME_OF_A_CONTAINER 

برای دیدن تمامی اطلاعات مربوط به یک کانتینر می بایست از دستور زیر استفاده کرد:

sudo docker inspect ID_OR_NAME_OF_A_CONTAINER

برای استارت یا استاپ کردن یک کانتینر از دستور زیر میتوان استفاده کرد:

sudo docker start ID_OR_NAME_OF_A_CONTAINER
sudo docker stop ID_OR_NAME_OF_A_CONTAINER

و برای ری استارت کردن نیز از دستور زیر استفاده می کنیم:

sudo docker restart ID_OR_NAME_OF_A_CONTAINER

برای فهمیدن از استفاده ریسورس هر کانتینر از دستور زیر استفاده می کنیم:

sudo docker stats ID_OR_NAME_OF_A_CONTAINER

برای بیشتر دانستن در این بخش به لینک زیر مراجعه کنید:

https://docs.docker.com/engine/reference/commandline/ps

چگونه وارد یک کانتینر شویم ؟

برای دسترسی به داخل یک کانتینر می بایست از docker exec استفاده کرد .

برای مثال می خواهیم بدانیم درون hosts چه نوشته شده:

Sudo docker exec -d ID_OR_NAME_OF_A_CONTAINER cat /etc/hosts

یا میخواهیم یک فایل را تولید کنیم:

sudo docker exec -d ID_OR_NAME_OF_A_CONTAINER touch /root/haj.infu

برای ورود به آن نیز می بایست یک stdin و یک tty داشته باشیم . بنابر این باید از آپشن های -t و -i نیز استفاده کنیم .

برای روشن شدن این بحث از دستور زیر استفاده می کنیم.

sudo docker exec -it ID_OR_NAME_OF_A_CONTAINER

برای بیشتر دانستن درباره exec لطفا به لینک زیر سر بزنید:

https://docs.docker.com/engine/reference/commandline/exec

چگونه یک کانتینر را پاک کنیم؟

برای پاک کردن یک کانتینر می بایست از دستور docker rm استفاده کنید .این دستور کانتینری را پاک می کند که شما با توجه به نام یا id کانتینر به آن اشاره کرده اید.

برای درک این بخش به کامند زیر توجه کنید:

sudo docker rm ID_OR_NAME_OF_A_CONTAINER

این کامند کانتری را پاک می کند که stop است و شما به آن شاره کرده اید. اما اگر کانتیری را می خواهید پاک کنید که start است از سویج -f استفاده کنید

sudo docker rm -f ID_OR_NAME_OF_A_CONTAINER

شما می توانید لیستی از کانتیر ها را نیز انتخاب و آن ها را پاک کنید:

sudo docker rm -f ID_OR_NAME_OF_A_CONTAINER_1 ID_OR_NAME_OF_A_CONTAINER_2

برای پاک کردن تمامی کانتینر ها نیز از دستور زیر می توانید استفاده نمایید :

sudo docker rm -f $(docker ps -a -q)

فکر می کنم هر آن چه که لازم بوده تا با مقدمات docker آشنا شوید را بیان کرده ام . اما از این پس هر سرویسی را که بخواهم راه اندازی کنم ، با مثال داکر نیز بیان خواهم کرد تا شما با آن بشتر آشنا شوید.

مطالب مرتبط

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *