डॉकर और कोटलिन: उन्नत स्तर के अनुप्रयोगों का कंटेनरीकरण

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

डॉकर और कोटलिन: उन्नत स्तर के अनुप्रयोगों का कंटेनरीकरण



कंटेनरीकरण आधुनिक विकास का एक अभिन्न अंग बन गया है। यदि आपने पहले से ही डॉकर के बुनियादी सिद्धांतों में महारत हासिल कर ली है और कोटलिन में कुछ सरल इमेज लिखी हैं, तो अब अगले स्तर पर जाने का समय आ गया है। इस लेख में, हम उन्नत तकनीकों पर चर्चा करेंगे: मल्टी-स्टेज बिल्ड, अंतिम इमेज के आकार का अनुकूलन, लोकप्रिय फ्रेमवर्क (Ktor, Spring Boot) के साथ कार्य करना और कंटेनरीकृत वातावरण में कोरूटीन का कुशल प्रबंधन।



1. मल्टी-स्टेज बिल्ड (Multi-stage builds)



JVM अनुप्रयोगों को कंटेनरीकृत करते समय मुख्य समस्याओं में से एक इमेज का आकार है। बेसिक JDK इमेज का वजन सैकड़ों मेगाबाइट हो सकता है। मल्टी-स्टेज बिल्ड संकलन और निष्पादन चरणों को अलग करने की अनुमति देता है, अंतिम इमेज में केवल JRE और संकलित JAR को छोड़ता है।



Gradle का उपयोग करके बनाए गए कोटलिन एप्लिकेशन के लिए एक उदाहरण देखें:



# बिल्ड स्टेजFROM gradle:7.6-jdk17 AS builderWORKDIR /appCOPY build.gradle.kts settings.gradle.kts ./COPY src ./srcRUN gradle build --no-daemon -x test

# निष्पादन स्टेजFROM eclipse-temurin:17-jre-alpineWORKDIR /appCOPY --from=builder /app/build/libs/*.jar app.jarEXPOSE 8080CMD ["java", "-jar", "app.jar"]


यह प्रभावी क्यों है?

  • बिल्ड स्टेज में पूर्ण JDK और Gradle का उपयोग किया जाता है, लेकिन वे अंतिम इमेज में शामिल नहीं होते हैं।
  • अंतिम इमेज में केवल JRE (Java Runtime Environment) होता है, जो आकार को 3-5 गुना कम कर देता है।
  • Alpine Linux अतिरिक्त रूप से वॉल्यूम को ~150-200 MB तक कम कर देता है, जबकि पहले यह 600+ MB था।


2. लेयर्स का अनुकूलन और कैशिंग



डॉकर लेयर्स को कैश करता है, लेकिन केवल तभी जब वे बदली न हों। बार-बार बिल्ड को गति देने के लिए, निर्भरताओं और स्रोत कोड को अलग करें:



FROM gradle:7.6-jdk17 AS builderWORKDIR /app

# पहले केवल निर्भरता फ़ाइलों को कॉपी करेंCOPY build.gradle.kts settings.gradle.kts ./RUN gradle dependencies --no-daemon

# फिर स्रोत कोड (अधिक बार बदलता है)COPY src ./srcRUN gradle build --no-daemon -x test


यह दृष्टिकोण सुनिश्चित करता है कि निर्भरता वाली लेयर केवल build.gradle.kts बदलने पर ही पुनर्निर्मित होगी। अन्यथा, डॉकर कैश का उपयोग करता है, प्रत्येक पुनरावृत्ति पर मिनटों की बचत करता है।



सुझाव: बड़ी संख्या में निर्भरताओं वाले कोटलिन प्रोजेक्ट्स (जैसे, Spring Boot) के लिए, यह तकनीक विशेष रूप से प्रासंगिक है - Gradle कैश लोड करने में 2-3 मिनट तक लग सकते हैं।



3. Ktor अनुप्रयोगों का कंटेनरीकरण



Ktor कोटलिन पर एक हल्का एसिंक्रोनस फ्रेमवर्क है, जो माइक्रोसर्विसेज के लिए आदर्श है। Ktor एप्लिकेशन के कंटेनरीकरण के लिए न्यूनतम कॉन्फ़िगरेशन की आवश्यकता होती है, लेकिन कोरूटीन से संबंधित कुछ बारीकियाँ हैं।



Ktor के लिए Dockerfile का उदाहरण:



FROM gradle:7.6-jdk17 AS builderWORKDIR /appCOPY build.gradle.kts settings.gradle.kts ./RUN gradle dependencies --no-daemonCOPY src ./srcRUN gradle build --no-daemon -x test

FROM eclipse-temurin:17-jre-alpineWORKDIR /appCOPY --from=builder /app/build/libs/ktor-app-*.jar app.jarEXPOSE 8080

# महत्वपूर्ण: कोरूटीन के लिए JVM सेटिंगCMD ["java", "-XX:+UseZGC", "-Xms256m", "-Xmx512m", "-jar", "app.jar"]


मुख्य बिंदु:

  • ZGC का उपयोग करें (Z Garbage Collector) - यह पॉज़ को कम करता है, जो बड़ी संख्या में कोरूटीन वाले एसिंक्रोनस अनुप्रयोगों के लिए महत्वपूर्ण है।
  • मेमोरी को सीमित करें -Xms और -Xmx के माध्यम से। कंटेनरों में, यह OOM त्रुटियों से बचने में मदद करता है।
  • सुनिश्चित करें कि Ktor सर्वर मुख्य थ्रेड को ब्लॉक न करे - कोरूटीन को Dispatchers.IO या कस्टम पूल के माध्यम से कॉन्फ़िगर किया जाना चाहिए।


कंटेनर में काम करने के लिए Ktor सेटिंग का उदाहरण:



fun main() {    embeddedServer(Netty, port = 8080, host = "0.0.0.0") {        routing {            get("/") {                

ब्लॉग

पुस्तक अनुशंसाएँ