مقدمة: لماذا نحتاج إلى حاويات (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 --version1.2. هيكل مشروع .NET
لنفترض أن لدينا تطبيق ASP.NET Core Web API بسيط. هيكل المجلدات:
MyApp/├── MyApp.csproj├── Program.cs├── Controllers/│ └── WeatherController.cs└── Dockerfile2. إنشاء 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.md3.4. مثال على Dockerfile محسّن
FROM mcr.microsoft