Docker وC#: حاويات تطبيقات .NET
في تطوير البرمجيات الحديثة، أصبحت الحاويات المعيار الفعلي لإنشاء التطبيقات واختبارها ونشرها. يتيح لك Docker حزم تطبيق C# الخاص بك مع جميع تبعياته في بيئة معزولة - حاوية. وهذا يضمن أن التطبيق سيعمل بنفس الطريقة على أي جهاز: من كمبيوتر المطور المحمول إلى خادم الإنتاج في السحابة.
في هذه المقالة، سنشرح بالتفصيل كيفية وضع تطبيقات .NET في حاويات باستخدام Docker. ستتعلم كيفية إنشاء Dockerfile فعالة، واستخدام البناء متعدد المراحل، والعمل مع docker-compose للتطبيقات متعددة الحاويات، واتباع أفضل الممارسات.
ما هو Docker ولماذا يحتاجه مطور C#؟
Docker هي منصة لتطوير التطبيقات وتسليمها وتشغيلها في حاويات. الحاوية هي حزمة خفيفة الوزن ومستقلة وقابلة للتنفيذ تحتوي على كل ما هو ضروري لتشغيل التطبيق: الكود، وبيئة التشغيل (runtime)، والأدوات النظامية، والمكتبات، والإعدادات.
لمطور C#، يوفر Docker المزايا التالية:
- عزل البيئة - لم يعد هناك حاجة لتكوين البيئة على كل جهاز. يتم تثبيت جميع التبعيات في الصورة.
- التوحيد - يعمل التطبيق بنفس الطريقة على Windows وLinux وmacOS.
- قابلية التوسع - سهولة تشغيل نسخ متعددة من التطبيق لمعالجة الحمل.
- تكامل CI/CD - الحاويات مثالية لخطوط أنابيب البناء والنشر الآلية.
- هندسة الخدمات المصغرة - يمكن حزم كل خدمة في حاوية منفصلة.
من المهم ملاحظة أن .NET Core (والإصدارات الأحدث .NET 5/6/7/8) هي عبر المنصات وتعمل بشكل ممتاز في حاويات Linux، والتي تعتبر المعيار لـ Docker. تتطلب تطبيقات .NET Framework حاويات Windows، مما يفرض قيودًا معينة.
إنشاء Dockerfile لتطبيق .NET
القطعة الأثرية الرئيسية للحاويات هي ملف Dockerfile. يحتوي على تعليمات لبناء صورة تطبيقك. لنلق نظرة على مثال لواجهة برمجة تطبيقات ويب ASP.NET Core نموذجية.
قم بإنشاء ملف Dockerfile في جذر مشروعك:
# المرحلة 1: بناء التطبيقFROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /src
# نسخ ملف المشروع واستعادة التبعياتCOPY ["MyApp/MyApp.csproj", "MyApp/"]RUN dotnet restore "MyApp/MyApp.csproj"
# نسخ كل الكود المصدري وبناء التطبيقCOPY . .WORKDIR "/src/MyApp"RUN dotnet build "MyApp.csproj" -c Release -o /app/build
# المرحلة 2: نشر التطبيقFROM build AS publishRUN dotnet publish "MyApp.csproj" -c Release -o /app/publish /p:UseAppHost=false
# المرحلة 3: الصورة النهائية للتشغيلFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS finalWORKDIR /appEXPOSE 80EXPOSE 443
# نسخ الملفات المنشورة من مرحلة النشرCOPY --from=publish /app/publish .
# تعيين مستخدم بدون صلاحيات الجذر للأمانUSER app
ENTRYPOINT ["dotnet", "MyApp.dll"]شرح التعليمات:
FROM ... AS build- نستخدم صورة SDK للبناء. هذه هي مرحلة "البناء".WORKDIR- يحدد دليل العمل.COPY- ينسخ الملفات من النظام المضيف إلى الصورة.RUN dotnet restore- يستعيد حزم NuGet.RUN dotnet build- يترجم المشروع.FROM ... AS publish- المرحلة الثانية للنشر (غالبًا ما يتم دمجها مع البناء).FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final- الصورة النهائية، التي تحتوي فقط على ASP.NET Core runtime. إنها أخف بكثير من صورة SDK.COPY --from=