Docker وC#: حاويات تطبيقات .NET من الصفر

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا نحتاج إلى حاويات (Containerization) لتطبيقات C#؟

نادرًا ما تخلو التطويرات الحديثة بلغة C# (.NET) من استخدام Docker. تتيح تقنية الحاويات (Containerization) تغليف التطبيق مع جميع التبعيات (dependencies)، وبيئة التشغيل (runtime)، والإعدادات (configurations) في صورة (image) معزولة. هذا يحل مشكلة "يعمل على جهازي" ويبسط عملية النشر (deploy) على الخادم، أو السحابة (cloud)، أو البنية التحتية المحلية.

في هذه المقالة، سنشرح كيفية إنشاء صورة Docker لتطبيق .NET (ASP.NET Core أو تطبيق وحدة التحكم)، وتحسين حجمها، واستخدام docker-compose للربط مع قاعدة البيانات، وإعداد CI/CD. جميع أمثلة الكود مكتوبة بلغة C# وجاهزة للاستخدام.



1. أساسيات Docker لمطور .NET

Docker هي منصة لتشغيل التطبيقات في حاويات (containers). تحتوي الحاوية على كل ما يلزم: الكود، وبيئة التشغيل (runtime)، والمكتبات (libraries)، والإعدادات. بالنسبة لـ .NET، هذا مريح بشكل خاص، حيث لا تحتاج إلى تثبيت .NET SDK على الخادم - فقط Docker يكفي.



1.1. تثبيت Docker

قم بتنزيل وتثبيت Docker Desktop من الموقع الرسمي. بعد التثبيت، تحقق من الإصدار:

docker --version


1.2. هيكل مشروع .NET

لنفترض أن لدينا تطبيق ASP.NET Core Web API بسيط. هيكل المجلدات:

MyApp/├── MyApp.csproj├── Program.cs├── Controllers/│   └── WeatherController.cs└── Dockerfile


2. إنشاء Dockerfile لتطبيق .NET

Dockerfile هو تعليمات لبناء الصورة (image). بالنسبة لـ .NET، يُوصى باستخدام البناء متعدد المراحل (multi-stage build) لفصل مراحل البناء والتنفيذ. هذا يقلل من الحجم النهائي للصورة.



2.1. Dockerfile أساسي

أنشئ ملف Dockerfile في جذر المشروع:

# مرحلة البناءFROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /srcCOPY ["MyApp.csproj", "."]RUN dotnet restoreCOPY . .RUN dotnet publish -c Release -o /app/publish

# مرحلة التنفيذFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appCOPY --from=build /app/publish .EXPOSE 80ENTRYPOINT ["dotnet", "MyApp.dll"]

التوضيحات:

  • FROM ... AS build - نستخدم SDK للترجمة.
  • COPY ["MyApp.csproj", "."] - ننسخ ملف المشروع فقط لتخزين restore مؤقتًا.
  • RUN dotnet restore - نستعيد حزم NuGet.
  • RUN dotnet publish - نبني الإصدار النهائي (Release).
  • FROM ... AS runtime - نستخدم صورة aspnet المصغرة.
  • EXPOSE 80 - نفتح المنفذ 80.
  • ENTRYPOINT - أمر تشغيل التطبيق.


2.2. بناء وتشغيل الصورة

نفذ الأوامر في الطرفية (terminal) من مجلد المشروع:

docker build -t myapp:latest .docker run -d -p 8080:80 --name myapp_container myapp:latest

الآن التطبيق متاح على العنوان http://localhost:8080.



3. تحسين صور Docker لـ .NET

الصور الكبيرة تبطئ النشر (deploy) وتستهلك الموارد. إليك بعض الممارسات للتحسين:



3.1. استخدم .NET 8 (أو أحدث)

الإصدارات الجديدة من .NET تدعم بشكل مدمج الترجمة AOT (Ahead-of-Time)، مما يقلل حجم بيئة التشغيل (runtime). بالنسبة لـ ASP.NET Core، استخدم الصورة aspnet:8.0.



3.2. قلل الطبقات (layers)

كل تعليمة RUN أو COPY تنشئ طبقة. قم بدمج الأوامر:

RUN apt-get update && apt-get install -y \    curl \    && rm -rf /var/lib/apt/lists/*


3.3. استخدم .dockerignore

أنشئ ملف .dockerignore في جذر المشروع لاستبعاد الملفات غير الضرورية:

bin/obj/.vs/*.user.git/README.md


3.4. مثال على Dockerfile محسّن

FROM mcr.microsoft                

المدونات

توصيات الكتب