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

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

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

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

Docker और Kotlin: उन्नत स्तर पर अनुप्रयोगों का कंटेनरीकरण

\n\n

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

\n\n

1. Kotlin अनुप्रयोगों का मल्टी-स्टेज बिल्ड

\n\n

JVM अनुप्रयोगों को कंटेनरीकृत करने में मुख्य समस्याओं में से एक अंतिम इमेज का आकार है। मानक OpenJDK इमेज का वजन 400 MB से अधिक हो सकता है। मल्टी-स्टेज बिल्ड आपको बिल्ड वातावरण को रनटाइम वातावरण से अलग करने की अनुमति देता है, जिसमें न्यूनतम रनटाइम इमेज का उपयोग किया जाता है।

\n\n

Kotlin पर Gradle प्रोजेक्ट के लिए उदाहरण

\n\n
# पहला चरण: बिल्ड\nFROM gradle:8.5-jdk21 AS builder\nWORKDIR /app\nCOPY build.gradle.kts settings.gradle.kts ./\nCOPY src ./src\nRUN gradle build --no-daemon -x test\n\n# दूसरा चरण: निष्पादन\nFROM eclipse-temurin:21-jre-alpine\nWORKDIR /app\nCOPY --from=builder /app/build/libs/app.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]
\n\n

पूर्ण JDK इमेज के बजाय eclipse-temurin:21-jre-alpine का उपयोग करने से आकार 400+ MB से घटकर ~120 MB हो जाता है। Ktor या Spring Boot पर Kotlin अनुप्रयोगों के लिए यह पर्याप्त से अधिक है।

\n\n

लेयर कैशिंग का अनुकूलन

\n\n

पुनरावृत्त बिल्ड को गति देने के लिए, निर्भरताओं को स्रोत कोड से अलग कॉपी करें:

\n\n
FROM gradle:8.5-jdk21 AS builder\nWORKDIR /app\n# पहले निर्भरताएँ (यदि नहीं बदली हैं तो कैश हो जाती हैं)\nCOPY build.gradle.kts settings.gradle.kts ./\nRUN gradle dependencies --no-daemon\n# फिर स्रोत\nCOPY src ./src\nRUN gradle build --no-daemon -x test
\n\n

यह तकनीक CI/CD में विशेष रूप से उपयोगी है, जहाँ हर सेकंड मायने रखता है।

\n\n

2. Kotlin अनुप्रयोगों के लिए इमेज का अनुकूलन

\n\n

बेस इमेज चुनने के अलावा, आकार कम करने और सुरक्षा बढ़ाने के लिए अतिरिक्त तकनीकें मौजूद हैं।

\n\n

कस्टम JRE बनाने के लिए JLink का उपयोग

\n\n

यदि आपका एप्लिकेशन JDK मॉड्यूल के केवल एक भाग का उपयोग करता है, तो आप न्यूनतम JRE बना सकते हैं:

\n\n
# बिल्डर चरण में\nRUN jlink --module-path /opt/java/openjdk/jmods \\\n          --add-modules java.base,java.logging,java.naming,java.sql \\\n          --output /custom-jre \\\n          --strip-debug --no-man-pages --no-header-files\n\n# रनटाइम चरण में\nFROM alpine:3.19\nCOPY --from=builder /custom-jre /opt/jre\nCOPY --from=builder /app/build/libs/app.jar /app/app.jar\nENV PATH="/opt/jre/bin:${PATH}"\nEXPOSE 8080\nCMD ["java", "-jar", "/app/app.jar"]
\n\n

इमेज का आकार घटकर 50-70 MB हो सकता है।

\n\n

Spring Boot के साथ मल्टी-लेयर आर्किटेक्चर

\n\n

Spring Boot 3+ fat JAR को लेयर में विभाजित करने का समर्थन करता है। Dockerfile में इसका उपयोग करें:

\n\n
FROM eclipse-temurin:21-jre-alpine AS builder\nWORKDIR /app\nCOPY build/libs/*.jar app.jar\nRUN java -Djarmode=layertools -jar app.jar extract\n\nFROM eclipse-temurin:21-jre-alpine\nWORKDIR /app\nCOPY --from=builder /app/dependencies/ ./\nCOPY --from=builder /app/spring-boot-loader/ ./\nCOPY --from=builder /app/snapshot-dependencies/ ./\nCOPY --from=builder /app/application/ ./\nENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]
\n\n

अब कोड बदलने पर केवल application लेयर पुनः बिल्ड होती है, जबकि निर्भरताएँ और Spring Boot loader कैश्ड रहते हैं।

\n\n

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

\n\n

Ktor Kotlin पर एसिंक्रोनस सर्वर बनाने के लिए एक हल्का फ्रेमवर्क है। इसके कंटेनरीकरण की अपनी विशेषताएँ हैं।

\n\n

Netty के साथ Ktor के लिए Dockerfile

\n\n
FROM gradle:8.5-jdk21 AS builder\nWORKDIR /app\nCOPY build.gradle.kts settings.gradle.kts ./\nRUN gradle dependencies --                

ब्लॉग

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