Docker और Java: डेवलपर्स के लिए एप्लिकेशन कंटेनरीकरण

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

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

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

डॉकर और जावा का परिचय



कंटेनरीकरण के बिना आधुनिक जावा एप्लिकेशन डेवलपमेंट की कल्पना नहीं की जा सकती। Docker एक प्लेटफॉर्म है जो एप्लिकेशन को पैकेज करने, डिलीवर करने और आइसोलेटेड एनवायरनमेंट (कंटेनर) में चलाने के लिए है। जावा डेवलपर्स के लिए, Docker एक सदियों पुरानी समस्या को हल करता है: "मेरी मशीन पर तो सब काम करता है!"। कंटेनर गारंटी देता है कि आपका एप्लिकेशन लोकल मशीन, डेवलपमेंट सर्वर और प्रोडक्शन में एक जैसा चलेगा।



इस लेख में, हम Docker का उपयोग करके जावा एप्लिकेशन को कंटेनरीकृत करने का तरीका समझेंगे: सरल Dockerfile से लेकर माइक्रोसर्विस आर्किटेक्चर के लिए इमेज ऑप्टिमाइज़ेशन तक। सभी उदाहरण जावा में लिखे गए हैं और उपयोग के लिए तैयार हैं।



जावा एप्लिकेशन के लिए Docker की मूल बातें



Docker इमेज और कंटेनर क्या है?

Docker इमेज एक टेम्पलेट (read-only) है जिसमें एप्लिकेशन चलाने के लिए आवश्यक सब कुछ होता है: JVM, लाइब्रेरी, कोड और सेटिंग्स। कंटेनर इमेज का एक चलता हुआ इंस्टेंस है। जावा के लिए, इसका मतलब है कि आपको सर्वर पर मैन्युअल रूप से JDK इंस्टॉल करने की आवश्यकता नहीं है — JVM पहले से कंटेनर के अंदर होगा।



जावा के लिए एक सरल Dockerfile बनाना

आइए एक बुनियादी उदाहरण देखें। हमारे पास एक सरल जावा एप्लिकेशन है (जैसे, HelloWorld.java)।



// HelloWorld.javapublic class HelloWorld {    public static void main(String[] args) {        System.out.println("Hello from Docker and Java!");    }}


चलिए एक Dockerfile बनाते हैं:



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

# वर्किंग डायरेक्टरी सेट करेंWORKDIR /app

# कंपाइल किए गए jar या class फाइलों को कॉपी करेंCOPY HelloWorld.class .

# रन कमांडCMD ["java", "HelloWorld"]


बिल्ड और रन:



# इमेज बिल्ड करेंdocker build -t hello-java .

# कंटेनर चलाएंdocker run hello-java


आउटपुट: Hello from Docker and Java!



Spring Boot एप्लिकेशन का कंटेनरीकरण



वास्तविक प्रोजेक्ट्स (जैसे, Spring Boot पर) के लिए, प्रक्रिया अधिक जटिल हो जाती है। आइए एक विशिष्ट माइक्रोसर्विस देखें।



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

यह जावा के लिए सबसे अच्छा अभ्यास है: पहले पूर्ण JDK के साथ एप्लिकेशन बनाएं, फिर परिणाम को हल्के JRE इमेज में कॉपी करें।



# स्टेज 1: बिल्डFROM maven:3.8.5-openjdk-11 AS buildWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offlineCOPY src ./srcRUN mvn clean package -DskipTests

# स्टेज 2: रनFROM openjdk:11-jre-slimWORKDIR /appCOPY --from=build /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]


व्याख्या:

  • build — कंपाइलेशन के लिए Maven और पूर्ण JDK का उपयोग करता है।
  • अंतिम इमेज — केवल JRE और तैयार jar फाइल शामिल है। इमेज का आकार 2-3 गुना कम हो जाता है।


लेयर कैशिंग का ऑप्टिमाइज़ेशन

Docker प्रत्येक लेयर (इंस्ट्रक्शन) को कैश करता है। बिल्ड को गति देने के लिए, शायद ही बदलने वाली डिपेंडेंसी को शुरुआत में रखें:



FROM maven:3.8.5-openjdk-11 AS buildWORKDIR /app# डिपेंडेंसी कैश करेंCOPY pom.xml .RUN mvn dependency:go-offline# अब कोड कॉपी करेंCOPY src ./srcRUN mvn clean package


अब, यदि आप केवल कोड बदलते हैं, तो Docker केवल अंतिम लेयर को रीबिल्ड करेगा, और डिपेंडेंसी कैश से लेगा।



एनवायरनमेंट वेरिएबल और प्रोफाइल के साथ काम करना



जावा एप्लिकेशन में पैरामीटर पास करना

Docker आपको एनवायरनमेंट वेरिएबल के माध्यम से एप्लिकेशन को लचीले ढंग से कॉन्फ़िगर करने की अनुमति देता है। Spring Boot के लिए यह विशेष रूप से सुविधाजनक है।



docker run -e SPRING_PROFILES_ACTIVE=prod -e DB_URL=jdbc:postgresql://db:5432/mydb my-app


Dockerfile में डिफ़ॉल्ट मान सेट किए जा सकते हैं:



ENV SPRING_PROFILES_ACTIVE=devENV DB_URL=jdbc:h2:mem:testdb


Java + DB के लिए docker-compose उदाहरण

माइक्रोसर्विस के लिए docker-compose.yml का उपयोग करना सुविधाजनक है:



version: '3.8'services:  app:    bu                

ब्लॉग

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