داکر مجموعه ای از محصولات پلت فرم به عنوان سرویس (Platform as a service = PaaS) است که از مجازی سازی در سطح سیستم عامل برای ارائه نرم افزار در بسته هایی به نام کانتینر استفاده می کند. نرم افزاری که کانتینرها را میزبانی می کند Docker Engine نامیده می شود. اولین بار در سال ۲۰۱۳ شروع شد و توسط Docker, Inc توسعه یافته است. (ویکیپدیا)
تصور کنید که که ما اپلیکیشنی که داریم را در یک محیط داکرایز قرار دادیم در این صورت اپلیکیشن ما به صورت یک پکیج بسته بندی شده در اختیار بقیه قرار میگیرد و حتی میتوانیم از این پکیج نمونه های دیگری را هم کپی بگیریم. همه این نمونه ها و این پکیج بر روی کرنل لینوکس قرار میگیرند و داکر با استفاده از ۲ ویژگی که کرنل لینوکس ارایه میدهد این کار را انجام میدهد.
پس در واقع وقتی از داکر استفاده میکنیم، قطعا از کرنل لینوکس استفاده میکند و اگر روی سیستم عاملهای دیگری بخواهیم از داکر استفاده کنیم ابزارهایی هستند که در بکگراوند برای راه اندازی داکر کرنل لینوکس را ابتدا فراهم میکنند که بتوانیم از داکر استفاده کنیم.
همانطور که ما برای پکیج های مختلف پروژه ها به زبانهای مختلف از سیستمهایی همچون پکیج منیجر استفاده میکنیم برای اینکه ما برای داکر بتوانیم پکیجهایی که داریم را در اختیار بقیه قرار دهیم از Registry استفاده میکنیم. برای اینکار ابتدا از پکیج Build میگیریم و سپس یک image از آن میسازیم و این image فایلی است که قابل حمل است و از آن نمونه میگیریم و میتوانیم از آن استفاده کنیم.
وقتی که ما image را در registry قرار دهیم و آن را push کنیم هر شخصی میتواند از آن استفاده کند یعنی آن را pull میکند و برای استفاده در نرم افزار خودش آن را Deploy میکند، همانطور که ما میتوانیم imageهایی که لازم داریم را از آنجا pull و در نهایت Deploy کنیم.
در واقع وقتی ما Image را Deploy میکنیم و یک نمونه از Image را در نرم افزار خود استفاده میکنیم، یک container از آن میسازیم و container اجرا میشود.
همچنین ما میتوانیم همزمان چندین نمونه از container را اجرا کنیم و در طول کل اجرا ما درگیر جزئیات نحوه اجرای نرم افزار نمیشویم و همه موارد داخل پکیج و image لحاظ شده است. این همان کاری است که Docker برای ما انجام میدهد. در واقع ما درگیر Dependencyها و اینکه چه نسخه ای از نرم افزارها را نصب کنیم و این نرم افزارها در همه محیطهای development و production یکی باشد نخواهیم بود و با استفاده از داکر هم میتوانیم این محیط یکسان را داشته باشیم و هم به روند توسعه راحتتر پروژه و تخصیص منابع و بهینه سازی بهتر پروژه کمک کنیم.
وقتی میخواهیم یک image نصب کنیم و از دستورات داکر استفاده میکنیم به صورت پیشفرض منبع و سورس image داکرهاب درنظر گرفته میشود مگر اینکه آدرس image و رجستری را بنویسیم و وقتی که میخواهیم image را از داکرهاب نصب کنیم مشخصات لاگین با اکانت توی داکرهاب را باید وارد کنیم که برای دفعات بعد این مشخصات ذخیره میشود.
برای pullکردن یک image دستور زیرا در محیط ترمینال اجرا میکنیم، برای هر image معمولا Version tagهایی وجود دارد که اگر آن را ننویسیم به صورت پیشفرض آخرین ورژن pull میشود
docker pull image_name:tag
اگر دستور زیر را در محیط ترمینال خود اجرا کنید، یک container nginx ایجاد و اجرا میشود اما چگونه؟!
docker container run --publish 80:80 nginx
داکر در پشت پرده دنبال یک image به اسم nginx میگردد، اگر آن را در کش لوکال پیدا کند از آن استفاده میکند در غیر اینصورت آخرین ورژن آن را از Registry دانلود میکند، در قدم بعدی یک container از آن میسازد و آن را run میکند و در واقع بخش publish آن پورت ۸۰ لوکالهاست من را به پورت ۸۰ داخل container وصل میکند و به صورت اتوماتیک همه ترافیکهایی که روی پورت ۸۰ لوکال من قرار میگیرد به پورت ۸۰ داخل container انتقال داده میشود. بعد از اجرای دستور فوق با باز کردن localhost خود روی مرورگر میتوانید پیام nginx را مشاهده کنید.
(اگر میخواهید از محیط اجرا خارج شوید با فشار دادن دکمه های Ctr + c میتوانید آن را متوقف کنید.)
اگر میخواهید دستور فوق را در بکگراوند اجرا کنید، یعنی container در حال اجرا باشد ولی از محیط اجرای container روی ترمینال خارج شوید به کامند فوق –detach را اضافه کنید.
docker container run --publish 80:80 --detach nginx
بعد از اجرای دستور فوق یک Unique Container ID چاپ میشود.
نکته: همانطور که قبلا اشاره کردم، ما میتوانیم یک image ایجاد کنیم و آن را توی Docker Registry قرار دهیم، وقتی که ما برای ایجاد image موردنیازمون از سایر imageهایی که داخل Docker Registry وجود دارد استفاده میکنیم و به نوعی برای آن Dependencyهایی ایجاد میکنیم، وقتی که میخواهیم imageی که ایجاد کردیم را push کنیم این imageهایی که قبلا استفاده کردیم همراه image ما push نمیشود و فقط اسم و مشخصات آن قرار میگیرد و در حین استفاده و نصب مجدد docker از registry آن را دانلود میکند، دقیقا مثل نصب پکیجهای php که داخل vendor قرار میگیرند و یا پکیجهای node_modules…
همانطور که ما برای پروژهها و پکیجهای مختلف ورژن کنترلی مانند github داریم برای imageهایی هم که موجود هستند از Docker Hub استفاده میکنیم.
نکته: وقتی میخواهیم یک image نصب کنیم به صورت پیشفرض منبع و سورس image داکرهاب درنظر گرفته میشود مگر اینکه آدرس image و رجستری را بنویسیم و وقتی که میخواهیم image را از داکرهاب نصب کنیم مشخصات لاگین با اکانت توی داکرهاب را باید وارد کنیم که برای دفعات بعد این مشخصات ذخیره میشود. برای هر image معمولا Version tagهایی وجود دارد که اگر آن را ننویسیم به صورت پیشفرض آخرین ورژن pull می شود.