डॉकर और जावा: एप्लिकेशन कंटेनरीकरण — एक संपूर्ण गाइड

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

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

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

डॉकर और जावा का परिचय: कंटेनरीकरण डेवलपमेंट को कैसे बदल रहा है



आधुनिक सॉफ्टवेयर डेवलपमेंट कंटेनरीकरण के बिना अकल्पनीय है। डॉकर एप्लिकेशन को पैकेज करने, वितरित करने और चलाने के लिए डी-फैक्टो मानक बन गया है। जावा डेवलपर्स के लिए, डॉकर का उपयोग प्रमुख समस्याओं को हल करता है: "यह मेरी मशीन पर काम करता है" और वातावरण सेटअप की जटिलताएँ। इस लेख में, हम जानेंगे कि जावा एप्लिकेशन को कैसे कंटेनरीकृत किया जाए, एक साधारण JAR फ़ाइल से लेकर Spring Boot पर एक जटिल माइक्रोसर्विस तक।



डॉकर एप्लिकेशन को उसकी निर्भरताओं (JVM, लाइब्रेरीज़, सिस्टम यूटिलिटीज़) के साथ एक हल्के, पोर्टेबल कंटेनर में अलग करने की अनुमति देता है। यह जावा के लिए विशेष रूप से महत्वपूर्ण है, जहाँ JDK का संस्करण, मेमोरी सेटिंग्स और सिस्टम लाइब्रेरीज़ प्रोग्राम के व्यवहार को बहुत प्रभावित कर सकते हैं।



आप इस लेख से क्या सीखेंगे

  • जावा एप्लिकेशन के लिए Dockerfile बनाना
  • इमेज के आकार का अनुकूलन
  • मल्टी-मॉड्यूल Maven/Gradle प्रोजेक्ट के साथ काम करना
  • सुरक्षा और प्रदर्शन की सर्वोत्तम प्रथाएँ


1. मूल बातें: जावा एप्लिकेशन के लिए Dockerfile बनाना



एक सरल उदाहरण से शुरू करते हैं। मान लीजिए कि आपके पास एक जावा एप्लिकेशन है जो JAR फ़ाइल में संकलित है। यहाँ एक न्यूनतम Dockerfile है जो इसे कंटेनर में पैकेज करेगा:



# आधिकारिक OpenJDK इमेज का उपयोग करेंFROM openjdk:17-jdk-slim

# कार्यशील निर्देशिका सेट करेंWORKDIR /app

# JAR फ़ाइल को कंटेनर में कॉपी करेंCOPY target/myapp.jar app.jar

# वह पोर्ट खोलें जिसे एप्लिकेशन सुन रहा हैEXPOSE 8080

# चलाने का आदेशENTRYPOINT ["java", "-jar", "app.jar"]


यह Dockerfile तीन सरल काम करता है: JDK 17 के साथ बेस इमेज लेता है, संकलित JAR कॉपी करता है और उसे चलाता है। हालाँकि, वास्तविक प्रोजेक्ट में यह दृष्टिकोण अक्षम है — हर बार कोड बदलने पर डॉकर पूरी इमेज को फिर से बनाता है, जिसमें JAR कॉपी करना भी शामिल है।



मल्टी-स्टेज बिल्ड



बिल्ड और रन चरणों को अलग करने के लिए मल्टी-स्टेज Dockerfile का उपयोग करें। यह बिल्ड टूल्स (Maven, Gradle, कम्पाइलेशन के लिए JDK) को हटाकर अंतिम इमेज को छोटा करता है।



# बिल्ड चरणFROM maven:3.9.6-eclipse-temurin-17 AS builderWORKDIR /buildCOPY pom.xml .RUN mvn dependency:go-offlineCOPY src ./srcRUN mvn clean package -DskipTests

# अंतिम चरणFROM openjdk:17-jdk-slimWORKDIR /appCOPY --from=builder /build/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]


पहला चरण कम्पाइलेशन के लिए पूर्ण Maven इमेज का उपयोग करता है, दूसरा चलाने के लिए न्यूनतम JRE इमेज का। अंतिम इमेज का वजन ~200 MB होता है, जबकि पहले 700+ MB था।



2. इमेज ऑप्टिमाइज़ेशन: आकार कम करना और बिल्ड को गति देना



बड़ी इमेज डिप्लॉयमेंट को धीमा करती हैं और लोडिंग समय बढ़ाती हैं। जावा के लिए यहाँ कुछ तकनीकें दी गई हैं:



न्यूनतम JRE बनाने के लिए JLink का उपयोग करें



जावा 9 से शुरू करके, आप केवल आवश्यक मॉड्यूल वाली कस्टम JRE बना सकते हैं। यह इमेज के आकार को मौलिक रूप से कम करता है।



FROM openjdk:17-jdk-slim AS jre-builderRUN jlink \    --add-modules java.base,java.logging,java.sql \    --strip-debug \    --no-man-pages \    --no-header-files \    --compress=2 \    --output /jre

FROM debian:bookworm-slimCOPY --from=jre-builder /jre /jreWORKDIR /appCOPY target/myapp.jar app.jarENV PATH="/jre/bin:${PATH}"ENTRYPOINT ["java", "-jar", "app.jar"]


ऐसी इमेज का वजन केवल 40-60 MB हो सकता है, जबकि पहले 200+ MB था।



डॉकर लेयर कैशिंग



डॉकर प्रत्येक लेयर को कैश करता है। बिल्ड को गति देने के लिए, शायद ही बदलने वाली फ़ाइलों (निर्भरताएँ) को Dockerfile की शुरुआत में और बार-बार बदलने वाली फ़ाइलों (स्रोत कोड) को अंत में रखें।



FROM maven:3.9.6-eclipse-temurin-17 AS builderWORKDIR /build# पहले केवल pom.xml कॉपी करें और निर्भरताएँ डाउनलोड करेंCOPY pom.xml .RUN mvn dependency:go-offline# फिर स्रोत कॉपी करें और बिल्ड करेंCOPY src ./srcRUN mvn clean packag                

ब्लॉग

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