آشنایی با داکر و دستورات آن – بخش اول

داکر چیست؟!داکر مجموعه ای از محصولات پلت فرم به عنوان سرویس (Platform as a service = PaaS) است که از مجازی سازی در سطح سیستم عامل برای ارائه نرم افزار در بسته هایی به نام کانتینر استفاده می کند. نرم افزاری که کانتینرها را میزبانی می کند Docker Engine نامیده می شود. اولین بار در سال ۲۰۱۳ شروع شد و توسط Docker, Inc توسعه یافته است. (ویکی‌پدیا)داکر چگونه کار می‌کند؟!تصور کنید که که ما اپلیکیشنی که داریم را در یک محیط داکرایز قرار دادیم در این صورت اپلیکیشن ما به صورت یک پکیج بسته بندی شده در اختیار بقیه قرار میگیرد و حتی میتوانیم از این پکیج نمونه های دیگری را هم کپی بگیریم. همه این نمونه ها و این پکیج بر روی کرنل لینوکس قرار میگیرند و داکر با استفاده از ۲ ویژگی که کرنل لینوکس ارایه میدهد این کار را انجام میدهد.Linux Namespace: each process sees its own personal view of the system (files, process, network interface, hostname,…)Linux control Groups: limit the number of resources the process can consume (CPU, memory, network bandwidth,…)پس در واقع وقتی از داکر استفاده میکنیم، قطعا از کرنل لینوکس استفاده میکند و اگر روی سیستم عاملهای دیگری بخواهیم از داکر استفاده کنیم ابزارهایی هستند که در بکگراوند برای راه اندازی داکر کرنل لینوکس را ابتدا فراهم میکنند که بتوانیم از داکر استفاده کنیم.داکر رجستری Docker Registryهمانطور که ما برای پکیج های مختلف پروژه ها به زبانهای مختلف از سیستم‌هایی همچون پکیج منیجر استفاده میکنیم برای اینکه ما برای داکر بتوانیم پکیجهایی که داریم را در اختیار بقیه قرار دهیم از 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…تفاوت image و containerیک image در واقع اپلیکیشنی است که ما میخواهیم اجرا کنیم.یک container در واقع یک نمونه از imageی است که میخواهیم آن را اجرا کنیم.ما میتوانیم تعداد زیادی container داشته باشیم که از یک image ساخته شده اند.همانطور که ما برای پروژه‌ها و پکیجهای مختلف ورژن کنترلی مانند github داریم برای imageهایی هم که موجود هستند از Docker Hub استفاده میکنیم.نکته: وقتی میخواهیم یک image نصب کنیم به صورت پیشفرض منبع و سورس image داکرهاب درنظر گرفته میشود مگر اینکه آدرس image و رجستری را بنویسیم و وقتی که میخواهیم image را از داکرهاب نصب کنیم مشخصات لاگین با اکانت توی داکرهاب را باید وارد کنیم که برای دفعات بعد این مشخصات ذخیره میشود. برای هر image معمولا Version tagهایی وجود دارد که اگر آن را ننویسیم به صورت پیشفرض آخرین ورژن pull می شود.