مرا اسکن کن!

داکر (Docker) چیست ؟

داکر (Docker) چیست ؟



داکر یک پلت فرم متن باز برای ساخت ، ارسال و اجرای هر اپلیکیشنی بدون وابستگی به مکان می باشد .  شامل ۴ مولفه اصلی است : موتور داکر ( قابلیت حمل دارد بازمان اجرای خیلی کم) ، یک هاب داکر ،ابزارهای بسته بندی و یک سرویس ابری برای به  اشتراک گذاشتن اپلیکیشن ها و خودکار سازی جریان کار . داکر اپلیکیشن ها را قادر می سازد به سرعت از اجزایشان اسمبل شوند و اصطکاک مابین توسعه  ، QA و محیط تولید را حذف کند .

docker ابزاری فوق العاده برای ایجاد مایکروسرویس ها است و به شما اجازه میده اپلیکیشن و سیستم هایی ابری ایجاد کنید.

داکر سریع است، استفاده از آن راحت است و ابزاری برنامه‌نویس محور است. ماموریتش در اساس این است: بسته‌بندی و انتقال کد را ساده کند. برنامه‌نویس‌ها به دنبال ابزارهایی هستند که بخش زیادی از جزییات ‌این فرآیند را از کار آن‌ها مجزا کند. آن‌ها فقط انتظار دارند ببینند کدی که می‌‌‌‌نویسند کار می‌‌‌‌کند. همین مسئله منجر به انواع تضادها با مدیران سیستم می‌‌‌‌شود؛ زمانی که کد از یک جا به جای دیگر منتقل می‌‌‌‌شود و در محیطی به جز محیط خود برنامه‌نویس درست کار نمی‌‌‌‌کد. داکر تلاش می‌‌‌‌کند کد شما را تا حد ممکن قابل انتقال سازد و این قابل انتقال بودن را برای کاربر ساده و دوستانه کند. 

اگر یک برنامه نویس باشید، حتماً میدانید که برای تولید یک برنامه، ابتدا باید یک سری محیط های عملیاتی را اجرا کنید. مثلا فرض کنید، شما برنامه نویس با زبان برنامه نویسی PHP هستید. احتمالاً باید یک وب سرور(مثلا آپاچی) را بر روی سیستم خود نصب کنید. احتمالا یک سرور Mysql نیز برای مدیریت پایگاه داده احتیاج دارید. اگر حرفه ای تر برنامه نویسید، ممکن است، نیاز داشته باشید که چند ماژول اضافی برای PHP نصب کنید و تنظیمات مختلف آن را انجام دهید. همه ی موارد بالا، بایستی بر روی سیستم شما انجام شود، و اگر شخص دیگری هم خواست برنامه ای که شما نوشتید را توسعه دهد(یا خودتان خواستید، همین برنامه را بر روی یک کامپیوتر دیگر توسعه دهید)، احتیاج دارید که همه ی این ابزارها را نیز، دوباره بر روی آن سیستم نیز، نصب کنید.

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

حتی بسیاری از شرکت ها، نیز میتوانند، از داکر(Docker)، در محیط اجرا، استفاده کنند.

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

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

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

داکر (Docker)

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

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

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

 

 

 

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

 

 

 

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

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

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

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

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

DockerImage چیست؟

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

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

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

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

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

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

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

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

sudo docker pull IMAGENAME:VERSION

 

و یا اینکه نام مورد نظر را مانند مثال زیر 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 megaweb.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 .

 

چگونه می توان از یک 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:

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

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

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

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

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

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

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

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

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

اگر قصد ساخت کانتینری را دارید و ایمیج آن را در سیستم ندارید ، دستور 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

 

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

برای دسترسی به داخل یک کانتینر می بایست از 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/megaweb.ir

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

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

sudo docker exec -it ID_OR_NAME_OF_A_CONTAINER

 

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

برای پاک کردن یک کانتینر می بایست از دستور 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)

 


نوشته شده توسط :

وحید صمدیان وحید صمدیان



چهارشنبه, 10 آبان 1396

تعداد بازديد : 1617

برچسب ها : LINUX

3.0 ستاره