چطور با داکر در محیطی یکسان با پروداکشن کد بنویسیم و پابلیش کنیم. قسمت اول

در سال ۱۹۵۶ مالکوم مک‌لین اولین کانتینر برای حمل توسط کشتی‌های باربری را اختراع کرد. قبل از اون بارها با  پانزده برابر هزینه بیشتر به طور دستی بارگیری و تخلیه می‌شدند. با اختراع کانتینر مشکل دزدی از بارها، از دست رفتن بارها حین جابجایی، مشکل چیدمان بهینه در کشتی‌ها و از همه مهمتر کند بودن پروسه بارگیری فراموش شد. یک اختراع انقلابی که صنعت را به کلی متحول کرد. در دنیای نرم‌افزارها اگر از VM‌ها بگذریم، تکنولوژی داکر به نظر می‌رسه همین تاثیر را خواهد داشت. در نهایت تیم‌های توسعه نرم‌افزاری فقط مسئول کد نوشتن نیستند. مسئولیت مهم‌تر ایجاد پروسه صحیح آپدیت‌های مداوم با کمترین زمان و هزینه‌ی روانی و مالی است.

در این نوشته نشون میدهم چطور یک پروژه روبی (اپلیکیشن به اضافه دیتابیس) را به داکر منتقل کنیم. در نوشته بعدی ایجاد روال آپدیت پروداکشن را بررسی می‌کنم.

پروژه‌ی فرضی در این نوشته یک پروژه‌ی ساده‌ی Ruby on Rails است که به دیتابیس Postgresql متصل شده. هدف نهایی این است که محیط دولوپمنت عینا مانند پروداکشن باشه، با  هر بار push کردن کد پروسه CI شروع بشه و پروژه به صورت یک Image داکر به پروداکشن منتقل بشه.

قدم اول. داکرایز کردن پروژه

اگر بار اولی است که می‌خواید داکر را تست کنید، بهتر از خوندن مقالات آموزشی مختلف شروع کنید. داکیومنت‌های رسمی داکر برای شروع کار کمی گیج کننده هستند. داکر را بر روی کامپیوترتان نصب کنید و مطمئن باشید داکر نصب شده. داکر در دو فرمت CE و EE عرضه شده که ما در اینجا به CE کار می‌کنیم.

حالا با ایجاد داکرفایل به داکر می‌گیم چطور باید Image پروژه را ایجاد کند. فایل زیر را ایجاد می‌کنیم و در روت پروژه قرار می‌دهیم.

توضیحات فایل گویا هستند. فقط در خط آخر به جای این‌که مستقیما دستور ران شدن سرور را اضافه کنیم، داکر را به سراغ فایل دیگری می‌فرستیم. در این فایل فقط خط زیر را قرار می‌دهیم:

این تکنیک دستمون را برای تغییرات بیشتر باز میگذاره. همین‌طور کمک خواهد کرد از یک داکر فایل برای ساخت چند داکر با پروسس‌های مختلف استفاده کنید.

حالا می‌تونیم برای اولین بار به داکر دستور ساخت ایمیج را بدهیم

از روی این ایمیج هنوز نمی‌تونیم پروژه را اجرا کنیم چون برای اتصال دیتابیس کاری انجام ندادیم ولی با دستور docker images  می‌تونید ایمیج ساخته شده را ببینید.

 

قدم دوم. داکر کامپوز

بهترین حالت پیاده سازی کانتینرها به شکلی است که هر کانتینر فقط یک کار انجام بده و بنابراین قابل Scale کردن باشد. پس برای ساخت دیتابیس  سراغ یک ایمیج و کانتینر جدید میریم. اما اگر قرار باشه برای هر ایمیجی یک داکر فایل درست کنیم و بعد برای اجرای پروژه تک تک شون را بالا بیاریم کار پر دردسری را شروع کردیم. اینجاست که داکر کامپوز به کارمون میاد. کامپوز اطلاعات تمام ایمیج‌های مورد نیاز را دریافت می‌کنه و با یک فرمان همه‌ی کانتینرها را بالا می‌آورد. فایل زیر را در روت پروژه ایجاد می‌کنیم:

و در فایل database.yml کانکشن استرینگ و مشخصات دیتابیس در کانتینر جدید را اعلام می‌کنیم:

چند نکته در مورد فایل کامپوز:

  • به جای این‌که برای کانتینر دیتابیس یک فایل داکر بسازیم، فقط به سادگی درخواست ایمیج رسمی دیتابیس را در فایل قرار می‌دهیم. ایمیج‌های رسمی هر پروژه‌ای معمولا توسط شرکت سازنده درست می‌شن و در داکر هاب قرار داده می‌شن. برای استفاده کافی‌ست اسم و ورژن را بنویسیم.  برای مثال صفحه‌ی ایمیج Postgres در داکرهاب را ببینید.
  • برای اپلیکیشن مشخص کردیم که پورت داخلی داکر بر روی پورت ۳۰۰۰ لوکال هاست مپ بشه. از این طریق می‌تونیم اپلیکیشن را ببینیم یا به عبارت بهتر پورت ۳۰۰۰ مثل دروازه ورود و خروج به کانتینترهای ما عمل می‌کنه. علاوه بر این دقت کنید که پورت را برای دیتابیس به شکل متفاوت تعریف کردیم. به این دلیل که نمی‌خواهیم دیتابیس از خارج شبکه کانتینرهای ما قابل دسترس باشد. اگر احتیاج به دسترسی مستقیم به این کانتینر داریم کافی است به جای5432 بنویسیم: 5432:5432

حالا با اجرای docker-compose build  ایمیج‌های تعریف شده در فایل کامپوز ساخته می‌شن و با اجرای docker-compose up  از روی هر ایمیجی یک کانتینر ساخته میشه و آماده‌ی به کار خواهد بود. با docker ps  می‌تونید لیست کانتینرهای ساخته  شده را ببینید و با رفتن به آدرس localhost:3000 پروژه در دسترس خواهد بود. اما اگر کدی را تغییر دادیم باید دوباره تمام این مراحل را طی کنیم؟ یعنی دوباره باید ایمیج ساخته بشه و کانتینرها را ران کنیم؟ در قدم بعدی سعی می‌کنیم این مشکل را رفع کنیم.

قدم سوم. داکر برای دولوپمنت

در دنیای داکر مفهومی به اسم volume وجود دارد و هرگاه در داکر فایل این عبارت را تعریف می‌کنیم به معنای اختصاص فضایی از حافظه برای استفاده توسط داکر ایمیج است. خط زیر را به فایل داکر کامپوز ,و زیر مجموعه‌ی بخش app اضافه می‌کنیم:

با این خط به داکر اعلام می‌کنیم که ورکینگ دایرکتوری که قبلا در فایل داکر برای پروژه اعلام کردیم، همان فولدر فعلی است که فایل کامپوز در اون قرار داده شده. به عبارت ساده یعنی اپلیکیشن را از فولدر دولوپمنت بخوان. به جای این‌که از داخل ایمیج خوانده بشود. حالا با اجرای دستورات migration و بالا آوردن کامپوز آماده‌ی به شروع کار هستیم. این بار با هربار تغییر احتیاجی نیست ایمیج جدید ساخته بشه و داکرها را دوباره ران کنیم:

 

تا اینجا فقط تونستیم اپلیکیشن را در داخل داکر اجرا کنیم. قدم بعدی ذخیره ایمیج‌ها و ایجاد ساز و کاری برای آپدیت پروداکشن توسط ایمیج‌های ساخته شده است. این کار را سعی می‌کنم در نوشته‌ی بعدی و با کمک سرویس‌‌ ایرانی اَبَر کلود انجام بدهم.

Leave a Reply

Your email address will not be published. Required fields are marked *