Docker وC#: حاويات التطبيقات على المستوى المتقدم
أصبحت حاويات تطبيقات .NET باستخدام Docker معيارًا صناعيًا. إذا كنت قد أتقنت المهارات الأساسية للعمل مع الحاويات، فقد حان الوقت للانتقال إلى المستوى المتقدم. في هذه المقالة، سنستعرض السيناريوهات المعقدة: البناء متعدد المراحل (multi-stage build)، إنشاء صور إنتاج خفيفة الوزن، تنظيم الخدمات المصغرة باستخدام Docker Compose، تطبيق فحوصات الصحة (health checks)، وإدارة التكوين بكفاءة. جميع الأمثلة محدثة لـ .NET 8 وأحدث إصدارات Docker.
1. البناء متعدد المراحل (Multi-stage build) لـ .NET
المشكلة الكلاسيكية هي الصور الضخمة التي تتضمن SDK وأدوات البناء. الحل هو البناء متعدد المراحل، حيث تحتوي الصورة النهائية فقط على بيئة التشغيل والملفات الثنائية المبنية.
لنلقِ نظرة على Dockerfile متقدم لـ ASP.NET Core Web API:
# المرحلة 1: استعادة التبعياتFROM mcr.microsoft.com/dotnet/sdk:8.0 AS restoreWORKDIR /srcCOPY ["MyApp.Api/MyApp.Api.csproj", "MyApp.Api/"]COPY ["MyApp.Core/MyApp.Core.csproj", "MyApp.Core/"]RUN dotnet restore "MyApp.Api/MyApp.Api.csproj"
# المرحلة 2: البناء والنشرFROM restore AS buildCOPY . .WORKDIR "/src/MyApp.Api"RUN dotnet publish -c Release -o /app/publish
# المرحلة 3: الصورة النهائية (بيئة تشغيل فقط)FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS finalWORKDIR /appEXPOSE 8080ENV ASPNETCORE_URLS=http://+:8080COPY --from=build /app/publish .ENTRYPOINT ["dotnet", "MyApp.Api.dll"]التحسينات الرئيسية:
- فصل restore وbuild: تخزين طبقة التبعيات مؤقتًا يسرّع عمليات البناء المتكررة.
- المنصة المستهدفة: استخدم
--no-restoreفي مرحلة publish إذا تم restore بالفعل. - تقليل الطبقات: ادمج أوامر
RUNحيثما أمكن باستخدام&&. - استخدام
--chmod: لضبط صلاحيات الوصول بشكل صحيح في حاويات Linux.
2. Docker Compose للخدمات المصغرة بلغة C#
يعتبر Docker Compose لا غنى عنه عند العمل مع عدة خدمات .NET. يتضمن السيناريو المتقدم إعداد الشبكة والتبعيات ومتغيرات البيئة.
مثال docker-compose.yml لبنية الخدمات المصغرة مع API Gateway وخدمة الطلبات وRabbitMQ:
version: '3.8'
services: rabbitmq: image: rabbitmq:3-management-alpine ports: - "5672:5672" - "15672:15672" healthcheck: test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"] interval: 30s timeout: 10s retries: 5
orders-api: build: context: . dockerfile: src/Orders.Api/Dockerfile ports: - "5001:8080" environment: - ASPNETCORE_ENVIRONMENT=Production - ConnectionStrings__DefaultConnection=Server=db;Database=OrdersDb;User=sa;Password=Your_password123; - RabbitMQ__Host=rabbitmq depends_on: rabbitmq: condition: service_healthy db: condition: service_started restart: unless-stopped
api-gateway: build: context: . dockerfile: src/ApiGateway/Dockerfile ports: - "80:8080" depends_on: - orders-api environment: - ASPNETCORE_ENVIRONMENT=Production - Services__Orders=http://orders-api:8080التقنيات المتقدمة:
- فحص الصحة في Compose: استخدم
condition: service_healthyللتبعيات الصارمة. - الملفات الشخصية (profiles): قم بتشغيل/إيقاف الخدمات لبيئات التطوير المختلفة.
- وحدات التخزين المدمجة للسجلات:
volumes:لحفظ السجلات خارج الحاوية. - متغيرات البيئة عبر ملف .env: قم بتخزين البيانات الحساسة