به عنوان یک توسعه دهنده، احتمالاً در مقطعی از زندگی حرفه ای خود نام Docker را شنیده اید. و احتمالاً میدانید که دانستن آن برای هر توسعهدهنده برنامه به فناوری مهمی تبدیل شده است. اگر هیچ ایده ای از آنچه من در مورد آن صحبت می کنم ندارید، نگران نباشید، این مقاله برای همین است. ما به سفری می رویم تا بفهمیم این Docker چیست و همه درباره آن صحبت می کنند و چه کاری می توانید با آن انجام دهید. در پایان، اولین ایمیج Docker خود را نیز ایجاد، منتشر و اجرا خواهیم کرد.
اما ابتدا، بیایید پایه و اساس داستان خود را بگذاریم. ابتدا بیاید در اینجا خلاصه ای از تاریخچه داکر را بررسی کنیم تا بتوانیم روی بخش های مهم تمرکز کنیم.
کمی تاریخچه کانتینر
Docker یک زمان اجرا کانتینر است. بسیاری از مردم فکر می کنند که داکر اولین در نوع خود بوده است، اما این درست نیست، کانتینرهای لینوکس از دهه 1970 وجود داشته اند. Docker هم برای جامعه توسعه و هم برای جامعه کانتینر مهم است زیرا استفاده از کانتینرها را به قدری آسان کرد که همه شروع به انجام آن کردند.
کانتینر چیست؟
کانتینرها یا کانتینر لینوکس، فناوریای هستند که به ما اجازه میدهند تا فرآیندهای هسته خاصی را جدا کرده و آنها را فریب دهیم تا فکر کنیم تنها آنهایی هستند که در یک رایانه کاملاً جدید اجرا میشوند. متفاوت از ماشینهای مجازی، یک کانتینر میتواند هسته سیستم عامل را به اشتراک بگذارد در حالی که فقط باینریها/کتابخانههای مختلف خود را با آنها بارگذاری میکند.
به عبارت دیگر، شما نیازی به نصب سیستم عامل های مختلف (به نام سیستم عامل مهمان) در داخل سیستم عامل میزبان خود ندارید. شما می توانید چندین کانتینر را در یک سیستم عامل واحد اجرا کنید بدون اینکه چندین سیستم عامل مهمان مختلف نصب شده باشد.
این باعث می شود کانتینر بسیار کوچکتر، سریعتر و کارآمدتر شوند. در حالی که چرخش یک ماشین مجازی حدود یک دقیقه طول می کشد و می تواند چندین گیگابایت وزن داشته باشد، یک کانتینر به طور متوسط بین 400 تا 600 مگابایت (بزرگترین آنها) وزن دارد.
چرخش آنها فقط چند ثانیه طول می کشد. این بیشتر به این دلیل است که آنها مجبور نیستند یک سیستم عامل کامل را قبل از اجرای فرآیند بچرخانند.
و این همه با شش چیز شروع شد.
میکروسرویس چیست؟ آشنایی با microservice ها
10 تا از دیزاین پترن های میکروسرویس ها برای معماری بهتر
ابتدای کانتینر
تاریخچه کانتینرها در سال 1979 با نسخه یونیکس نسخه 7 آغاز می شود. آیا کانتینرها قبلاً در سال 1979 وجود داشتند؟ نه! در سال 1979، نسخه 7 یونیکس یک فراخوانی سیستمی به نام chroot را معرفی کرد که همان آغاز چیزی بود که امروزه به عنوان مجازی سازی فرآیند می شناسیم. فراخوانی chroot به کرنل اجازه داد تا دایرکتوری ریشه ظاهری یک فرآیند و فرزندان آن را تغییر دهد. به طور خلاصه، فرآیند فکر میکند که به تنهایی در دستگاه اجرا میشود، زیرا سیستم فایل آن از همه فرآیندهای دیگر جدا است. همین syscall در سال 1982 در BSD معرفی شد. اما تنها دو دهه بعد بود که اولین کاربرد گسترده آن را داشتیم.
در سال 2000، یک ارائه دهنده میزبانی وب به دنبال راه های بهتری برای مدیریت وب سایت های مشتریان خود بود، زیرا همه آنها در یک دستگاه نصب شده بودند و برای منابع یکسان رقابت می کردند. این راه حل jails نامیده می شد و یکی از اولین تلاش های واقعی برای جداسازی مسائل در سطح فرآیند بود. Jails به هر کاربر FreeBSD اجازه میداد تا سیستم را به چندین سیستم مستقل و کوچکتر (که jails نامیده میشوند) تقسیم کنند. هر زندان می تواند پیکربندی IP و پیکربندی سیستم خود را داشته باشد.
Jails اولین راه حل برای گسترش استفاده از chroot بود تا نه تنها جداسازی در سطح فایل سیستم، بلکه مجازی سازی کاربران، شبکه، زیرسیستم ها و غیره را نیز مجاز کند. در سال 2008، LXC (کانتینرهای لینوکس) راه اندازی شد. در آن زمان، این اولین و کامل ترین پیاده سازی سیستم مدیریت کانتینر بود. از گروه های کنترل، فضاهای نام و بسیاری از آنچه تا آن زمان ساخته شده بود استفاده می کرد. بزرگترین پیشرفت این بود که مستقیماً از هسته یونیکس استفاده شد و به هیچ وصله ای نیاز نداشت.
داکر چیست؟
داکر یک پلتفرم نرمافزار متنباز است که برای ایجاد، استقرار و مدیریت کانتینرهای برنامه مجازیسازی شده بر روی یک سیستم عامل (OS)، با اکوسیستمی از ابزارهای متحد استفاده میشود. فناوری کانتینر داکر در سال 2013 معرفی شد. در آن زمان، شرکت داکر برای پشتیبانی از نسخه تجاری نرم افزار مدیریت کانتینر و حامی اصلی نسخه منبع باز تشکیل شد. Mirantis کسب و کار Docker Enterprise را در نوامبر 2019 خریداری کرد.
Docker به توسعهدهندگان نرمافزار راه سریعتر و کارآمدتری برای ساخت و آزمایش بخشهای کانتینری از یک برنامه نرمافزاری کلی میدهد. این به توسعه دهندگان در یک تیم اجازه می دهد تا چندین نرم افزار را همزمان بسازند. هر کانتینر حاوی تمام عناصر مورد نیاز برای ساختن یک جزء نرم افزاری و اطمینان از ساخت، آزمایش و استقرار روان است. Docker قابلیت حمل را برای زمانی که این کانتینر بسته بندی شده به سرورها یا محیط های مختلف منتقل می شوند را فعال می کند.
برای ایجاد محیط بک اند با استفاده از داکر می توانید این مقاله را بررسی کنید.
داکر چگونه کار می کند؟
Docker کانتینرها را تهیه و اجرا می کند. فناوری کانتینر از طریق سیستم عامل در دسترس است: یک کانتینر سرویس یا عملکرد برنامه را با تمام کتابخانهها، فایلهای پیکربندی، وابستگیها و سایر بخشها و پارامترهای لازم برای عملکرد بستهبندی میکند. هر کانتینر خدمات یک سیستم عامل اساسی را به اشتراک می گذارد. تصاویر Docker حاوی تمام وابستگیهای مورد نیاز برای اجرای کد در داخل یک کانتینر هستند، بنابراین کانتینرهایی که بین محیطهای Docker با سیستمعامل یکسان حرکت میکنند بدون تغییر کار میکنند.
داکر از جداسازی منابع در هسته سیستم عامل برای اجرای چندین کانتینر در یک سیستم عامل استفاده می کند. این با ماشینهای مجازی (VM) متفاوت است، که کل سیستمعامل را با کدهای اجرایی در بالای لایهای انتزاعی از منابع سختافزار فیزیکی کپسوله میکنند.
Docker برای کار بر روی پلتفرم لینوکس ایجاد شد، اما برای ارائه پشتیبانی بیشتر از سیستمعاملهای غیرلینوکس، از جمله Microsoft Windows و Apple OS X، گسترش یافت. نسخههای Docker برای خدمات وب آمازون (AWS) و Microsoft Azure در دسترس هستند.
جنگو در مقابل لاراول: کدام یک را انتخاب کنیم
چرا از Docker استفاده کنید
استفاده از Docker به شما امکان میدهد کد را سریعتر ارسال کنید، عملیات برنامه را استاندارد کنید، کد را یکپارچه جابهجا کنید و با بهبود استفاده از منابع، در هزینه خود صرفهجویی کنید. با Docker، یک شی واحد را دریافت می کنید که می تواند به طور قابل اعتماد در هر جایی اجرا شود. نحو ساده و سرراست Docker به شما کنترل کامل می دهد. پذیرش گسترده به این معنی است که یک اکوسیستم قوی از ابزارها و برنامه های کاربردی آماده وجود دارد که برای استفاده با Docker آماده هستند.
نرم افزارهای بیشتر را سریعتر ارسال کنید
کاربران Docker به طور متوسط نرم افزار را 7 برابر بیشتر از کاربران غیر Docker ارسال می کنند. Docker شما را قادر می سازد تا خدمات ایزوله را هر چند وقت یکبار که نیاز دارید ارسال کنید.
استاندارد کردن عملیات
برنامه های کوچک کانتینری استقرار، شناسایی مشکلات و بازگشت به عقب برای اصلاح را آسان می کند.
یکپارچه حرکت کنید
برنامه های مبتنی بر داکر می توانند به طور یکپارچه از ماشین های توسعه محلی به استقرار تولید در AWS منتقل شوند.
صرفه جویی در پول
کانتینرهای Docker اجرای کدهای بیشتر روی هر سرور را آسانتر میکنند و استفاده شما را بهبود میبخشند و در هزینه شما صرفهجویی میکنند.
زمان استفاده از Docker
شما می توانید از کانتینرهای Docker به عنوان یک بلوک اصلی برای ایجاد برنامه ها و پلتفرم های مدرن استفاده کنید. Docker ساخت و اجرای معماری میکروسرویس های توزیع شده، استقرار کد شما با pipeline های یکپارچه سازی و تحویل مستمر استاندارد شده، ساخت سیستم های پردازش داده بسیار مقیاس پذیر و ایجاد پلتفرم های کاملاً مدیریت شده برای توسعه دهندگان را آسان می کند. همکاری اخیر بین AWS و Docker، استقرار مصنوعات Docker Compose را در Amazon ECS و AWS Fargate برای شما آسانتر میکند.
MICROSERVICES
با استفاده از استقرار کدهای استاندارد شده با استفاده از کانتینرهای Docker، معماری های کاربردی توزیع شده را بسازید و مقیاس بندی کنید.
ادغام و تحویل مداوم
با استاندارد کردن محیطها و حذف تضاد بین پشتههای زبان و نسخهها، تحویل برنامه را تسریع کنید.
پردازش داده ها
پردازش کلان داده را به عنوان یک سرویس ارائه دهید. بسته بندی داده ها و بسته های تحلیلی در کانتینرهای قابل حمل که می توانند توسط کاربران غیر فنی اجرا شوند.
کانتینر به عنوان یک سرویس
ساخت و ارسال برنامه های کاربردی توزیع شده با محتوا و زیرساختی که توسط فناوری اطلاعات مدیریت شده و ایمن است.
گیت هاب اکشن چیست؟ همراه با مثال
موارد استفاده کلیدی برای Docker
در حالی که از نظر فنی استفاده از Docker برای توسعه و استقرار هر نوع برنامه نرم افزاری امکان پذیر است، انجام موارد زیر بسیار مفید است:
استقرار مداوم نرم افزار فناوری Docker و شیوههای قوی DevOps، بر خلاف برنامههای سنتی حجیم و یکپارچه که زمان بیشتری طول میکشد، امکان استقرار برنامههای کانتینری را در چند ثانیه ممکن میسازد. بهروزرسانیها یا تغییرات ایجاد شده در کد برنامه به سرعت در هنگام استفاده از کانتینرهایی که بخشی از pipeline یکپارچهسازی/تحویل پیوسته بزرگتر هستند، پیادهسازی و مستقر میشوند.
ساخت یک معماری مبتنی بر میکروسرویس. هنگامی که یک معماری مبتنی بر میکروسرویس نسبت به یک برنامه سنتی و یکپارچه سودمندتر است، Docker برای فرآیند ساخت این معماری ایده آل است. توسعهدهندگان چندین میکروسرویس را میسازند و به کار میگیرند که هر کدام در کانتینر مخصوص به خود هستند. سپس آنها را با هم ادغام می کنند تا یک برنامه نرم افزاری کامل را با کمک یک ابزار ارکستراسیون کانتینر، مانند Docker Swarm جمع آوری کنند.
انتقال برنامه های کاربردی قدیمی به یک زیرساخت کانتینری. یک تیم توسعه که میخواهد یک نرمافزار قدیمی از قبل موجود را مدرن کند، میتواند از Docker برای انتقال برنامه به یک زیرساخت کانتینری استفاده کند.
فعال کردن برنامه های ابری ترکیبی و چند ابری. کانتینرهای Docker چه در محل مستقر شده باشند و چه با استفاده از فناوری محاسبات ابری به همان روش عمل می کنند. بنابراین، Docker به برنامهها اجازه میدهد تا به راحتی به محیطهای تولید و آزمایش فروشندگان ابری مختلف منتقل شوند. یک برنامه Docker که از چندین پیشنهاد ابری استفاده می کند را می توان ابر ترکیبی یا چند ابری در نظر گرفت.
معماری داکر: اجزا و ابزارها
Docker Community Edition منبع باز است، در حالی که Docker Enterprise Edition یک نسخه تجاری شده است که توسط Docker Inc. ارائه شده است.
Docker Engine فناوری زیربنایی است که وظایف و گردش های کاری مربوط به ساخت برنامه های کاربردی مبتنی بر کانتینر را انجام می دهد. این موتور یک فرآیند دیمون سمت سرور ایجاد می کند که میزبان ایمیج ها، کانتینرها، شبکه ها و حجم های ذخیره سازی است.
دیمون همچنین یک رابط خط فرمان سمت سرویس کلاینت (CLI) را برای کاربران فراهم می کند تا از طریق رابط برنامه نویسی برنامه Docker با دیمون تعامل داشته باشند. کانتینرهایی که توسط داکر ایجاد می شوند، Dockerfiles نامیده می شوند. فایلهای Docker Compose ترکیب اجزای یک کانتینر Docker را تعریف میکنند.
سایر اجزا و ابزار در معماری داکر شامل موارد زیر است:
داکر هاب. این ابزار نرمافزار بهعنوان سرویس به کاربران اجازه میدهد برنامههای مبتنی بر کانتینر را از طریق یک کتابخانه مشترک منتشر و به اشتراک بگذارند. این سرویس دارای بیش از 100000 برنامه کاربردی در دسترس عموم و همچنین ثبت کانتینرهای عمومی و خصوصی است.
رجیستری مورد اعتماد (Trusted Registry) این یک مخزن شبیه به داکر هاب است اما دارای یک لایه کنترل و مالکیت اضافی بر ذخیره و توزیع تصاویر کانتینر است.
Docker Swarm. این بخشی از Docker Engine است که از متعادلسازی بار کلاستر برای Docker پشتیبانی میکند. منابع میزبان چندگانه Docker در Swarm با هم ترکیب شدهاند تا بهعنوان یکی عمل کنند، که به کاربران امکان میدهد به سرعت استقرار کانتینر را به میزبانهای متعدد مقیاس دهند.
هواپیمای کنترل جهانی(Universal Control Plane) این یک رابط مدیریت برنامه و کلاستر مبتنی بر وب است.
Compose. این ابزار برای پیکربندی خدمات برنامه چند کانتینری، مشاهده وضعیت کانتینر، خروجی گزارش جریان و اجرای فرآیندهای تک نمونه استفاده می شود.
اعتماد محتوا (Content Trust) این ابزار امنیتی برای تأیید یکپارچگی رجیستری های Docker راه دور، از طریق امضای کاربر و تگ های ایمیج استفاده می شود.
همچنین چالش های بالقوه ای با Docker وجود دارد:
مدیریت کارآمد تعداد کانتینرهای ممکن در یک شرکت دشوار است.
استفاده از کانتینر از میزبانی مجازی گرانول به هماهنگی اجزا و منابع برنامه در حال تکامل است. در نتیجه، توزیع و اتصال به برنامه های کاربردی، که می تواند صدها کانتینر زودگذر را شامل شود به یک مانع بزرگ تبدیل می شود.
در سال های اخیر، Docker توسط Kubernetes برای ارکستراسیون کانتینر جایگزین شد. با این حال، اکثر پیشنهادات Kubernetes در واقع Docker را در پشت صحنه اجرا می کنند.
امنیت داکر
یک مشکل پایدار تاریخی در مورد کانتینرها و به طور گسترده Docker امنیت است. با وجود انزوای منطقی عالی، کانتینرها همچنان سیستم عامل میزبان را به اشتراک می گذارند. یک حمله یا نقص در سیستمعامل زیربنایی میتواند به طور بالقوه همه کانتینرهایی را که در بالای سیستمعامل اجرا میشوند به خطر بیاندازد. آسیبپذیریها میتوانند شامل دسترسی و مجوز، ایمیج کانتینر و ترافیک شبکه در بین کانتینرها باشند. تصاویر داکر ممکن است به طور پیشفرض دسترسی ریشه به میزبان را حفظ کنند، اگرچه این اغلب از بستههای فروشندههای شخص ثالث منتقل میشود.
داکر به طور مرتب پیشرفتهای امنیتی را به پلتفرم داکر اضافه کرده است، مانند اسکن ایمیج، معرفی گره امن، هویت گره رمزنگاری، تقسیمبندی خوشهای و توزیع مخفی امن. مدیریت secrets داکر همچنین در Kubernetes و همچنین CISOfy Lynis، D2iQ و HashiCorp Vault وجود دارد. ابزارهای مختلف اسکن امنیتی کانتینر از Aqua Security، SUSE's NeuVector و دیگران پدیدار شده اند.
برخی از سازمان ها کانتینرها را در یک VM اجرا می کنند، اگرچه کانتینرها به ماشین های مجازی نیاز ندارند. این بردار مشکل منبع مشترک را حل نمی کند، اما تاثیر بالقوه یک نقص امنیتی را کاهش می دهد.
جایگزین دیگر استفاده از ماشین های مجازی با مشخصات پایین تر یا "میکرو" است که نیازی به سربار مشابه یک ماشین مجازی معمولی ندارند. به عنوان مثال می توان به آمازون Firecracker، gVisor و کانتینرهای کاتا اشاره کرد. مهمتر از همه، رایجترین و توصیهشدهترین مرحله برای اطمینان از امنیت کانتینر این است که میزبانهای کانتینر را در معرض اینترنت قرار ندهید و فقط از تصاویر کانتینر از منابع شناختهشده استفاده کنید.
امنیت همچنین نقطه اصلی فروش جایگزینهای Docker، بهویژه rkt، موشک CoreOS بود. با این حال، داکر گامهایی برای بهبود گزینههای امنیتی خود برداشته است، در حالی که در همان زمان، شتاب برای آن جایگزینهای کانتینر کمرنگ شده است.
چرا کانتینر داکر عالی هستند
احتمالاً این عبارت نمادین "این روی سیستم من کار می کند" را شنیده اید. خوب، چرا آن دستگاه را به مشتری نمی دهیم؟
این دقیقاً مشکلی است که Docker و کانتینرها به طور کلی حل می کنند. کانتینر Docker مجموعه ای بسته بندی شده از تمام کتابخانه ها و وابستگی های برنامه است که از قبل ساخته شده و آماده اجرا هستند. بسیاری از شرکتها از ماشینهای مجازی به کانتینرها مهاجرت کردهاند، نه تنها به این دلیل که سبکتر و سریعتر در چرخش هستند، بلکه به این دلیل که نگهداری از آنها بسیار آسان است.
یک کانتینر را می توان با استفاده از Dockerfile آن نسخه کرد (در بخش بعدی به ایمیج خواهیم رسید)، بنابراین اجرای و نگهداری کل اکوسیستم کانتینرها را برای یک توسعه دهنده (یا حتی تیم کوچکی از توسعه دهندگان) بسیار آسان می کند. از سوی دیگر، فقط برای اینکه بتوانید VM ها را راه اندازی و نگهداری کنید، به یک زیرساخت نیاز دارید.
آیا این بدان معناست که ما دیگر به VM نیاز نداریم؟ نه، برعکس، اگر می خواهید یک سیستم عامل کامل برای هر مشتری داشته باشید یا فقط به کل محیط به عنوان جعبه شنی نیاز دارید، ماشین های مجازی هنوز هم بسیار مورد نیاز هستند. هنگامی که شما یک رک سرور بزرگ و چندین مشتری دارید که از آن استفاده می کنند، ماشین های مجازی معمولاً به عنوان لایه های میانی استفاده می شوند.
سهولت استفاده و قابلیت نگهداری ما را به جنبه مهم دیگری از اینکه چرا کانتینرها بسیار عالی هستند هدایت می کند: استفاده از کانتینرها برای یک شرکت بسیار ارزان تر از ماشین های مجازی تمام عیار است.
این به این دلیل نیست که زیرساخت یا سختافزار ارزانتر است، بلکه به این دلیل است که به افراد کمتری برای نگهداری از کانتینر نیاز دارید، به این معنی که میتوانید تیم خود را بهتر سازماندهی کنید تا به جای تمرکز بر خانه داری، روی محصول تمرکز کند.
هنوز هم مربوط به صرفه جویی است، یک ماشین مجازی با اندازه متوسط می تواند حدود 3 تا 8 کانتینر را اجرا کند. این بستگی به این دارد که کانتینرهای شما از چه تعداد منابع استفاده می کنند و چه مقدار از سیستم عامل اصلی نیاز دارد تا قبل از اجرای کل برنامه راه اندازی شود.
برخی از زبانها، مانند Go، به شما اجازه میدهند که تنها با باینری کامپایل شده و هیچ چیز دیگری یک ایمیج بسازید. این بدان معناست که کانتینر Docker برای بارگیری بسیار کمتر خواهد بود و بنابراین از منابع کمتری استفاده می کند. به این ترتیب میتوانید کانتینرهای بیشتری را در هر VM بچرخانید و از سختافزار خود به طور موثرتری استفاده کنید.
از آنجایی که کانتینرها زودگذر ساخته شدهاند، این بدان معناست که تمام دادههای داخل آنها هنگام حذف کانتینر از بین میرود. این عالی است، زیرا میتوانیم از کانتینرها برای کارهای انفجاری مانند CI استفاده کنیم.
استفاده از کانتینرها سطح جدیدی از پیشرفت های DevOps را به ارمغان آورده است. اکنون می توانید به سادگی تعداد زیادی کانتینر را بچرخانید، که هر کدام یک مرحله کوچک از خط لوله استقرار شما را انجام می دهند، و سپس بدون نگرانی آنها را بکشید اگر چیزی را پشت سر گذاشتید.
ماهیت بدون حالت کانتینرها آنها را به ابزاری عالی برای بارهای کاری سریع تبدیل می کند.
حالا که دیدیم کانتینرها چقدر عالی هستند، بیایید بفهمیم که چگونه می توانیم یکی از آنها را بسازیم! برای آشنایی با 10 تا از بهترین کانتینر ها می توانید این مقاله را بررسی کنید.
Docker Images چیست؟
ایمیج Docker دستورالعمل هایی هستند که در یک فایل خاص به نام Dockerfile نوشته می شوند. این سینتکس خاص خود را دارد و مشخص می کند که Docker چه مراحلی را برای ساخت کانتینر شما انجام خواهد داد.
از آنجایی که کانتینرها فقط لایه روی لایه تغییرات هستند، هر دستور جدیدی که در یک ایمیج داکر ایجاد می کنید، یک لایه جدید در کانتینر ایجاد می کند. آخرین لایه چیزی است که ما آن را لایه نازک قابل نوشتن می نامیم. یک لایه خالی که کاربر می تواند آن را تغییر داده و با استفاده از دستور docker commit کامیت شود.
این یک نمونه از یک ایمیج ساده برای یک برنامه Node.js است:
FROM node:stable
COPY . /usr/src/app/
RUN npm install && npm run build
EXPOSE 3000
ENTRYPOINT ["npm", "start"]
در این مثال ساده، ما در حال ایجاد یک ایمیج جدید هستیم. همه ایمج ها بر اساس یک ایمیج موجود یا یک ایمیج خراشیده هستند.
این تصاویر از یک Container Registry، یک مخزن برای ذخیره ایمج کانتینرها دانلود می شوند. رایج ترین آنها Docker Hub است، اما شما همچنین می توانید با استفاده از راه حل های ابری مانند Azure Container Registry، یک خصوصی ایجاد کنید.
وقتی Docker build را اجرا می کنید. در همان دایرکتوری Dockerfile، Daemon Docker شروع به ساخت ایمیج و بسته بندی آن می کند تا بتوانید از آن استفاده کنید. سپس می توانید <docker run image-name>
را برای راه اندازی یک کانتینر جدید اجرا کنید.
توجه داشته باشید که پورت های خاصی را در Dockerfile در معرض دید قرار می دهیم. Docker به ما اجازه می دهد تا شبکه ها را در سیستم عامل خود جدا کنیم، به این معنی که می توانید پورت ها را از رایانه خود به کانتینر و بالعکس نگاشت کنید. همچنین، می توانید دستورات را در داخل کانتینرها با docker exec اجرا کنید. بیایید این دانش را عملی کنیم.
برای آشنایی با نحوه ایجاد پروژه لاراول با داکر می توانید این مقاله را بررسی کنید.
نحوه استقرار برنامه Dockerized
این یک راهنمای ساده و آسان در مورد نحوه ایجاد یک ایمیج Docker پایه با استفاده از سرور Node.js و اجرای آن بر روی رایانه شما خواهد بود.
ابتدا یک پروژه جدید را در دایرکتوری انتخابی خود شروع کنید و npm init -y
را اجرا کنید تا یک فایل package.json
جدید ایجاد کنید. حال بیایید دایرکتوری دیگری به نام src
ایجاد کنیم. در این دایرکتوری ما یک فایل جدید به نام server.js
ایجاد می کنیم.
اکنون در فایل package.json
خود، کلید اصلی را به src/server.js
تغییر دهید. همچنین، اسکریپت آزمایشی ایجاد شده را حذف کنید و آن را با "start" جایگزین کنید: "node src/server.js". فایل شما باید به این صورت باشد:
{
"name": "your-project",
"version": "1.0.0",
"description": "",
"main": "src/server.js",
"scripts": {
"start": "node src/server.js"
},
"keywords": [],
"author": "",
"license": "ISC"
}
اکنون یک فایل به نام Dockerfile (بدون پسوند) ایجاد کنید. بیایید ایمیج خود را بنویسیم!
FROM node:lts-alpine
COPY . /usr/src/app/
WORKDIR /usr/src/app
EXPOSE 8089
ENTRYPOINT ["npm", "start"]
بیایید این را توضیح دهیم:
ابتدا ایمیج گره را از داکر هاب دریافت می کنیم. از آنجایی که ایمیج با نام خود ذخیره می شوند، ما تصاویر را با برچسب آنها متمایز می کنیم. در اینجا می توانید همه برچسب ها را بررسی کنید.
در مرحله بعد، ما از COPY برای کپی کردن همه فایلها در dir فعلی (با استفاده از .) در یک dir جدید در کانتینر به نام /usr/src/app استفاده میکنیم. دایرکتوری به طور خودکار ایجاد می شود. این ضروری است زیرا ما به تمام فایل های برنامه خود در آنجا نیاز داریم.
اکنون دایرکتوری شروع خود را به دایرکتوری /usr/src/app تغییر می دهیم، بنابراین می توانیم موارد را از دایرکتوری ریشه برنامه خود اجرا کنیم.
ما بندر خود را افشا می کنیم،
و ما می گوییم که به محض اینکه کانتینر ما اجرا شود، "npm start" را اجرا می کنیم.
بیایید ایمیج را با اجرای docker build بسازیم. -t simple-node-image. به این ترتیب ایمیج خود را تگ می کنیم و نامی برای آن می گذاریم.
خواهید دید که قرار است ایمیج را به همراه تمام لایه های لازم ایجاد و دانلود کند. بیایید این ایمیج را با دستور زیر اجرا کنیم:
docker run -p 80:8089 simple-node-image
ما در حال نگاشت پورت 80 خود به پورت 8089 داخل کانتینر هستیم. ما می توانیم با تایپ کردن docker ps مانند این بررسی کنیم.
نتیجه
همانطور که می بینید، بیشتر استفاده های Docker برای آسان کردن زندگی برنامه نویسان هنگام توسعه برنامه ها است. اما کاربردهای بسیار دیگری نیز وجود دارد، مانند لایههای زیرساختی و آسانتر کردن خانهداری برنامههای شما.