‌ تجربه deploy پروژه با git و Dockerize در Production

امروز میخوام راجع یه تجربه ای که داشتم صحبت کنیم.قصه از اینجا شروع میشه که میخواستم یه پروژه از یه سروری به یک سرور بهتر در ابر آراون انتقال بدیم.یکی از دلایلش محدودیت در سرور قبلی بود.چون هاست اشتراکی بود.الان هم نمیخوام راجع به کامند های نصب حرف بزنم چون با سرچ به دست میاد.خب هدف های زیادی داشتیم و یکیش اینکه بتونیم بیشتر داکر رو یاد بگیریم و همچنین deploy راحت تر و اصولی تری داشته باشیم.docker container conceptقیل و قال ها مثه کتاب فیلم درس مدرک رو بزاریم کنار خیلی چیز ها با قیمت تجربه به دست میاد.راه اندازی Dockerبعد از ssh تو سرور طبق معمول فراید نصب داکر رو جلو رفتیم و بعد از اون docker-compose رو نصب کردم و چند روز قبلش یه پکیج docker-compose خیلی خوب و ساده برای نصب lamp پیدا کردم که شدیدا پیشنهاد میشه.حتما برای یادگیری بهتر این پیکج رو ببینید.بعد از فرایند راه اندازی در کمتر از چند دقیقه باورکردنی نبود که حسابی از شر کانفیگ های تکراری و مسخره راحت شدم!.نصب lamp روی لینوکس ممکنه وقت گیر و اذیت کننده باشه مخصوصا اگر اشتباهی در بعضی از مراحل انجام بدید.خلاصه یکی از مزایای داکر همین قضیه هست که شما تقریبا کانفیگ رو کمتر باهاش درگیر میشید.در واقع بهتره بگیم container داکر قبلا توسط فردی کانفیگ شده و شما دارید از اون استفاده می کنید.البته در مواقعی هم نیاز هست البته یک سری تغییرات داخل container ایجاد کنید و یسری کانفیگ ها رو اعمال کنید.در واقع یکسری لایه های انتزاعی واسه این قبیل تغییرات در داکر وجود داره.Don't try this ad home!چالش هایی هم وجود داره که ممکنه اوایل کار یکم اذیت کننده باشه ولی چیزی نیست که حل نشدنی نباشه.ولی اگر با لینوکس و دستورات اون اشنا نیستید و یا تا به حال کانفیگ سرور انجام نداده اید حتی در لوکال خودتون. پیشنهاد میشه که اول این مراحل رو بگذرونید بعد وارد دنیای docker بشید.چگونگی Deploy پروژه با استفاده از gitخب تو این مرحله میخواییم بروزرسانی کد پروژه با استفاده از git انجام بدیم.یعنی میخواییم با استفاده از push گیت کد های نرم افزار بروزرسانی بشوند.البته لازم به ذکر هست که راه های خیلی اصولی تری هست برای اینکار مثله نصب gitlab و یا حتی استفاده از سرویس خوده ابر اروان.ولی در scale که خودمون داشتیم این یه مقدار بزرگ بود و فعلا نیازی به اون نبود و همچنین داکیومنت ابر اروان در مورد این قضیه زیاد کامل نبود.یه جاهای ابهاماتی داشت که رغبت نکردم سمتش برم.اول باید bare repository درست کنیم.که اونجا محل نگهداری repository خودمون هست.دوم باید بریم سراغ git hooks که وظیفه اجرای یسری از فرایند ها رو بعد از یکسری اتفاق ها داره که ما باید بهش بگیم بعد از git push چه روندی رو طی کنه.مسیر hooks داخل /var/www/project/.git/hooks/هستش و اینجا باید یه فایل به نام post-receive درست کنیم.#!/bin/bash # The production directory WWW=&quot/home/Mehdi/docker/docker-compose-lamp/www/website/example&quot # The Git repo GIT=&quot/home/Mehdi/docker/docker-compose-lamp/www/repository/example.git&quot # Deploy the content to the www directory git --work-tree=$WWW --git-dir=$GIT checkout -f cd $WWW || exit # Do stuff like starting docker این فایل بعد از هر push گیت اجرا میشه و کد ما رو با تغییرات جدید بروز میکنه البته برای جزعیات بیشتر خوندن این مقاله شدیدا پیشنهاد میشه.مثلا شاید اصولی تر این باشه که پروژه اول داخل یک فایل tmp ریخته بشه اونجا عملیات های composer npm انجام بشه و بعد پروژه اصلی حذف بشه و پروژه از فولدر tmp به فولدر اصلی منتقل بشه.میشه اسم این فرایند رو CI نام گذاشت ولی خب تو این scale واقعا نیاز نداشتیم و واسه پروژه هایی که زیاد بزرگ نیستند پیشنهاد نمیشه چون یسری چالش ممکنه درست کنه.شخصی سازی Container هاقطعا شما یکسری نیازها دارید که بصورت پیش فرض داخل کانتینر ها تعبیه نشده.مثلا میخوایین مقدار رم مصرفی php رو زیاد کنید و شاید در یک کار بزرگ تر میخوایین یسری کرون داخل هر کانتینر برای یکسری مقاصد مختلف اجرا بشه.مثلا فرایند بکاپ گیری از دیتابیس و اپلود اون داخل یک سرور دیگه رو ما داشتیم.یه مقداری چالشی بود ولی حل شد.چالشی از این لحاظ که سرویس کرون باید همزمان با up شدن container ها start بشن و شما نمیتونید تو build کرون استارت کنید.چون docker build برای ساخت یک temporaries کانتینر هست و run سرویس ها در اینجا انجام نمیشه.اینجا بود که ENTRYPOINT داخل فایل داکر باید استفاده بشه.یکی از اشتباه ها اینه که داخل کانتینر ssh کنیم و اونجا خودمون تغییرات رو بدیم.که به نظر من توصیه نمیشه چون داکر فایل وجود داره برای انجام همین کارها و این خودش یعنی حذف صورت مسئله .مگر اینکه قصد دیباگ دارید.درضمن بعضی تغییرات داخل کانتینر بعد از build از بین خواهد رفت.پس بهتر از خودمون تز ندیم!. راستی یکم هم shell script و یا حتی python هم میتونه بهتون کمک کنه.مثلا میخوایین یسری کامندها بعد از up کانتینر اجرا بشه شما به راحتی میتونید یه shell script رو اجرا کنید.FROM mysql:5.7 RUN apt-get -y update && \ apt-get -y --no-install-recommends install cron && \ apt-get -y --no-install-recommends install vim && \ apt-get -y --no-install-recommends install lftp && \ apt-get -y --no-install-recommends install curl ADD /bin/backup-db.sh /home/backup-db.sh RUN chmod +x /home/backup-db.sh RUN mkdir /home/backup-db ADD /crontab.txt /home/crontab.txt RUN /usr/bin/crontab /home/crontab.txt COPY start.sh / RUN chmod +x /start.sh ENTRYPOINT [&quot/start.sh&quot]کد بالا نمونه ی یک Dockerfile هست. در ضمن ADD COPY برای ارسال فایل از هاست به کانتینر استفاده میشه که روی ساب فولدر ها به این سبک نمیتونه کار کنه.همانطور که در عکس بالا میبینید در تب command همان start.sh بارگذاری شده است. در ضمن برای اطمینان از کارکرد سرویس ها میتونید داخل کانتینر ها ssh کنید و اونجا سرویس ها رو چک کنید.امیدوارم این مقاله به دردتون بخوره چون سعی کردم بیشتر مفهومی توضیحاتی بدم و کد استفاده نکنم چون اون ها رو با سرچ پیدا میکنید.اگر نظری داشتید خوشحال میشم بشنوم.در اخر هم سخن را با شعر سعدی تموم میکنم.علم چندان که بیشتر خوانی // چون عمل در تو نیست نادانینه محقق بود نه دانشمند // چارپاپی بر او کتابی چندآن تهی مغز را چه علم و خبر // که بر او هیزم است یا دفترشیخ اجل سعدی