Docker और C#: उन्नत स्तर पर अनुप्रयोगों का कंटेनरीकरण
Docker की सहायता से .NET-अनुप्रयोगों का कंटेनरीकरण उद्योग का मानक बन गया है। यदि कंटेनरों के साथ बुनियादी कौशल पहले से ही सीख लिए गए हैं, तो अब उन्नत स्तर पर जाने का समय आ गया है। इस लेख में हम जटिल परिदृश्यों पर विचार करेंगे: मल्टी-स्टेज बिल्ड (multi-stage build), हल्के प्रोडक्शन-इमेज बनाना, Docker Compose के साथ माइक्रोसर्विसेज़ का आयोजन, हेल्थ चेक का कार्यान्वयन और कॉन्फ़िगरेशन का कुशल प्रबंधन। सभी उदाहरण .NET 8 और Docker के नवीनतम संस्करणों के लिए प्रासंगिक हैं।
1. .NET के लिए मल्टी-स्टेज बिल्ड (Multi-stage build)
क्लासिक समस्या — SDK और बिल्ड टूल्स सहित विशाल इमेज। समाधान — मल्टी-स्टेज बिल्ड, जहाँ अंतिम इमेज में केवल रनटाइम और संकलित बाइनरी फ़ाइलें होती हैं।
ASP.NET Core Web API के लिए उन्नत Dockerfile पर विचार करें:
# चरण 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: अंतिम इमेज (केवल runtime)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 को अलग करना: निर्भरताओं वाली लेयर को कैश करने से बार-बार बिल्ड करने में तेज़ी आती है।
- लक्ष्य-प्लेटफ़ॉर्म: यदि restore पहले ही हो चुका है, तो publish चरण पर
--no-restoreका उपयोग करें। - लेयरों को कम करना: जहाँ संभव हो,
&&के माध्यम सेRUNकमांड को संयोजित करें। --chmodका उपयोग: Linux-कंटेनरों में सही अनुमतियों के लिए।
2. C# पर माइक्रोसर्विसेज़ के लिए Docker Compose
कई .NET-सेवाओं के साथ काम करते समय Docker Compose अपरिहार्य है। उन्नत परिदृश्य में नेटवर्क, निर्भरताओं और पर्यावरण चरों का कॉन्फ़िगरेशन शामिल है।
API Gateway, ऑर्डर सेवा और RabbitMQ के साथ माइक्रोसर्विस आर्किटेक्चर के लिए docker-compose.yml का उदाहरण:
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 में Healthcheck: सख्त निर्भरताओं के लिए
condition: service_healthyका उपयोग करें। - प्रोफाइल (profiles): विभिन्न विकास वातावरणों के लिए सेवाओं को चालू/बंद करें।
- लॉग के लिए बिल्ट-इन वॉल्यूम: कंटेनर के बाहर लॉग संग्रहीत करने के लिए
volumes:। - .env फ़ाइल के माध्यम से पर्यावरण चर: संवेदनशील डेटा को स्टोर करें