کانتینر امکانی را برای دولوپرهای زبانهای مختلف منجمله جاوا فراهم کرده که از آن طریق ایشان به شعار زبان برنامهنویسی جاوا موسوم به «یکبار بنویس، همهجا اجرایش کن» نزدیکتر شوند بدین معنی که تمام سورسکد اپلیکیشن در یک فایل JAR به صورت پکیج ارائه شده که از طریق ماشین مجازی جاوا (JVM) و در هر پلتفرمی قابلاجرا است اما این در حالی است که قرار دادن یک اپلیکیشن جاوا در کانتینر کار سادهای نبوده و دولوپرهای جاوا به منظور انجام این کار بایستی مراحل مختلفی را طی کنند.
به نظر میرسد که تمام دولوپرهای جاوا با سازوکار کانتینرها آشنا نبوده و نمیتوانند مراحل زیر را به منظور راهاندازی یک اپلیکیشن جاوا در کانتینر شخصاً انجام دهند که عبارتند از:
- نصب Docker روی سیستم خود
- نوشتن اسکریپتهایی در فایلی تحت عنوان Dockerfile که که چگونگی بیلد اپلیکیشن را بیان میکنند
- اجرای Docker Daemon به عنوان روت پروژه و سپس انتظار برای اِتمام پروسهٔ بیلد اپلیکیشن
- در نهایت دیپلوی یکسری Image Container تولیدشده در ریپازیتوری
در پاسخ به این سؤال که Image Container چیست، بایستی گفت که یک کانتینر به صورت لایههایی از یکسری به اصطلاح Image تشکیل شده است که در آن Base Image (تصویر اصلی) به عنوان کانتینر اصلی در نظر گرفته میشود و شامل سیستمعامل، فایلهای پیکربندی و دیپندسیهایی نظیر لایبرریها و فریمورکها است اما سایر ایمِیجها به آن وابسته هستند. چنین ساختاری برای کانتینرها موجب میشود تا بخشهای مختلف اپلیکیشن قابلیت استفادۀ مجدد داشته باشند؛ به عبارت دیگر، دولوپرها برای توسعهٔ هر بخش از اپلیکیشن نیاز به تکرار تمام مراحل نداشته و تنها لایههای تغییریافته را در ریپازیتوی به اصطلاح پوش کنند.
آشنایی با Jib
Jib ابزاری است که گوگل برای رفع مشکلاتی از این دست به صورت اپنسورس معرفی کرده است که دولوپرها با استفاده از آن و سایر ابزارهای زبان جاوا (همچون Maven و Gradle) میتوانند اپلیکیشنهای خود را در کانتینرها قرار دهند. در واقع، با استفاده از Jib فرآیند ساخت ایمِیج بسیار ساده و سریع انجام میشود به طوری که تمام مراحل پکیج کردن اپلیکیشن به منظور ساخت کانتینرها به یک مرحله کاهش مییابد (جهت آشنایی بیشتر با مفهوم کانتینر، میتوانید به مقالهٔ Container (کانتینر) چیست و چه تفاوتهایی با Virtual Machine (ماشین مجازی) دارد؟ مراجعه نمایید.)
همچنین دولوپرها با استفاده از این ابزار دیگر نیازی به ایجاد Dockerfile و یا نصب داکر روی سیستم خود نخواهند داشت چرا که Jib به مانند پلاگینی با ابزارهای Maven و Gradle یکپارچه شده و به منظور ساخت کانتینر مورد استفاده قرار میگیرد که در نهایت فایل JAR به همراه تمام دیپندسیهای آن ساخته میشود (لازم به ذکر است که ابزارهای Maven و Gradle اپنسورس بوده و قابلیت بیلد اتوماتیک نرمافزار را دارند.)
چگونه این پلاگین روند توسعه را بهبود میبخشد؟
این ابزار از مزایای لایهبندی ایمِیجها برخوردار است و در سیستم دولوپر با سایر ابزارهای بیلد اپلیکیشن ادغام میشود تا فرآیند بیلد کانتینر ایمِیجهای اپلیکیشن را بهینه کند که در ادامه هر یک از این روشها را بیان میکنیم:
- پیادهسازی با زبان جاوا: Jib با زبان جاوا پیادهسازی شده است و همانطور که پیشتر گفتیم با Maven و Gradle ادغام شده و اپلیکیشن را به صورت اتوماتیک بیلد میکند که بدین ترتیب دولوپرها دیگر نیازی به Dockerfile و اجرای یک Docker Daemon نداشته و لزومی ندارد تا در مورد ساخت فایلهای حجیم JAR با تمام دیپندسیهای آن نگرانی داشته باشند و از آنجایی که Jib کاملاً با ابزارهای فوقالذکر به منظور بیلد اپلیکیشن ادغام میشود، بنابراین به تمام اطلاعات لازم برای پکیج کردن اپلیکیشن دسترسی داشته و هرگونه تغییر در بیلد اپلیکیشن به صورت خودکار طی بیلدهای بعدی در کانتینر اِعمال میشود.
- قابلیت کَش: Jib از مزیت لایهبندی ایمیجها و همچنین قابلیت کَش کردن رجیستری برخوردار بوده و همین مسئله نیز موجب شده است تا فرآیندهای بیلد در آن بسیار سریع و کامل انجام شود. به علاوه اینکه Jib با دسترسی به فایل پیکربندی مربوط به بیلد، اپلیکیشن را به لایههای متمایز تقسیم میکند (لایههایی نظیر دیپندسیها، ریسورسها، کلاسها) و صرفاً لایههایی که دچار تغییر شدهاند را مجدداً بیلد کرده و در ریپازیتوری پوش میکند؛ به عبارت دیگر، هنگامی که سرعت در انجام یک پروژه فاکتوری مهم باشد، با استفاده از Jib میتوان در هر بیلد تنها لایههای تغییریافته را به جای کل اپلیکیشن در ریپازیتوری پوش کرد و بدین ترتیب در زمان دولوپرها نیز صرفهجویی خواهد شد.
- یکپارچگی با سایر ابزارهای بیلد: همانطور که پیش از این اشاره شد، Jib با ابزارهای Maven و Gradle ادغام شده و قابلیت بیلد کانتینرها را دارا است و بدین ترتیب دولوپرها میتوانند این ابزار را بهگونهای کانفیگ کنند تا در صورت بیلد مجدد کانتینرها با ورودیهای بدون تغییر، ایمِیجها نیز آپدیت نشده و همان ایمِیجها مجدداً تولید شوند؛ به عبارت دیگر، بهروزرسانیهای غیرضروری روی کانتینرها اِعمال نخواهند شد.