JavaRush /وبلاگ جاوا /Random-FA /اولین آشنایی با داکر
Viacheslav
مرحله

اولین آشنایی با داکر

در گروه منتشر شد
کانتینرسازی مکانیزمی است که اغلب در عمل استفاده می شود. برای مثال، وقتی در headhunter جستجو می‌کنید، تا امروز 477 جای خالی پیدا می‌کنید که به Docker اشاره شده است. بنابراین، بد نیست با آنچه که هست آشنا شوید. امیدوارم این بررسی کوتاه به ایجاد اولین برداشت کمک کند. خوب، او آن را با مطالب اضافی، مانند دوره‌های Udemy، پشتیبان می‌دهد. اولین معرفی Docker - 1

معرفی

در این بررسی کوتاه می خواهم به موضوعی مانند کانتینرسازی بپردازم. و باید با درک اینکه کانتینرسازی واقعا چیست شروع کنید. طبق ویکی‌پدیا، « کانتینرسازی » مجازی‌سازی در سطح سیستم‌عامل (یعنی نه سخت‌افزار) است که در آن هسته سیستم‌عامل به‌جای تنها یک نمونه، چند نمونه فضای کاربر جدا شده را حفظ می‌کند. " فضای کاربر " فضای آدرس حافظه مجازی سیستم عامل است که برای برنامه های کاربر رزرو شده است. نمونه‌های فضای کاربر (که معمولاً کانتینر نامیده می‌شوند) از نظر کاربر کاملاً با یک نمونه سیستم عامل منفرد یکسان هستند. هسته جداسازی کامل کانتینر را تضمین می کند، بنابراین برنامه های کانتینرهای مختلف نمی توانند روی یکدیگر تأثیر بگذارند. معلوم می شود که Containerization مجازی سازی نرم افزار است، یعنی مجازی سازی در سطح سیستم عامل که هسته سیستم عامل مسئول آن است. یکی از ویژگی های مشخصه این رویکرد این است که همه کانتینرها از یک هسته مشترک مانند سیستم عامل میزبان (یعنی هسته ای که کانتینرها روی آن قرار دارند) استفاده می کنند. این به شما امکان می دهد تا از شر سربار شبیه سازی سخت افزار مجازی و راه اندازی یک نمونه کامل از سیستم عامل خلاص شوید. می توان گفت که این مجازی سازی "سبک" است. هسته بخش مرکزی سیستم عامل است که برنامه های کاربردی را با دسترسی هماهنگ به منابع رایانه مانند زمان پردازنده، حافظه، سخت افزار خارجی و دستگاه های ورودی و خروجی خارجی فراهم می کند. هسته همچنین معمولاً خدمات سیستم فایل و پروتکل شبکه را ارائه می دهد. به طور کلی، این قلب کل سیستم است. برای اطلاعات بیشتر، مرور مطالب " اطلاعات عمومی در مورد ظروف " ممکن است مفید باشد. و چند کلمه دیگر برای کامل شدن مقدمه. اکنون متوجه شدیم که یک سیستم عامل دارای هسته است. این انزوا را برای نمونه های فضای کاربر فراهم می کند. در این زمینه، ممکن است با اصطلاح " cgroups " برخورد کنید. این نام مکانیزم هسته لینوکس است که به شما امکان می دهد به این هدف برسید. بنابراین می توان گفت مسیر کانتینری شدن با سیستم های لینوکس آغاز شد. با این حال، با شروع ویندوز 10، پشتیبانی از Containerization نیز ظاهر شد. برای کار با مجازی سازی، باید پشتیبانی مجازی سازی را در بایوس کامپیوتر خود پیکربندی کنید. نحوه انجام این کار به کامپیوتر بستگی دارد. به عنوان مثال، ممکن است به شکل زیر باشد:
اولین معرفی Docker - 2
در ویندوز می توانید این را به روش های مختلف بررسی کنید. برای مثال، می‌توانید یک ابزار ویژه را از وب‌سایت مایکروسافت دانلود کنید: ابزار تشخیص مجازی‌سازی به کمک سخت‌افزار . خوب، ارزش ذکر یک مفهوم مهم دیگر - Hypervisor را دارد. Hypervisor یک مانیتور ماشین مجازی است، برنامه ای برای اطمینان از اجرای موازی چندین سیستم عامل در یک کامپیوتر. Hypervisor تضمین می کند که سیستم عامل ها از یکدیگر جدا شده اند و منابع را بین سیستم عامل های در حال اجرا به اشتراک می گذارد. یکی از این Hypervisor ها Oracle VirtualBox است .
اولین معرفی Docker - 3

داکر

بنابراین، مجازی سازی چیست واضح است. اما چگونه از آن استفاده کنیم؟ و اینجا داکر به کمک ما می آید. Docker نرم افزاری برای خودکارسازی استقرار و مدیریت برنامه ها در محیط های کانتینری است. ارزش شروع با این واقعیت را دارد که داکر با مفهومی مانند Docker Enginge نشان داده می شود. و باید با وب سایت رسمی Docker و بخش " Docker Overview " شروع کنید.
اولین معرفی Docker - 4
مستندات می گوید که داکر شامل موارد زیر است:
  • سرور داکر به نام فرآیند داکر دیمون (dockerd).
  • رابط خط فرمان، همچنین به عنوان CLI (docker) شناخته می شود.
  • یک REST API که توضیح می‌دهد چگونه برنامه‌ها می‌توانند با دیمون «صحبت کنند» و به او بگویند که چه کاری انجام دهد.
قبل از غواصی بیشتر، اجازه دهید docker را نصب کنیم، یعنی داکر دیمون را نصب کنیم. وب سایت Docker دستورالعمل هایی برای نصب " Docker for Windows " دارد. جالب اینجاست که Docker سیستم مورد نیاز خود را دارد. و اگر شما مانند من یک ویندوز قدیمی دارید، مثلاً ویندوز 7، پس باید از Docker Toolbox استفاده کنید.
اولین معرفی Docker - 5

جعبه ابزار 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 - 6
بیایید یک ماشین جدید ایجاد کنیم. برای انجام این کار، باید دستور create : docker-machine create -- driver virtualbox javarush: را اجرا کنیم، گزارش ایجاد ماشین docker را مشاهده خواهیم کرد:
اولین معرفی Docker - 7
آنچه در اینجا ما را مورد توجه قرار می دهد موارد زیر است. Boot2Docker چیست؟ این یک توزیع مینیمالیستی لینوکس برای اجرای Docker Engine است (ما می‌دانیم که Docker به لطف ابزار مجازی‌سازی لینوکس کار می‌کند و در ویندوز مکانیسم لازم فقط با شروع ویندوز 10 ظاهر شد). این توزیع بر اساس توزیع " Tiny Core Linux " است. همچنین در مورد VirtualBox VM ذکر شده است. این به این دلیل است که ما مشخص کردیم --driver virtualbox. یک ماشین مجازی جدید در VirtualBox از تصویر Boot2Docker ایجاد شد. پس از ایجاد، می‌توانیم VirtualBox را راه‌اندازی کنیم (از آنجایی که VirtualBox با Docker Toolbox نصب شده است) و ماشین مجازی ایجاد شده را برای ماشین docker ببینیم:
اولین معرفی Docker - 8
پس از ایجاد، از ما خواسته می شود تا دستور " docker-machine env " را اجرا کنیم تا متغیرهای محیطی را که برای اتصال به ماشین داکر باید پیکربندی شوند، دریافت کنیم:
اولین معرفی Docker - 9
پس از اجرای این دستور با استفاده از docker-machine، ما به یک میزبان docker شده از راه دور (در این مورد، یک میزبان مجازی روی Virtual Box) متصل می‌شویم و می‌توانیم دستورات docker را به صورت محلی اجرا کنیم، گویی که آنها را روی یک میزبان راه دور اجرا می‌کنیم. برای بررسی، می توانیم دستور " docker info " را اجرا کنیم. اگر اتصال به دستگاه داکر برقرار نشود، با خطا مواجه می شویم. و اگر همه چیز خوب است، اطلاعاتی در مورد داکر در دستگاه داکر. اکنون زمان آن است که بفهمیم Docker به طور کلی چگونه کار می کند و چگونه از آن استفاده کنیم.
اولین معرفی Docker - 10

کانتینرهای داکر

بنابراین ما داکر داریم. اصلا این داکر چیست؟ مستندات Docker و بخش " شروع به کار " به ما در درک این موضوع کمک می کند . بخش مقدماتی این بخش به معرفی مفاهیم داکر می پردازد . بیان می کند که Docker یک پلت فرم برای توسعه، اشکال زدایی و اجرای برنامه های کاربردی در کانتینرها است. بنابراین، نکته اصلی برای Docker کانتینرها است. حتی اگر به لوگوی داکر نگاه کنید، این نهنگ است که ظروف را در پشت خود نگه می دارد. اما ظرف چیست؟ بعد در بخش « تصاویر و کانتینرها » می‌گوید که یک کانتینر یک نمونه در حال اجرا از Image است. و Image یک "بسته" است که شامل همه چیزهای لازم برای برنامه است (کد، محیط، کتابخانه ها، تنظیمات و غیره). حالا بیایید خودمان آن را امتحان کنیم. وب سایت داکر دارای بخشی به نام " نمونه های داکر " است که شامل " داکر برای مبتدیان " است. مثال های اینجا برای من جالب تر به نظر می رسند. بنابراین، ما ناگهان خواستیم با Alpine Linux آشنا شویم و می توانیم این کار را با استفاده از کانتینرهای Docker انجام دهیم. برای به دست آوردن یک تصویر، باید آن را "کشش" یا "کشیدن" کنیم. بنابراین، دستور docker pull را اجرا می کنیم :docker pull apline
اولین معرفی Docker - 11
همانطور که می بینیم، ما از جایی دانلود می کنیم. به طور پیش فرض، داکر به مخزن خود در شبکه https://hub.docker.com نگاه می کند . پس از بازیابی موفقیت آمیز تصویر، می توانیم با اجرای دستور docker images لیست تصاویر موجود را بررسی کنیم :
اولین معرفی Docker - 12
اکنون یک تصویر apline داریم. از آنجایی که کانتینر یک نمونه در حال اجرا از تصویر است، بیایید همین تصویر را اجرا کنیم. اجازه دهید ظرف را با استفاده از دستور اجرا کنیم docker run alpine. همانطور که می بینیم هیچ اتفاقی نیفتاده است. اگر دستور docker psنمایش تمام کانتینرهای فعال را اجرا کنیم، چیزی نیز دریافت نمی کنیم. اما اگر اجرا کنیم، docker ps -aهمه کانتینرها را خواهیم دید:
اولین آشنایی با داکر - 13
مسئله این است که ما Docker را در حالت تعاملی راه اندازی نکردیم. لذا فرمان را اجرا کرد و متوقف شد. دستور باز کردن ترمینال بود. بیایید همین کار را انجام دهیم، اما در حالت تعاملی (با پرچم -it ):
اولین معرفی Docker - 14
همانطور که می بینید، با غلبه بر یک اشتباه و با استفاده از اشاره، به ظرف رسیدیم و می توانیم در آن کار کنیم! برای خروج از ظرف بدون توقف عملکرد آن، می توانید فشار دهید Ctrl + p + q. اگر اکنون اجرا کنیم docker ps، یک کانتینر فعال خواهیم دید. برای وارد کردن یک کانتینر در حال اجرا، دستور docker exec را اجرا کنید :
اولین آشنایی با داکر - 15
توصیه می‌کنم توضیحات نمونه Docker را بخوانید تا توضیحی عالی درباره چگونگی این اتفاق بیفتد: " 1.0 اجرای اولین کانتینر ". من آن را دوست دارم زیرا همه چیز در آنجا به روشی بسیار قابل دسترس و قابل درک نوشته شده است. به طور خلاصه، ما با استفاده از docker-machine به یک ماشین مجازی که Docker Daemon را اجرا می کند متصل شده ایم. با استفاده از CLI روی REST API، از ما می‌خواهیم تصویر alpine را راه‌اندازی کنیم. داکر آن را پیدا می کند و بنابراین آن را دانلود نمی کند. Docker یک کانتینر جدید ایجاد می کند و دستوری را که در این کانتینر مشخص کرده ایم اجرا می کند. و همه اینها، البته، خوب است. اما چرا به این همه نیاز داریم؟ و در اینجا باید بفهمیم که داکر چگونه یک تصویر را ایجاد می کند. و آنها را بر اساس dockerfile ایجاد می کند.
اولین معرفی Docker - 16

Dockerfile

همانطور که در مرجع Dockerfile بیان شد ، dockerfile یک فایل متنی است که شامل تمام دستورات برای به دست آوردن یک تصویر است. در واقع، تمام تصاویری که دریافت می کنیم (حتی Alpine، از مثال بالا) از یک فایل docker ایجاد شده اند. بیایید تصویر خود را با یک برنامه جاوا بسازیم. و ابتدا به این برنامه جاوا نیاز داریم. پیشنهاد می کنم از سیستم ساخت Gradle استفاده کنید که می توانید در این بررسی کوتاه بیشتر در مورد آن بخوانید: " معرفی مختصر بر Gradle ". در ایجاد پروژه " پلاگین Gradle Build init " به ما کمک خواهد کرد. بیایید با استفاده از Gradle یک برنامه جاوا جدید بسازیم: gradle init --type java-application این دستور یک پروژه جاوا قالب ایجاد می کند. این یک برنامه مستقل است، اما ما می خواهیم یک برنامه وب ایجاد کنیم. بیایید کلاس های App و AppTest را حذف کنیم (آنها به طور خودکار توسط پلاگین Gradle Build Init تولید شدند). برای ایجاد سریع یک برنامه وب، از آموزش Gradle استفاده می کنیم: " ساخت برنامه های وب جاوا ". با توجه به آموزش، بیایید انجام دهیم: اینجا باید مراقب باشی مثل همیشه، ممکن است در مثال ها اشتباهاتی وجود داشته باشد. ایناهاش:
اولین معرفی Docker - 17
اکنون، برای آزمایش آن، بیایید افزونه gretty را به build.gradle اضافه کنیم، همانطور که در بخش " افزودن افزونه gretty و اجرای برنامه " نشان داده شده است:
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
جالب است که گرتی خطایی را HelloServletکه در بالا توضیح داده شد نمی بیند. این ثابت می کند که یک برنامه کاربردی می تواند در محیط های مختلف رفتار متفاوتی داشته باشد. گرتی می تواند در جایی کار کند که یک سرور مستقل معمولی با خطا مواجه شود. تنها چیزی که باقی می ماند این است که بررسی کنید که برنامه به درستی کار می کند. بیایید انجام دهیم:gradle appRun
اولین آشنایی با داکر - 18
اگر همه چیز خوب است، از دستور gradle warبرای جمع آوری آرشیو با پسوند جنگ (بایگانی وب) استفاده کنید. به طور پیش فرض، gradle آن را در \build\libs. اکنون، ما آماده هستیم تا فایل docker خود را بنویسیم. با استفاده از " مرجع Dockerfile " یک Dockerfile ایجاد خواهیم کرد. بیایید یک فایل به نام "Dockerfile" در ریشه پروژه جاوا خود (در همان محل اسکریپت ساخت) ایجاد کنیم. بیایید آن را برای ویرایش باز کنیم. این فایل فرمت خاص خود را دارد که در بخش " مرجع Dockerfile: Format " توضیح داده شده است. هر dockerfile با عبارت FROM شروع می‌شود که «تصویر پایه» را نشان می‌دهد. می توان گفت که این تصویر پدر و مادر است که بر اساس آن تصویر خود را می سازیم. انتخاب تصویر والدین برای ما بسیار آسان است. یک برنامه وب نیاز به وب سرور دارد. برای مثال می توانیم از وب سرور Tomcat استفاده کنیم. ما به مخزن رسمی Docker می رویم که به آن داکر هاب می گویند . ما به آنجا نگاه می کنیم تا ببینیم آیا تصویر مورد نیاز ما وجود دارد یا خیر:
اولین آشنایی با داکر - 19
همچنین شایان ذکر است که تصویر گربه تامکت نامیده می شود. اما علاوه بر نام یک برچسب دارد. یک برچسب مانند یک نسخه است. تصاویر تامکت نسخه های مختلف در کدام نسخه از تامکت، کدام نسخه از jre و کدام تصویر پایه استفاده می شود، متفاوت است. برای مثال، می‌توانیم یک تصویر دریافت کنیم docker pull tomcat:9-jre8-alpine که از نسخه 9 تامکت، jre نسخه 8 و تصویر آلپاین به عنوان پایه استفاده می‌کند. این می تواند برای کاهش اندازه تصویر ما مهم باشد:
اولین معرفی Docker - 20
همانطور که می بینیم، تفاوت بسیار زیاد است. اگر تصویر خود را بر اساس tomcata alpine بسازیم، فقط با 100 مگابایت شروع می کنیم و نه با 600. بر این اساس، محتوای زیر را به فایل docker که قبلا ایجاد شده است اضافه می کنیم:
# Базовый образ, "наследуемся" от него
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 ..
اولین آشنایی با داکر - 21
-t- این یک تگ است، یعنی تصویر مونتاژ شده را چه می نامیم. نقطه در پایان به این معنی است که ما دایرکتوری فعلی (دایرکتوری که فایل docker در آن قرار دارد و دستور را از آنجا اجرا می کنیم) را به Build context. Build context- این زمینه فایل هایی است که هنگام ایجاد یک فایل docker در دسترس هستند. همانطور که می بینید، به لطف این ما توانستیم فایل جنگ مونتاژ شده را در تصویر خود، در فهرست وب سرور کپی کنیم. حالا بیایید تصویر خود را اجرا کنیم:docker run -d --rm -p 8888:8080 jrdocker
اولین آشنایی با داکر - 22
برای درک اینکه آیا سرور شروع به کار کرده است، می توانید به گزارش از کانتینر نگاه کنید. گزارش را می توان با استفاده از دستور docker logs به دست آورد و ظرف را با شناسه یا نام آن مشخص کرد. مثلا:
اولین آشنایی با داکر - 23
خوب، فراموش نکنید که ما همیشه می‌توانیم با دستور به یک کانتینر در حال اجرا بر اساس نام برویم: winpty docker exec -it NameКонтейнера sh اکنون تنها چیزی که باقی می‌ماند اتصال است. قبلاً EXPOSE را مشخص می‌کردیم ، یعنی اجازه دسترسی به پورت 8080 را از داخل کانتینر می‌دادیم. هنگامی که خود کانتینر را راه‌اندازی کردیم، تگ -p ( پورت‌های ورودی ) را مشخص کردیم و در نتیجه پورت 8080 را روی کانتینر (وب سرور Tomcat) مرتبط کردیم. در آنجا منتظر اتصالات است) با پورت 8888 در دستگاهی با داکر دیمون. همانطور که به یاد داریم، ما داکر دیمون را نه به طور مستقیم، بلکه از طریق ماشین docker راه اندازی کردیم. بنابراین، بیایید یک بار دیگر با استفاده از دستور docker-machine ls اطلاعات مربوط به ماشین‌های docker خود را بخواهیم و با سرور موجود در کانتینر تماس بگیریم:
اولین معرفی Docker - 24
بنابراین، من و شما به تازگی برنامه وب خود را در یک ظرف Docker راه اندازی کرده ایم! ) به موارد زیر نیز توجه داشته باشم. در صورت بروز مشکل در دسترسی، باید به یاد داشته باشید که ماشین Docker در درجه اول یک ماشین مجازی Virtual BOx است. ممکن است در تنظیمات شبکه ماشین مجازی مشکلاتی وجود داشته باشد. یک پیکربندی VMBox در حال کار ممکن است به شکل زیر باشد:
اولین آشنایی با داکر - 25
اولین آشنایی با داکر - 26

لایه های

ما قبلاً متوجه شده ایم که تصاویر از dockerfiles ایجاد می شوند و dockerfiles مجموعه ای از دستورات هستند. ما همچنین متوجه شدیم که یک dockerfile یک والد دارد. و اینکه اندازه تصاویر متفاوت است. جالب اینجاست که می توانید تاریخچه نحوه ساخت تصویر را با استفاده از دستور docker history مشاهده کنید . مثلا:
اولین آشنایی با داکر - 27
گفتن این نکته برای درک این نکته مهم است که در اصل، هر تصویر مجموعه ای از تصاویر است. هر تغییر تصویر (هر دستور جدید در dockerfile) یک لایه جدید ایجاد می کند که شناسه مخصوص به خود را دارد. می توانید اطلاعات بیشتری در مورد لایه ها در مستندات " Docker: Images and Layers " بخوانید. من همچنین خواندن مقاله Habré را به شدت توصیه می کنم: " تصاویر داکر و کانتینرها در تصاویر ."

نتیجه

امیدوارم این مرور کوتاه کافی بوده باشد تا شما را به کانتینرسازی علاقه مند کند. در زیر پیوندهایی به مطالب اضافی وجود دارد که ممکن است مفید باشد: #ویاچسلاو
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION