Docker और Kotlin: एप्लिकेशन कंटेनरीकरण A से Z तक
\n\nकंटेनरीकरण आधुनिक विकास के लिए एक डी-फैक्टो मानक बन गया है। यह "मेरी मशीन पर काम करता है" समस्या को हल करता है और CI/CD को सरल बनाता है। इस लेख में, हम सीखेंगे कि Docker का उपयोग करके Kotlin एप्लिकेशन को प्रभावी ढंग से कैसे कंटेनरीकृत किया जाए - एक सरल Dockerfile बनाने से लेकर प्रोडक्शन ऑप्टिमाइज़ेशन और ऑर्केस्ट्रेशन तक।
\n\n1. मूल बातें: Kotlin एप्लिकेशन के लिए Dockerfile
\n\nकंटेनरीकरण का हृदय Dockerfile है। Kotlin एप्लिकेशन के लिए, जो JVM बाइट-कोड में कंपाइल होते हैं, हम मल्टी-स्टेज बिल्ड का उपयोग करते हैं। यह बिल्ड वातावरण को रनटाइम वातावरण से अलग करता है, जिससे अंतिम इमेज का आकार कम हो जाता है।
Gradle का उपयोग करते हुए एक सामान्य Kotlin एप्लिकेशन पर विचार करें (फ़ाइल build.gradle.kts सरलीकृत है):
// build.gradle.kts\nplugins {\n kotlin("jvm") version "1.9.0"\n application\n id("com.google.cloud.tools.jib") version "3.4.0" // वैकल्पिक\n}\n\napplication {\n mainClass.set("com.example.MainKt")\n}\n\n\nदो चरणों वाला Dockerfile बनाएं:
# चरण 1: बिल्ड\nFROM gradle:8.5-jdk21 AS builder\nWORKDIR /app\nCOPY build.gradle.kts settings.gradle.kts ./\nCOPY gradle ./gradle\nCOPY src ./src\nRUN gradle build --no-daemon\n\n# चरण 2: रन\nFROM eclipse-temurin:21-jre-alpine\nWORKDIR /app\nCOPY --from=builder /app/build/libs/my-app-*.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]\n\n\nबिल्ड और रन के लिए कमांड:
\ndocker build -t my-kotlin-app .\ndocker run -p 8080:8080 my-kotlin-app\n\nसुझाव:
\n- \n
- पूर्ण JDK के बजाय
eclipse-temurin(OpenJDK) का उपयोग करें - इमेज छोटी होती है। \n - डिपेंडेंसी को कैश करें: पहले
build.gradle.ktsकॉपी करें, फिरsrc। \n - Spring Boot एप्लिकेशन के लिए, इंक्रीमेंटल बिल्ड के लिए
layersका उपयोग करें। \n
2. Jib और Gradle के साथ ऑप्टिमाइज़ेशन
\n\nमैन्युअल रूप से Dockerfile लिखना क्लासिक है, लेकिन ऐसे टूल हैं जो प्रक्रिया को स्वचालित करते हैं। Jib (Google द्वारा) Maven/Gradle के साथ एकीकृत होता है और Docker daemon के बिना ऑप्टिमाइज़्ड Docker इमेज बनाता है।
\n\nbuild.gradle.kts में Jib प्लगइन जोड़ें:
plugins {\n id("com.google.cloud.tools.jib") version "3.4.0"\n}\n\njib {\n from {\n image = "eclipse-temurin:21-jre-alpine"\n }\n to {\n image = "my-registry/my-kotlin-app:latest"\n }\n container {\n ports = listOf("8080")\n jvmFlags = listOf("-Xms512m", "-Xmx1024m")\n }\n}\n\n\nएक कमांड से बिल्ड:
\n./gradlew jibDockerBuild\n\nJib के लाभ:
\n- \n
- स्वचालित रूप से लेयर में विभाजन (डिपेंडेंसी, रिसोर्सेज, क्लासेज)। \n
- Dockerfile की आवश्यकता नहीं है। \n
- Docker daemon के बिना काम करता है - CI/CD के लिए आदर्श। \n
Kotlin एप्लिकेशन का उदाहरण (सरल HTTP सर्वर):
\n\n// src/main/kotlin/com/example/Main.kt\npackage com.example\n\nimport com.sun.net.httpserver.HttpServer\nimport java.net.InetSocketAddress\n\nfun main() {\n val server = HttpServer.create(InetSocketAddress(8080), 0)\n server.createContext("/") { exchange ->\n val response = "Hello from Kotlin in Docker!"\n exchange.sendResponseHeaders(200, response.length.toLong())\n exchange.responseBody.write(response.toByteArray())\n exchange.close()\n }\n server.start()\n println("Server started on port 8080")\n}\n\n\n3. Docker Compose: मल्टी-कंटेनर एप्लिकेशन
\n\nवास्तविक प्रोजेक्ट शायद ही कभी एकल सेवा से बने होते हैं। Docker Compose आपको कई कंटेनर (जैसे, एप्लिकेशन + डेटाबेस + Redis) का वर्णन और चलाने की अनुमति देता है।
\n\nPostgreSQL के साथ Kotlin एप्लिकेशन के लिए docker-compose.yml बनाएं:<