۰
داکر چیست؟
داکر مجموعهای از محصولات Platform as a Service است که با استفاده از مجازیسازی در سطح سیستمعامل (OS-level virtualization) نرمافزار را در بستههایی به نام کانتینر ارائه میکند. کانتینرها از یکدیگر ایزوله هستند و نرمافزار، کتابخانهها و فایلهای پیکربندی خود را بستهبندی میکنند؛ آنها از طریق کانالهای مشخص با یکدیگر ارتباط دارند. همه کانتینرها توسط یک کرنل سیستمعامل واحد اجرا میشوند و به همین دلیل نسبت به ماشینهای مجازی (Virtual Machines) سبکتر هستند.[8]
کانتینر چیست؟
Docker Container یک واحد استاندارد شده است که میتوان آن را به سرعت ساخت تا یک برنامه یا محیط خاص را مستقر (deploy) کند. این کانتینر میتواند مثلاً یک کانتینر اوبونتو (Ubuntu container)، سنتاواس (CentOS) و ... باشد تا نیازمندیهای سیستمعامل را برآورده کند. همچنین میتواند کانتینری ویژه برنامه باشد، مثل کانتینر CakePHP یا Tomcat-Ubuntu.
داکر یک پلتفرم برای توسعهدهندگان و مدیران سیستم است تا برنامهها را بسازند، به اشتراک بگذارند و اجرا کنند با استفاده از کانتینرها. استفاده از کانتینرها برای استقرار برنامهها به نام containerisation شناخته میشود. کانتینرها جدید نیستند، اما استفاده آسان آنها برای استقرار اپلیکیشنها تازه و رایج شده است.
مزایای محبوبیت containerisation عبارتاند از:
خوش آمدید! خوشحالیم که میخواهید داکر را یاد بگیرید. دوره شروع به کار Docker به شما یاد میدهد چطور:
به طور پایه، یک کانتینر چیزی جز یک پروسس در حال اجرا نیست که ویژگیهای انضمامیای روی آن اعمال شده تا ایزوله باقی بماند و از سیستمعامل میزبان و کانتینرهای دیگر جدا باشد. یکی از مهمترین ویژگیهای ایزولهسازی کانتینر، این است که هر کانتینر با یک فایلسیستم خصوصی خود کار میکند؛ این فایلسیستم از یک Docker image فراهم میشود. این image شامل همه چیز برای اجرای برنامه است — کد یا باینری، runtimeها، وابستگیها و همه فایلهای لازم.
یک کانتینر روی لینوکس به صورت native اجرا میشود و کرنل سیستم میزبان را با کانتینرهای دیگر به اشتراک میگذارد. کانتینر یک پروسس جداگانه است که به اندازه هر اجرایی دیگر حافظه مصرف میکند و به همین دلیل سبکوزن است.
در مقابل، یک ماشین مجازی یک سیستمعامل مهمان کامل را اجرا میکند که از طریق یک hypervisor به منابع سیستم میزبان به صورت مجازی دسترسی دارد. به طور کلی، VMها سربار زیادی نسبت به منطق اپلیکیشن دارند.
خلاصهای از آنچه تا الان یاد گرفتیم:
چرا از داکر استفاده میکنیم؟
همانطور که توضیح دادیم، داکر چیست؛ اما چرا به داکر نیاز داریم؟ کانتینرهای داکر سبکوزن و بسیار ساده برای ساخت و استقرار هستند.
داکر محیط runtime کاملی شامل برنامه، همه وابستگیها، کتابخانهها، باینریها و فایلهای پیکربندی مورد نیاز برای اجرای آن داخل یک بستهی کانتینری ارائه میکند. هر برنامه جداگانه اجرا میشود و داکر با قرار دادن وابستگیها در داخل کانتینر، مشکل وابستگی پروژهها را حل میکند و توسعهدهندگان را در برابر مشکلات وابستگی متحد میسازد.
مزایای استفاده از کانتینرها نسبت به ماشینهای مجازی
داکر چگونه کار میکند؟
با شناخت فواید داکر، اجازه دهید عملکرد داکر را هم بررسی کنیم. داکر دارای یک docker engine است که قلب سیستم داکر است و یک برنامه client-server محسوب میشود. سه بخش اصلی دارد:
Docker daemon فرمانها را از کلاینت دریافت میکند و اشیاء داکر مثل تصاویر، کانتینرها، شبکهها و حجمها را مدیریت میکند. کلاینت و دیمون میتوانند روی یک سیستم باشند یا از طریق شبکه به یکدیگر متصل شوند و با REST API، سوکتهای UNIX یا رابط شبکه ارتباط برقرار کنند.
در لینوکس، میزبان داکر daemon را اجرا میکند و کلاینت را میتوان از ترمینال فراخواند.
در ویندوز یا مکاواس، ابزاری اضافی به نام Docker Toolbox وجود دارد که محیط داکر را نصب میکند، شامل: Docker Client، Compose، Kitematic، Machine و VirtualBox.
تکنولوژیهای استفاده شده در داکر
زبان برنامهنویسی داکر GO است. داکر از ویژگیهای کرنل لینوکس مثل namespaces و cgroups بهره میبرد.
namespaces: داکر از namespaces برای ایجاد فضای کاری ایزوله شدهای به نام کانتینرها استفاده میکند. هر بخش از کانتینر در یک namespace جدا اجرا میشود و دسترسی آن محدود به همان فضای اسمی است.
cgroups (control groups): برای محدود کردن و ایزوله کردن استفاده منابع سختافزاری (مثل CPU، حافظه، Disk I/O، شبکه) توسط مجموعهای از پروسسها استفاده میشود. cgroups به موتور داکر اجازه میدهد منابع موجود را بین کانتینرها تقسیم کند و در صورت نیاز محدودیت اعمال نماید.
UnionFS (Union file systems): فایلسیستمهایی که با ساخت لایهها کار میکنند، بسیار سبک و سریع هستند و توسط داکر برای ساخت پایههای کانتینرها استفاده میشوند.
موتور داکر این سه مورد (namespaces، cgroups و UnionFS) را در قالب قالبی به نام container format ترکیب میکند. قالب پیشفرض، libcontainer است.
بهترین راه برای شروع توسعه اپلیکیشنهای کانتینری شده، نصب Docker Desktop در macOS یا Windows است. با Docker Desktop به راحتی میتوانید Kubernetes یا Swarm روی ماشین توسعه خود راهاندازی کنید و بدون نیاز به خوشه (cluster) از تمام ویژگیهای هماهنگکننده استفاده کنید. دستورالعملهای نصب برای سیستم عامل خود را دنبال کنید:
docker --version
گرفتن نسخه نصبشده فعلی داکر.
docker pull
1docker pull <image-name>
دانلود یک ایمیج از رپوزیتوری داکر (مثل hub.docker.com)
docker run
1docker run -it -d <image-name>
ساخت کانتینر از روی یک ایمیج و اجرای آن
docker ps
نمایش کانتینرهای در حال اجرا
docker ps -a
نمایش همه کانتینرها، شامل کانتینرهای در حال اجرا و متوقف شده
docker exec
1docker exec -it <container-id> bash
دسترسی به یک کانتینر در حال اجرا (شبیه ssh به داخل کانتینر)
docker stop
1docker stop <container-id>
توقف اجرای یک کانتینر
docker kill
1docker kill <container-id>
توقف فوری کانتینر (برخلاف stop که به کانتینر اجازه خاموشی مرتب را میدهد)
docker commit
1docker commit <container-id> <username/image-name>
ساختن یک ایمیج جدید از یک کانتینر ویرایششده روی سیستم محلی
docker login
ورود به رپازیتوری Docker Hub
docker push
1docker push <username/image-name>
ارسال ایمیج به Docker Hub
docker images
نمایش همه ایمیجهای محلی
docker rm
1docker rm <container-id>
حذف یک کانتینر متوقف شده
docker rmi
1docker rmi <image-id>
حذف یک ایمیج از فضای ذخیرهسازی محلی
docker build
1docker build <path-to-Dockerfile>
ساخت یک ایمیج از روی یک Dockerfile مشخصشده
فرض کنیم یک اپلیکیشن PHP داریم و میخواهیم آن را در سرور staging یا production مستقر کنیم. ابتدا مطمئن میشویم که فایل پیکربندی داکر را در ریشه پروژه داریم.
در ریشه پروژه، فایلی با نام Dockerfile بسازید و کد زیر را قرار دهید تا داکر بداند هنگام اجرای پروژه در محیط staging یا production چه کار کند:
1FROM PHP:7.2-Apache 2COPY src/ /var/www/html/ 3EXPOSE 80
این اسکریپت داکر نمونه نسخه PHP 7.2 را روی یک سرور staging یا production تنظیم میکند، فایلهای PHP از پوشه src/ به مسیر /var/www/html/ کپی میشوند و پورت 80 برای دسترسی باز میشود.
پس از نصب روی سرور، روی آیکون نهنگ در سیستم کلیک کنید تا Docker اجرا شود.
اپلیکیشن را به سرور منتقل کنید و کارهای زیر را انجام دهید:
1docker build -t <name-to-give-your-image> .
این دستور یک Docker image میسازد و تمام وابستگیها را دانلود میکند.
1docker run -p 9090:80 <name-to-give-your-container>
پورت 9090 پورتی است که در میزبان برای دسترسی به برنامه استفاده میکنیم و 80 پورتی است که داخل کانتینر باز شده.
1docker stop <container-id>
1docker start <container-id>
1docker rmi <image-id>
1docker rm <container-id>
۰
کد با می متعهد است که بالاترین سطح کیفی آموزش را در اختیار شما بگذارد. هدف به اشتراک گذاشتن دانش فناوری اطلاعات و توسعه نرم افزار در بالاترین سطح ممکن برای درستیابی به جامعه ای توانمند و قدرتمند است. ما باور داریم هر کسی میتواند با استمرار در یادگیری برنامه نویسی چالش های خود و جهان پیرامون خود را بر طرف کند و به موفقیت های چشم گیر برسد. با ما در این مسیر همراه باشید. کد با می اجتماع حرفه ای برنامه نویسان ایرانی.