کانتینرسازی مکانیزمی است که اغلب در عمل استفاده می شود. برای مثال، وقتی در headhunter جستجو میکنید، تا امروز 477 جای خالی پیدا میکنید که به Docker اشاره شده است. بنابراین، بد نیست با آنچه که هست آشنا شوید. امیدوارم این بررسی کوتاه به ایجاد اولین برداشت کمک کند. خوب، او آن را با مطالب اضافی، مانند دورههای Udemy، پشتیبان میدهد.
در ویندوز می توانید این را به روش های مختلف بررسی کنید. برای مثال، میتوانید یک ابزار ویژه را از وبسایت مایکروسافت دانلود کنید: ابزار تشخیص مجازیسازی به کمک سختافزار . خوب، ارزش ذکر یک مفهوم مهم دیگر - Hypervisor را دارد. Hypervisor یک مانیتور ماشین مجازی است، برنامه ای برای اطمینان از اجرای موازی چندین سیستم عامل در یک کامپیوتر. Hypervisor تضمین می کند که سیستم عامل ها از یکدیگر جدا شده اند و منابع را بین سیستم عامل های در حال اجرا به اشتراک می گذارد. یکی از این Hypervisor ها Oracle VirtualBox است .
مستندات می گوید که داکر شامل موارد زیر است:
بیایید یک ماشین جدید ایجاد کنیم. برای انجام این کار، باید دستور create :
آنچه در اینجا ما را مورد توجه قرار می دهد موارد زیر است. Boot2Docker چیست؟ این یک توزیع مینیمالیستی لینوکس برای اجرای Docker Engine است (ما میدانیم که Docker به لطف ابزار مجازیسازی لینوکس کار میکند و در ویندوز مکانیسم لازم فقط با شروع ویندوز 10 ظاهر شد). این توزیع بر اساس توزیع " Tiny Core Linux " است. همچنین در مورد VirtualBox VM ذکر شده است. این به این دلیل است که ما مشخص کردیم
پس از ایجاد، از ما خواسته می شود تا دستور " docker-machine env " را اجرا کنیم تا متغیرهای محیطی را که برای اتصال به ماشین داکر باید پیکربندی شوند، دریافت کنیم:
پس از اجرای این دستور با استفاده از docker-machine، ما به یک میزبان docker شده از راه دور (در این مورد، یک میزبان مجازی روی Virtual Box) متصل میشویم و میتوانیم دستورات docker را به صورت محلی اجرا کنیم، گویی که آنها را روی یک میزبان راه دور اجرا میکنیم. برای بررسی، می توانیم دستور " docker info " را اجرا کنیم. اگر اتصال به دستگاه داکر برقرار نشود، با خطا مواجه می شویم. و اگر همه چیز خوب است، اطلاعاتی در مورد داکر در دستگاه داکر. اکنون زمان آن است که بفهمیم Docker به طور کلی چگونه کار می کند و چگونه از آن استفاده کنیم.
همانطور که می بینیم، ما از جایی دانلود می کنیم. به طور پیش فرض، داکر به مخزن خود در شبکه https://hub.docker.com نگاه می کند . پس از بازیابی موفقیت آمیز تصویر، می توانیم با اجرای دستور docker images لیست تصاویر موجود را بررسی کنیم :
اکنون یک تصویر apline داریم. از آنجایی که کانتینر یک نمونه در حال اجرا از تصویر است، بیایید همین تصویر را اجرا کنیم. اجازه دهید ظرف را با استفاده از دستور اجرا کنیم
مسئله این است که ما Docker را در حالت تعاملی راه اندازی نکردیم. لذا فرمان را اجرا کرد و متوقف شد. دستور باز کردن ترمینال بود. بیایید همین کار را انجام دهیم، اما در حالت تعاملی (با پرچم -it ):
همانطور که می بینید، با غلبه بر یک اشتباه و با استفاده از اشاره، به ظرف رسیدیم و می توانیم در آن کار کنیم! برای خروج از ظرف بدون توقف عملکرد آن، می توانید فشار دهید
توصیه میکنم توضیحات نمونه Docker را بخوانید تا توضیحی عالی درباره چگونگی این اتفاق بیفتد: " 1.0 اجرای اولین کانتینر ". من آن را دوست دارم زیرا همه چیز در آنجا به روشی بسیار قابل دسترس و قابل درک نوشته شده است. به طور خلاصه، ما با استفاده از docker-machine به یک ماشین مجازی که Docker Daemon را اجرا می کند متصل شده ایم. با استفاده از CLI روی REST API، از ما میخواهیم تصویر alpine را راهاندازی کنیم. داکر آن را پیدا می کند و بنابراین آن را دانلود نمی کند. Docker یک کانتینر جدید ایجاد می کند و دستوری را که در این کانتینر مشخص کرده ایم اجرا می کند. و همه اینها، البته، خوب است. اما چرا به این همه نیاز داریم؟ و در اینجا باید بفهمیم که داکر چگونه یک تصویر را ایجاد می کند. و آنها را بر اساس dockerfile ایجاد می کند.
اکنون، برای آزمایش آن، بیایید افزونه gretty را به build.gradle اضافه کنیم، همانطور که در بخش " افزودن افزونه gretty و اجرای برنامه " نشان داده شده است:
اگر همه چیز خوب است، از دستور
همچنین شایان ذکر است که تصویر گربه تامکت نامیده می شود. اما علاوه بر نام یک برچسب دارد. یک برچسب مانند یک نسخه است. تصاویر تامکت نسخه های مختلف در کدام نسخه از تامکت، کدام نسخه از jre و کدام تصویر پایه استفاده می شود، متفاوت است. برای مثال، میتوانیم یک تصویر دریافت کنیم
همانطور که می بینیم، تفاوت بسیار زیاد است. اگر تصویر خود را بر اساس tomcata alpine بسازیم، فقط با 100 مگابایت شروع می کنیم و نه با 600. بر این اساس، محتوای زیر را به فایل docker که قبلا ایجاد شده است اضافه می کنیم:
برای درک اینکه آیا سرور شروع به کار کرده است، می توانید به گزارش از کانتینر نگاه کنید. گزارش را می توان با استفاده از دستور docker logs به دست آورد و ظرف را با شناسه یا نام آن مشخص کرد. مثلا:
خوب، فراموش نکنید که ما همیشه میتوانیم با دستور به یک کانتینر در حال اجرا بر اساس نام برویم:
بنابراین، من و شما به تازگی برنامه وب خود را در یک ظرف Docker راه اندازی کرده ایم! ) به موارد زیر نیز توجه داشته باشم. در صورت بروز مشکل در دسترسی، باید به یاد داشته باشید که ماشین Docker در درجه اول یک ماشین مجازی Virtual BOx است. ممکن است در تنظیمات شبکه ماشین مجازی مشکلاتی وجود داشته باشد. یک پیکربندی VMBox در حال کار ممکن است به شکل زیر باشد:
گفتن این نکته برای درک این نکته مهم است که در اصل، هر تصویر مجموعه ای از تصاویر است. هر تغییر تصویر (هر دستور جدید در dockerfile) یک لایه جدید ایجاد می کند که شناسه مخصوص به خود را دارد. می توانید اطلاعات بیشتری در مورد لایه ها در مستندات " Docker: Images and Layers " بخوانید. من همچنین خواندن مقاله Habré را به شدت توصیه می کنم: " تصاویر داکر و کانتینرها در تصاویر ."
معرفی
در این بررسی کوتاه می خواهم به موضوعی مانند کانتینرسازی بپردازم. و باید با درک اینکه کانتینرسازی واقعا چیست شروع کنید. طبق ویکیپدیا، « کانتینرسازی » مجازیسازی در سطح سیستمعامل (یعنی نه سختافزار) است که در آن هسته سیستمعامل بهجای تنها یک نمونه، چند نمونه فضای کاربر جدا شده را حفظ میکند. " فضای کاربر " فضای آدرس حافظه مجازی سیستم عامل است که برای برنامه های کاربر رزرو شده است. نمونههای فضای کاربر (که معمولاً کانتینر نامیده میشوند) از نظر کاربر کاملاً با یک نمونه سیستم عامل منفرد یکسان هستند. هسته جداسازی کامل کانتینر را تضمین می کند، بنابراین برنامه های کانتینرهای مختلف نمی توانند روی یکدیگر تأثیر بگذارند. معلوم می شود که Containerization مجازی سازی نرم افزار است، یعنی مجازی سازی در سطح سیستم عامل که هسته سیستم عامل مسئول آن است. یکی از ویژگی های مشخصه این رویکرد این است که همه کانتینرها از یک هسته مشترک مانند سیستم عامل میزبان (یعنی هسته ای که کانتینرها روی آن قرار دارند) استفاده می کنند. این به شما امکان می دهد تا از شر سربار شبیه سازی سخت افزار مجازی و راه اندازی یک نمونه کامل از سیستم عامل خلاص شوید. می توان گفت که این مجازی سازی "سبک" است. هسته بخش مرکزی سیستم عامل است که برنامه های کاربردی را با دسترسی هماهنگ به منابع رایانه مانند زمان پردازنده، حافظه، سخت افزار خارجی و دستگاه های ورودی و خروجی خارجی فراهم می کند. هسته همچنین معمولاً خدمات سیستم فایل و پروتکل شبکه را ارائه می دهد. به طور کلی، این قلب کل سیستم است. برای اطلاعات بیشتر، مرور مطالب " اطلاعات عمومی در مورد ظروف " ممکن است مفید باشد. و چند کلمه دیگر برای کامل شدن مقدمه. اکنون متوجه شدیم که یک سیستم عامل دارای هسته است. این انزوا را برای نمونه های فضای کاربر فراهم می کند. در این زمینه، ممکن است با اصطلاح " cgroups " برخورد کنید. این نام مکانیزم هسته لینوکس است که به شما امکان می دهد به این هدف برسید. بنابراین می توان گفت مسیر کانتینری شدن با سیستم های لینوکس آغاز شد. با این حال، با شروع ویندوز 10، پشتیبانی از Containerization نیز ظاهر شد. برای کار با مجازی سازی، باید پشتیبانی مجازی سازی را در بایوس کامپیوتر خود پیکربندی کنید. نحوه انجام این کار به کامپیوتر بستگی دارد. به عنوان مثال، ممکن است به شکل زیر باشد:داکر
بنابراین، مجازی سازی چیست واضح است. اما چگونه از آن استفاده کنیم؟ و اینجا داکر به کمک ما می آید. Docker نرم افزاری برای خودکارسازی استقرار و مدیریت برنامه ها در محیط های کانتینری است. ارزش شروع با این واقعیت را دارد که داکر با مفهومی مانند Docker Enginge نشان داده می شود. و باید با وب سایت رسمی Docker و بخش " Docker Overview " شروع کنید.- سرور داکر به نام فرآیند داکر دیمون (dockerd).
- رابط خط فرمان، همچنین به عنوان CLI (docker) شناخته می شود.
- یک REST API که توضیح میدهد چگونه برنامهها میتوانند با دیمون «صحبت کنند» و به او بگویند که چه کاری انجام دهد.
جعبه ابزار Docker
برای نصب Docker بر روی ماشین های قدیمی که الزامات سیستم را ندارند. این وبسایت میگوید «راهحل دسکتاپ قدیمی». بیایید به صفحه " Docker Toolbox " برویم و آن را دانلود کنیم. این مجموعه حدود 211 مگابایت وزن دارد. ما آن را به صورت پیش فرض نصب می کنیم، یعنی به سادگی با همه چیز بدون مرتب کردن مجدد پرچم ها موافقت خواهیم کرد. پس از نصب، بررسی می کنیم که همه چیز خوب است. در آینده، میدان جنگ ما خط فرمان خواهد بود. توصیه می کنم از خط فرمان ویندوز استفاده نکنید، زیرا ممکن است مشکلات نامشخصی در آن وجود داشته باشد. بهتر است از پوسته bash استفاده کنید. در ویندوز، توصیه شده ترین راه برای دریافت آن، نصب سیستم کنترل نسخه git است ، هنوز هم مفید خواهد بود. زیرا «همراه با آن» همان چیزی است که ما به آن نیاز داریم. برای این بررسی من از git bash استفاده خواهم کرد. همچنین می توانید bash را با CYGWIN نصب کنید . بیایید bash یا git bash را راه اندازی کنیم. بیایید مطمئن شویم که Docker Machine یا Docker Machine را نصب کرده ایم:docker-machine -version
این Docker Machine چیست؟ Docker Machine یک ابزار کاربردی برای مدیریت هاست های dockerized است (این هاست هایی هستند که Docker Engine روی آنها نصب شده است). اگر بلافاصله پس از نصب Docket Toolbox ماشینهای docker را با استفاده از دستور مشاهده کنیم docker-machine ls
، یک لیست خالی خواهیم دید:
docker-machine create -- driver virtualbox javarush
: را اجرا کنیم، گزارش ایجاد ماشین docker را مشاهده خواهیم کرد:
--driver virtualbox
. یک ماشین مجازی جدید در VirtualBox از تصویر Boot2Docker ایجاد شد. پس از ایجاد، میتوانیم VirtualBox را راهاندازی کنیم (از آنجایی که VirtualBox با Docker Toolbox نصب شده است) و ماشین مجازی ایجاد شده را برای ماشین docker ببینیم:
کانتینرهای داکر
بنابراین ما داکر داریم. اصلا این داکر چیست؟ مستندات Docker و بخش " شروع به کار " به ما در درک این موضوع کمک می کند . بخش مقدماتی این بخش به معرفی مفاهیم داکر می پردازد . بیان می کند که Docker یک پلت فرم برای توسعه، اشکال زدایی و اجرای برنامه های کاربردی در کانتینرها است. بنابراین، نکته اصلی برای Docker کانتینرها است. حتی اگر به لوگوی داکر نگاه کنید، این نهنگ است که ظروف را در پشت خود نگه می دارد. اما ظرف چیست؟ بعد در بخش « تصاویر و کانتینرها » میگوید که یک کانتینر یک نمونه در حال اجرا از Image است. و Image یک "بسته" است که شامل همه چیزهای لازم برای برنامه است (کد، محیط، کتابخانه ها، تنظیمات و غیره). حالا بیایید خودمان آن را امتحان کنیم. وب سایت داکر دارای بخشی به نام " نمونه های داکر " است که شامل " داکر برای مبتدیان " است. مثال های اینجا برای من جالب تر به نظر می رسند. بنابراین، ما ناگهان خواستیم با Alpine Linux آشنا شویم و می توانیم این کار را با استفاده از کانتینرهای Docker انجام دهیم. برای به دست آوردن یک تصویر، باید آن را "کشش" یا "کشیدن" کنیم. بنابراین، دستور docker pull را اجرا می کنیم :docker pull apline
docker run alpine
. همانطور که می بینیم هیچ اتفاقی نیفتاده است. اگر دستور docker ps
نمایش تمام کانتینرهای فعال را اجرا کنیم، چیزی نیز دریافت نمی کنیم. اما اگر اجرا کنیم، docker ps -a
همه کانتینرها را خواهیم دید:
Ctrl + p + q
. اگر اکنون اجرا کنیم docker ps
، یک کانتینر فعال خواهیم دید. برای وارد کردن یک کانتینر در حال اجرا، دستور docker exec را اجرا کنید :
Dockerfile
همانطور که در مرجع Dockerfile بیان شد ، dockerfile یک فایل متنی است که شامل تمام دستورات برای به دست آوردن یک تصویر است. در واقع، تمام تصاویری که دریافت می کنیم (حتی Alpine، از مثال بالا) از یک فایل docker ایجاد شده اند. بیایید تصویر خود را با یک برنامه جاوا بسازیم. و ابتدا به این برنامه جاوا نیاز داریم. پیشنهاد می کنم از سیستم ساخت Gradle استفاده کنید که می توانید در این بررسی کوتاه بیشتر در مورد آن بخوانید: " معرفی مختصر بر Gradle ". در ایجاد پروژه " پلاگین Gradle Build init " به ما کمک خواهد کرد. بیایید با استفاده از Gradle یک برنامه جاوا جدید بسازیم:gradle init --type java-application
این دستور یک پروژه جاوا قالب ایجاد می کند. این یک برنامه مستقل است، اما ما می خواهیم یک برنامه وب ایجاد کنیم. بیایید کلاس های App و AppTest را حذف کنیم (آنها به طور خودکار توسط پلاگین Gradle Build Init تولید شدند). برای ایجاد سریع یک برنامه وب، از آموزش Gradle استفاده می کنیم: " ساخت برنامه های وب جاوا ". با توجه به آموزش، بیایید انجام دهیم:
- بیایید اسکریپت ساخت build.gradle را باز کنیم و آن را مطابق بخش " افزودن یک فایل ساخت Gradle " تصحیح کنیم.
- بیایید صفحاتی را به src/main/webapp اضافه کنیم همانطور که در بخش " افزودن صفحات JSP به برنامه آزمایشی " نشان داده شده است.
- بیایید یک کلاس
HelloServlet
با محتوای بخش " Add a servlet and metadata to the project " اضافه کنیم.
plugins {
id 'war'
id 'org.gretty' version '2.2.0'
}
جالب است که گرتی خطایی را HelloServlet
که در بالا توضیح داده شد نمی بیند. این ثابت می کند که یک برنامه کاربردی می تواند در محیط های مختلف رفتار متفاوتی داشته باشد. گرتی می تواند در جایی کار کند که یک سرور مستقل معمولی با خطا مواجه شود. تنها چیزی که باقی می ماند این است که بررسی کنید که برنامه به درستی کار می کند. بیایید انجام دهیم:gradle appRun
gradle war
برای جمع آوری آرشیو با پسوند جنگ (بایگانی وب) استفاده کنید. به طور پیش فرض، gradle آن را در \build\libs
. اکنون، ما آماده هستیم تا فایل docker خود را بنویسیم. با استفاده از " مرجع Dockerfile " یک Dockerfile ایجاد خواهیم کرد. بیایید یک فایل به نام "Dockerfile" در ریشه پروژه جاوا خود (در همان محل اسکریپت ساخت) ایجاد کنیم. بیایید آن را برای ویرایش باز کنیم. این فایل فرمت خاص خود را دارد که در بخش " مرجع Dockerfile: Format " توضیح داده شده است. هر dockerfile با عبارت FROM شروع میشود که «تصویر پایه» را نشان میدهد. می توان گفت که این تصویر پدر و مادر است که بر اساس آن تصویر خود را می سازیم. انتخاب تصویر والدین برای ما بسیار آسان است. یک برنامه وب نیاز به وب سرور دارد. برای مثال می توانیم از وب سرور Tomcat استفاده کنیم. ما به مخزن رسمی Docker می رویم که به آن داکر هاب می گویند . ما به آنجا نگاه می کنیم تا ببینیم آیا تصویر مورد نیاز ما وجود دارد یا خیر:
docker pull tomcat:9-jre8-alpine
که از نسخه 9 تامکت، jre نسخه 8 و تصویر آلپاین به عنوان پایه استفاده میکند. این می تواند برای کاهش اندازه تصویر ما مهم باشد:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
و حالا بیایید دستور ساخت تصویر را اجرا کنیم: docker build -t jrdocker .
.
-t
- این یک تگ است، یعنی تصویر مونتاژ شده را چه می نامیم. نقطه در پایان به این معنی است که ما دایرکتوری فعلی (دایرکتوری که فایل docker در آن قرار دارد و دستور را از آنجا اجرا می کنیم) را به Build context
. Build context
- این زمینه فایل هایی است که هنگام ایجاد یک فایل docker در دسترس هستند. همانطور که می بینید، به لطف این ما توانستیم فایل جنگ مونتاژ شده را در تصویر خود، در فهرست وب سرور کپی کنیم. حالا بیایید تصویر خود را اجرا کنیم:docker run -d --rm -p 8888:8080 jrdocker
winpty docker exec -it NameКонтейнера sh
اکنون تنها چیزی که باقی میماند اتصال است. قبلاً EXPOSE را مشخص میکردیم ، یعنی اجازه دسترسی به پورت 8080 را از داخل کانتینر میدادیم. هنگامی که خود کانتینر را راهاندازی کردیم، تگ -p ( پورتهای ورودی ) را مشخص کردیم و در نتیجه پورت 8080 را روی کانتینر (وب سرور Tomcat) مرتبط کردیم. در آنجا منتظر اتصالات است) با پورت 8888 در دستگاهی با داکر دیمون. همانطور که به یاد داریم، ما داکر دیمون را نه به طور مستقیم، بلکه از طریق ماشین docker راه اندازی کردیم. بنابراین، بیایید یک بار دیگر با استفاده از دستور docker-machine ls اطلاعات مربوط به ماشینهای docker خود را بخواهیم و با سرور موجود در کانتینر تماس بگیریم:
لایه های
ما قبلاً متوجه شده ایم که تصاویر از dockerfiles ایجاد می شوند و dockerfiles مجموعه ای از دستورات هستند. ما همچنین متوجه شدیم که یک dockerfile یک والد دارد. و اینکه اندازه تصاویر متفاوت است. جالب اینجاست که می توانید تاریخچه نحوه ساخت تصویر را با استفاده از دستور docker history مشاهده کنید . مثلا:نتیجه
امیدوارم این مرور کوتاه کافی بوده باشد تا شما را به کانتینرسازی علاقه مند کند. در زیر پیوندهایی به مطالب اضافی وجود دارد که ممکن است مفید باشد:- بهترین روش ها برای نوشتن Dockerfiles
- کانتینر روی یک میزبان راه دور با استفاده از Docker Machine
- مقاله Habré " Docker. Begining "
- مقاله Habré " بهینه سازی تصاویر Docker ".
- Udemy: " شروع با Docker "
- یوتیوب: " درس های داکر از A تا Z "
- ویژگی های نرم افزار Docker [GeekBrains]
GO TO FULL VERSION