چند خط از من :
بنظر من هیچ چیز مثل یادگیری و یاد دادن لذت بخش تر نیست.چند وقته پیش برای یکی از پروژه هام سرور نیاز داشتم همیشه با ویندوز سرور کار میکردم و کارم را میفتاد ولی این بار تصمیم گرفتم یک یادگیری جدید داشته باشم و در محیط لینوکس کارمو انجام دادم نتیجه این تصمیم شد یک هفته مطالعه و یادگیری مطالب جدید! حس خوب یادگیری بهم دست داد ولی هنوز خوشحال نبودم تا این مقاله رو نوشتم که شاید کمکی باشه به کسایی که به بخوان این سمت بیان.البته اگر وقت داشته باشم تو چند مقاله دیگر کاملش میکنم .
:)
مقدمه :
اگر تجربه آشنایی به ورژن های قبل تر از .netcore را داشته باشید برای برنامه نویسی کردن مستلزم رعایت یک سری چهار چوب هستید به طور مثال نمیتوان در محیط لینوکس develop انجام داد و ... این موضوع باعث شده بود که یک سری از برنامه نویسا به دلیل عدم همخوانی با .net به سمت تکنولوژی های دیگری سویچ کنند از طرف دیگر چون اکثر محصولات مایکروسافت به صورت انحصاری بود برای تهیه کردن محصولات باید هزینه گزافی را پرداخت می کردید این روند ادامه پیدا کرد تا مایکروسافت تصمیم گرفت نسخه .net core 1 رو به صورت رایگان و open source راهیه بازر کند که از ان استقبال زیادی شد ولی متاسفانه به دلیل انتشار اولین نسخه دارای باگ های بسیار زیادی بود که در نسخه .netcore 2 برخی از اشکالات را رفع کرد .در نسخه .netcore 3 تقریبا به یک حالت استیبل رسید و توانست برنامه نویس ها رو راضی نگه دارد .در نسخه 5 از لحاظ پرفورمنس اپدیت زد که استقبال زیادی از ان شد.با انتشار نسخه .netcore محدودیتی در انتخاب os ندارید و میتوانید در os های مختلف develop کنید.حتی برای وب سرور ها هم محدودیتی ندارید.در این ریپازیتوری میتوانید سورس مربوط به .netcore را مشاهد کنید.در جدول زیر نسخه net core با net framework مقایسه شده است .
در این مقاله قصد داریم نحوه deploy کردن یک پروژه ساده mvc را بر روی داکر توضیح دهیم.برای درک بهتر از در محیط لینوکس develop را انجام خواهیم داد.
شما میتوانید در ویندوز یا مک هم کارهای گفته شده را انجام دهید ولی چون نصب داکر بر روی ویندوز معمولا دردسر ساز است از لینوکس استفاده میکنیم.
برا نصب لینوکس در بهترین حالت میتوانید به صورت dual boot ان را کنار سیستم عامل دیگرتون بدون هیچ وابستگی نصب کنید و یا میتوان در سیستم عامل خودتون به صورت vmware ان را نصب کنید که توصیه میشود به صورت dual boot نصب کنید.توجه داشته باشید هنگام نصب dual boot راهنمایی های لازم را مطالعه کنید چون در بیشتر موارد منجر به فرمت کردن هارد میشود.
معمولا برای کار های شخصی از نسخه ubuntu میکنند ما هم از همین نسخه استفاده میکنیم.
سناریو : قصد داریم یک پروژه ساده mvc را در لینوکس deploy کنیم.بعد از deploy کردن اولیه و بالا اومدن پروژه بر روی وب سرور از دیتابیس هم استفاده خواهیم کرد و ست کردن domain و کار های دیگر را در مقاله بعدی خواهیم گفت.
بعد از Stup کردن اولیه و بالا امدن پروژه در مقاله بعدی از nginx به عنوان وب سرور استفاده خواهیم کرد
پیش نیاز ها :
نصب dotnetcore : برای نصب .netcore در محیط لینوکس این مقاله را مطالعه کنید.پس از نصب جهت صحت نصب شدن .netcore درون ترمینال دستور زیر را وارد کنید
dotnet --version
نصب vs code : حتی در ویندوز هم برنامه نویس های dotnet عادت به استفاده از vs code دارن .به جرات میتوان گفت قدرتمند ترین ide موجود میباشد.برای نصب vs code وارد سایت vscode شوید و بسته به os خود ان را دانلود کنید.
نصب داکر : توضیحات مقدماتی داکر را در ادامه خواهیم گفت ولی برای شروع باید بر روی سیستم خود نصب کرده باشید با دستور زیر داکر رو نصب کنید و با دستور docker --version مطمئن شوید که به درستی نصب شده است.
توجه کنید هنگام نصب برنامه های بالا ممکن به خطا برخورد کنید که به سرچ تو گوگل میتوان رفع کرد یا در قسمت کامنت یا در شبکه های اجتماعی دیگر میتوانید خطاهاتون رو ارسال کنید اگر قبلا برخورد کرده باشم میتونم کمکتون کنم.
شروع به کار :
برای ساخت پروژه mvc ابتدا یک پوشه ایجاد ساخته و با دستور dotnet new میتوانیم پروژه مورد نظر را ایجاد کنیم
mkdir asp-deploy
cd asp-deploy
dotnet new mvc
dotnet run
//go to localhost:5000
پس از ساخت پروژه قصد داریم ان را در وب سرور لوکال بالا بیاریم.برای انتخاب وب سرور محدودیتی نداریم و میتوانیم از وب سرور های موجود استفاده میکنیم در این مثال از kestrel استفاده میکنیم. شما میتوانید بسته به نیاز خود از وب سرور های موجود استفاده کنید.مرحله بعد اصلی ترین قسمت داستان خواهید بود.باید پکیج های لازم را بر روی داکر نصب کنیم ابتدا توضیح ابتدایی درباره داکر خواهیم داد و در ادامه با چند دستور ساده و پرکاربرد ان اشنا خواهیم شد.
توجه کنید میتوانید بدون نصب داکر هم پروژه را در nginx یا کسترل بالا بیارید.ما در این مقاله سعی کردیم به صورت ساده مباحث مختلف رو قرار بدیم
داکر چیست؟
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.(docs.docker.com)
به توجه به توضیحات بالا میتوان گفت داکر بستری برای اجرای اپلیکیشن ها درون خودش است.به تعریف ساده داکر پلتفرمی برای اجرا ، ساخت ، مدیریت و ... اپلیکیشن های مختلف است .به طور مثال فرض کنید شما یک پروژه .NET با ورژن core 3 نوشته اید و قصد دارید بر روی سرور یا یک سیستم دیگر اجرا کنید در این صورت شما باید پیش نیاز های مربوط به پروژه را بر روی سیستم عامل مقصد نصب کنید.در این حالت شاید شما تمایل نصب نرم افزار دیگری بر روی سیستم نداشته باشید یا ورژن نرم افزار نصبی در سیستم شما به ورژن نرم افزار سیستم مقصد یکی نباشد که در این صورت هم به مشکل مواجه خواهید شد.
در بالا به صورت ساده داکر را تشریح کردیم و بیشتر از این وارد بحث داکر نمیشویم چون از حوصله این مقاله خارج است
برای کار با داکر باید با چند مفهوم به صورت کلی اشنایی داشته باشید
بعد از نصب داکر با دستور docker --version از صحت نصب ان اطمینان حاصل نمایید و با دستور docker images میتوان image های موجود را مشاهده کنید که در حال حاضر image وجود ندارد.برای درک بهتر با دستور زیر nginx را دانلود و اجرا کنید
docker pull nginx docker run -it --rm -d -p 5050:80 --name web nginx //go to localhost:5050
با دستور اول image بر روی docker hub دانلود شده.با دستور docker run با پارامتر های پورت و اسم image میتوانید image مربوطه را اجرا کنید سپس به ادرس localhost:5050 رفته باید صفحه مربوط به nginx را مشاهده کنید.با دستور docker contianer ls میتوانید container های در حال اجرا را مشاهده کنید .
ادامه nginx و داکر را در مقاله بعد تشریح میکنیم
به پروژه .net برگردید قبل از هر چیز این افزونه را بر روی vscode نصب کنید. بعد از نصب آیکون داکر در منو سمت راست نمایش داده خواهد شد که شما میتوانید به جای وارد کردن کامنت از محیط گرافیکی vs code هم استفاده کنید. کلید Ctrl+Shift+P
را فشار دهید و add docker file را انتخاب کنید بعد از انتخاب کردن یک سری سوالات مربوط به پروژه یک فایل با محتوای زیر درون root ایجاد خواهد کرد.
FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal AS base WORKDIR /app EXPOSE 5000 NV ASPNETCORE_URLS=http://+:5000 # Creates a non-root user with an explicit UID and adds permission to access the /app folder # For more info, please refer to https://aka.ms/vscode-docker-dotnet-configure-containers RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app USER appuser FROM mcr.microsoft.com/dotnet/sdk:5.0-focal AS build WORKDIR /src COPY ["test.csproj", "./"] RUN dotnet restore "test.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "test.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "test.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "test.dll"]
دستورات بالا را میتوانید به صورت دلخواه اضافه و کم کنید.برای بالا اوردن پروژه بر روی داکر روش های مختلفی وجود دارد ما از فایل داکر build گرفته و image میسازیم سپس image را Run میکنیم.پس از اضافه شدن docker file وارد ترمینال شوید و دستور زیر را وارد کنید
docker build -t deploy-asp .
با دستور بالا از فایل dockerfile یک image طبق تنظیمات شما ساخته میشد بعد از ساخت image در اخر پیغام Successfully tagged deploy-asp:latest مبنی بر ایجاد image نمایش داده میشود. پارامتر -t به عنوان تگ یا نامimage خواهد بود که در اینجا deploy-asp به عنوان نام image قرار خواهد گرفته میشود. به ترمینال باز گشته و با دستو docker image باید image مربوطه را بتوانید مشاهده کنید. مطمئن شوید که پروژه stop است. در ترمینال دستور زیر را اجرا کنید
docker run --rm -d -p 5050:5000 --name deploy asp-deploy //go to localhost:5050
5000 پورتی است که هنگام ساخت dockerfile تعریف کردیم
بعد از اجرا خروجی به شما یک key برگشت داده خواهد شد که contaner id خواهد بود.
اپلود ایمیج بر روی سرور :
تا اینجای کار با ساده ترین حالت ممکن یک پروژه mvc ایجاد کردیم و از ان image ساختیم .سپس image را بر روی داکر بالا اوردیم.ولی تا الان در محیط local بودیم و قصد داریم در یک سرور واقعی پروژه را بالا بیاریم.قبل از هرچیز یک سرور لینوکسی خریداری کنید ترجیحا ubuntu تهیه کنید چون دستورات گفته شده در محیط ubuntu بوده و در توزیع های دیگر لینوکس ممکن است کمی تفاوت داشته باشد.بعد از خریداری سرور میتوانید با نرم افزار putty به سرور ریموت بزنید و docker را طبق مطالب گفته شده نصب کنید
دقت کنید اگه سرور ubuntu خریداری کرده اید دستورات بالا بدون هیچ تغییری اجرا خواهند شد ولی توجه کنید چون از طرف داکر تحریم هستیم نمیتوانیم به docker hub وصل بشیم برای وصل شدن به داکر هاب میتوانید از شکن استفاده کنید.برای کانفیگ شکن این مقاله را مطالعه کنید.
برای اینکه بتوانیم image را تو سرور pull کنیم چند راه مختلف وجود دارد.ما از docker hub استفاده خواهیم کرد.
؛ pull کردن به معنی گرفتن است و منظور گرفتن image از docker hub است.اگه با git کار کرده باشید مفهوم مشترکی با هم دارند
داکر هاب شبیه پکیج منیجر ها میتوانید image خودتون رو بصورت شخصی یا عمومی قرار دهید و یا image های دیگر را دانلود کنید.
ابتدا درون داکر هاب ثبت نام کنید سپس به ترمینال سیستم شخصی بازگشته بار دستور docker login درون docker hub لاگین کنید.بعد از لاگین با دستور docker push deploy-asp ایمیج را درون docker hub ارسال میکنیم.اگر داخل docker hub لاگین کنید در قسمت ریپازیتوری باید image را بتوانید مشاهده کنید.به ترمینال سرور برگشته و با دستور زیر image ساخته شده را pull کنید
docker pull {username}/deploy-asp
؛ برای صحت دانلود image از با دستور docker images باید deploy-asp را بتوانید مشاهده کنید.بعد از دانلود image مراحل گفته شده در سیستم شخصی با سرور فرقی ندارد و میتونید با دستورات گفته شده image را اجرا کنید برای مثال ما برای image که ساختیم بر روی چند پورت مختلف اجرا میگیریم
docker run -d --name deploy-asp -p 8081:5000 deploy-asp
پارامر -d یا --detach معنی اجرای container در background است.اگر از -d استفاده نکنید هنگام اجرا یک image در حالت انتظار باقی خواهید ماند تا container را stop کنید .با --name میتوانید یک اسم برای container در حال اجرا انتخاب کنید که معادل container-id برای راحتی کار است.در ادامه با -p پورت 8081 را به پورت 5000 بایند کرده ایم.اگر دقت کرده باشید هنگام ساخت docker file در یکی از مراحل 5000 را عنوان پورت اصلی برنامه درنظر گرفتیم که پیشفرض image بر روی همین پورت بالا خواهد امد.ما سه پورت مختلف را به 5000 انتساب داده ایم دقت کنید پورت هایی که انتخاب میکنید باید ازاد باشند.
بعد از اجرا با توجه به عکس بالا با وارد کردن ip و پورت وارد سایت شوید و پورت های مختلف را تست کنید
ست کردن دامین را در مقاله بعدی توضیح خواهیم داد
دقت کنید در ویندوز شما به به سادگی بیشتر میتوانید مراحل بالا را به صورت ویزاردی انجام دهید ولی برای درک بهتر در لینوکس پیاده سازی را انجام دادیم.حتی اگر در لینوکس هم با اکستنشن گفته شده میتوانید به صورت گرافیکی دستورات گفته شده را اجرا کنید.در مقاله بعد sql server را بر رو هیمن پروژه راه اندازی میکنیم در ادامه از وب سرور nginx استفاده خواهیم کرد.
سخن پایانی :
هدف این اموزش درک مفاهیم به ساده ترین شکل بود امیدوارم برای خواننده مفید واقع شده باشه .اگر هر گونه نظر یا سوالی داشتید میتونید در پیج تویترم با من در ارتباط باشید.اگه براتون مفید بوده لطفا ستاره بیج گیتابم رو با ادرس زیر بزنید
اگه از مقاله راضی بودید میتونید از لینک زیر برام قهوه بخرید : )
https://www.coffeete.ir/Sobhan
منابع