داکرایز پروژه چند لایه ای Asp Net Core MVC

فیلم کامل این مقاله در کانال youtube بنده موجود هست.قسمت اول: https://youtu.be/gX0K5S6Gim8 قسمت دوم: https://youtu.be/9dDrwrQi-SI در این مقاله داکر و یا دات نت کور را برسی نمیکنیم، هدف داکرایز پروژه می باشد.ابتدا یک پروژه در ویژوال استودیو 2019 به اسم AspNetCoreForDocker ایجاد کرده و نوع پروژه AspNetCoreWebApplication انتخاب میکینم. این پروژه از دانت کور 3.1 ، کتابخانه ها از دانت استاندارد 2.1 اسفتاده میکند.مروری بر NET Core CLI .بدهیی هست که برای داکرایز هر پروژه باید به چرخه حیات بیلد و پابیلش اون در لایه های پایین تر آشنایی داشت. IDE های متفاوتی هستند که میتوانیم با آن یک پروژه دات نتی ایجاد، اجرا، بیلد، پابلیش کنیم. اما محیط های برنامه نویسی چگونه چنین کاری را انجام میدهند؟ دات نت کور دارای یک SDK میباشد، IDE از این استفاده میکند و کارهای ویژویالی ما را گرفته و از طریق کامند لاین CLI با SDK ارتباط برقرا میکند و اون خواسته ما انجام میشود. برای مثال وقتی ما میگیم یک پروژه کنسولی بساز یا بیلد و اجرا بکن پشت پرده IDE همچین کامندی را به SDK ارسال میکیند.dotnet new console ایجاد پروژه dotnet build --output /build_output بیلد پروژه dotnet /build_output/my_app.dll اجرا پروژه https://docs.microsoft.com/tr-tr/dotnet/core/tools/ اگر در سیستم ما SDK دات نت کور نصب باشد ما میتواینم از CMD با این دستورات یک پروژه بسازیم و آن را بیلد و اجرا کنیم و نیازی به IDE های متفاوت نداریم، این مطلب به چه کار ما می آید؟ وقتی ما بخواهیم پروژه ای رو به صورت اتوماتیک بیلد و پابلش کنیم نیاز هست این دستورات را بدانیم و از طریق کامند لاین اینترفیس دستورات را پشت سر هم بنویسم تا خروجی مورد نظر را بگیریم.نوشتن داکر فایل برای پروژه دانت کور.ابتدا در کنار فایل Sln پروژه یه فایل دیگری به اسم Dockerfile بسازید.داکر فایل یک فایل متنی بدون پسوند هست و حساس به حروف کوچک و بزرگ میباشد پس در نوشتن اسم دقت کافی داشته باشید. این فایل را میتوانید با Notepad و یا هر ادیتوری باز کنید من ترجیحم Visual Studio Code هست. بعد باز کردن فایل کد زیر را داخلش کپی کنید.FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as build WORKDIR /appCOPY ./AspNetCoreForDocker/*.csproj ./AspNetCoreForDocker/COPY ./Business/*.csproj ./Business/COPY *.sln .RUN dotnet restoreCOPY . .RUN dotnet publish -c Release ./AspNetCoreForDocker/*.csproj -o /publish/FROM mcr.microsoft.com/dotnet/core/aspnet:3.1WORKDIR /appCOPY --from=build /publish .ENV ASPNETCORE_URLS="http://*:4500"ENTRYPOINT [ "dotnet","AspNetCoreForDocker.dll" ]اگر از ویژیوال استادیو کد استفاده میکنید بهتر هست extension داکر رو نصب کنید.FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as build در این خط از کد ما به داکر میگیم از بیس ایمیج نسخه 3.1 SDK خود مایکروسافت موجود در داکر هاب میخواهیم استفاده بکنیم پس برو دانلود و نصب کن. با کیورد as یه اسم build هم بهش میدیم و میگیم در کل این پروژه اگر کلمه بیلد رو جایی آوردیم منظور ایمیج SDK هست، چون طولانی هست نوشتن کل خط با یک کلمه build خلاصه میکینم.WORKDIR /app یک پوشه app درست میکنه و داخلش وارد میشه.COPY ./AspNetCoreForDocker/*.csproj ./AspNetCoreForDocker/ در کد بالایی میگیم از جایی که داکر فایل هست دنبال پوشه AspNetCoreForDocker بگرد و برو داخلش،داخل پوشه هم بگرد دنبال فایلی که پسوندش csproj هست، وقتی پیدا کردی داخل WORKDIR یه پوشه AspNetCoreForDocker بساز برو داخلش و فایل csproj کپی بکن. مثل خط زیر.app/AspNetCoreForDocker/ csproj فایل نحوه کار دستور کپی COPY source destination سورس source آدرس جایی هست که داکر فایل اونجاست پس بنابراین بجای سورس اگر نقطه بگذارم، منظور مسیر داکر فایل هست.حال اگر یک نقطه اسلش و نام یه پوشه رو بنویسم./SrcFolderName/ یعنی از جایی که داکر فایل هست سویچ شو برو داخل پوشه ی SrcFolderNameدیستنیشن destination جایی هست که WORKDIR اشاره میکنه، یعنی بعد یک فاصله از سورس، دوباره یک نقطه بگذاریم یعنی میگیم داخل پوشه app هستیم.COPY source ./DesFolderName/حال یک نقطه اسلش بزنیم و نام یک پوشه ای رو بنویسیم یعنی داخل پوشه app برو این پوشه DesFolderNameحال اگر بگیم کپی و با فاصله دوتا نطقه بذاریم COPY . .یعنی جایی که داکر فایل هست تمام فایل و پوشه هارو کپی بکن به ورک دایر که پوشه app هست. چون طبق توضیح نقطه اول آدرس جایی که داکر فایل ایستاده هست و نقطه دوم آدرس جایی هست که WORKDIR ساخته. خیلی تلاش کردم این قسمت رو متوجه بشید هر چند در ویدیو آموزشی هم توضیح دادم و امیدوارم متوجه شده باشین چون خیلی مهم هست.دقت کنید در حین کپی کردن در قسمت مقصد یا همون دیستنیشن اگر نام پوشه ای که نوشتین داخل ورک دایر نباشه خودش اتوماتیک خواهد ساخت. به اسلش ها دقت کنید مهم هستند.COPY ./Business/*.csproj ./Business/ کپی فایل csproj پروژه بیزنس به داخل پوشه بیزنس داخل ورک دایر /app/BusinessCOPY *.sln . کپی فایل sln موجود در کنار فایل داکر، به ورک دایر، که همان app هست. دقت کنید نقطه دوم یعنی داخل ورک دایر که همان app هست.RUN dotnet restoreباز دستو dot net cli هست، اگر پروژه وابستگی داره و یا وابستگی ها آپدیت شدن اونهارو دانلود و آپدیت میکنه تا در قسمت بیلد مشکلی پیش نیاد.COPY . .هر چی که در مسیر داکر فایل هست کپی بکن به ورک دایر که همان app هست.بخاطر سوال یکی از دوستان این قسمت رو نیاز هست یکم بازتر بکنم:اگر قرار بود کل فایل هارو کپی کنم چرا در سطر سوم وچهارم فایل پروژه رو کپی کردیم؟ در داخل داکر فایل هر سطری که نوشته میشه داخل ایمیج یک لایه میشه، و هنگام بیلد کردن اگر در اون لایه تغیری انجام بشه فقط اون لایه بیلد میشه اگر نباشه از کشی که خودش ساخته میره از کش استفاده میکنه تا سرعت بیلد بالا باشه، یکسری تغیرات مثل اضافه کردن یه رفرنس باعث میشه فایل پروژه آپدیت بشه، دقت کنید ممکن هست فایل پروژه به دلیل اضافه کردن یا اپدیت کردن یک کتابخانه آپدیت بشه ولی داخل دیگر فایل ها و ساختار پروژه چیزی آپدیت نشه، در این صورت تنها لایه فایل پروژه csproj بیلد میشه و بقیه از کش سیستم استفاده میکنه ولی میتوانستیم ننویسم و بگیم هر چی شد مهم نیست برو کل فایل هارو در هر بار بیلد کپی بکن! به لحاظ بست پرکتیس این درست نیست و ما با اضافه کردن لایه های دیگر میگیم اگر در لایه مورد نظر تغیری هست برو بیلدش بکن و الا از کش استفاده بکن، برعکس اینم هست شاید یک عکس رو آپدیت کردیم و در کتابخانه ها چیزی تغیر نکرده این بار لایه فایل csproj پروژه از کش استفاده میکنه ولی لایه بعد که کل فایل هارو کپی میکنه از اول بیلد میشه و بخاطر تغیرش از کش استفاده نمیکنه. RUN dotnet publish -c Release ./AspNetCoreForDocker/*.csproj -o /publish/با کمک Dot Net CLI. دستورات کامندی SDK ، پروژه رو بیلد میکینم. حال اینجا اگر به پلتفورم خاصی میخاین پابلیش بشه باید معماری اونم بنویسید و حتما از بیس ایمیچ اون معماری استفاده کنید مثلا ARM یا لینوکس ما برای ویندوز پابلیش کردیم که فکر کنم برای لینوکسم کار بکنه همین.دقت کنید بعد -o ما یک پوشه بهش معرفی کردیم و گفتیم بیلد بکن و بریز داخل این پوشه. ما تا این قسمت پروژه رو داخل SDK دات نت کور کپی کردیم و داخل ایمیج به پوشه پابلیش خروجی رو ریختیم. FROM mcr.microsoft.com/dotnet/core/aspnet:3.1دقت داشته باشید ما با خود ایمیج SDK پروژه رو می توانیم ران بکنیم ولی چون حجم ایمیج نهایی خیلی بزرگ میشه، فضای اضافی در هارد میگیره و حین اجرا کردن کانتینر یکم دیر اجرا میشه و داخل ایمیج SDK کلی امکانات هست که در محیط اجرا به کارمون نمیاد، درستش اینه از ایمیج اجرا کننده پروژه دات نت کور استفاده کنیم.بعد از بلید کل فایل قسمت ایمیج SDK پاک خواهد شد و تنها قسمت اجرایی خواهد ماند.WORKDIR /appباز برای ایمیج اجرای یه ورک دایر می سازهCOPY --from=build /publish .میخیام پروژه پابلیش شده ایمیج قبلی که SDK هست رو کپی کنیم به ورک دایر، برای اینکه به فایل های یک ایمیج دیگه دسترسی داشته باشیم از دستور from-- استفاده میکینم و اگر دقت کنید کلمه بیلد رو نوشتم چون ابتدای پروژه به SDK یک اسم بیلد دادم که ایجا بلند بلند سطر رو ننویسم. گفتیم داخل ایمیج بیلد برو پوشه پابلیش همه رو کپی بکن به ورک دایر که app هست.ENV ASPNETCORE_URLS="http://*:4500"هر فریم ورکی یکسری Environment داره که از طریق اون میتوینم پروژه رو درحالت های مختلف اجرا بکینم.چون داکر محیط عملیاتی هست، لوکال هاست معنی نداره ما اینجا از کیورد ASPNETCORE_URLS استفاده کرده و گفتیم آی پی هر چی میخاد باشه، یعنی آی پی ماشینی که توش اجرا هستی رو بگیر که از سیستم به سیستم این آی پی تغیر میکنه. بعدش گفتیم روی پورت 4500 اجرا شو. دیفالت خودش 5000 هستش.اگر این رو ندیم از یک سیستم دیگه کسی نمیتونه بهش دسترسی پیدا بکنه و فقط روی خود ماشین میتونیم بهش دسترسی داشته باشیم. البته میشه روی لوکال رانش کرد و از طریق Nginx براش پروکسی تعیریف کرد که در سر فرصت در یه مقاله دیگه بهش خواهم پرداخت.ENTRYPOINT [ "dotnet","AspNetCoreForDocker.dll" ]باز از طریق net core cli پروژه رو اجرا میکنیم. دقت کنید فایل dll پروژه اصلی رو میدیم نه فایل exe.بعد ذخیره داکر فایل از پاور شل به مسیر داکر فایل سوییچ بشید و با دستور زیر فایل رو بیلد کنید.docker build -t web_image .بعد بیلد شدن ازش یک کانتینر با دستور زیر میسازیم.docker run --name web_app -p 4000:4500 web_imageبعد اجرای کانتینر با براوزر آدرس زیر رو وارد کنید و نتیجه رو ببینید.http://localhost:4000/تمامی مراحل قدم به قدم در ویدیو توضیح داده شده و در این مقاله یکم بیشتر به جزییات پرداختیم.موفق و پیروز باشید.