Docker وJava: حاويات التطبيقات للمطورين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة إلى Docker وJava



تطوير تطبيقات Java الحديث لا يمكن تصوره بدون الحاويات. Docker هي منصة لتغليف وتسليم وتشغيل التطبيقات في بيئات معزولة (حاويات). لمطوري Java، يحل Docker المشكلة الأبدية: "إنه يعمل على جهازي!". تضمن الحاوية أن تطبيقك سيعمل بنفس الطريقة على الجهاز المحلي وخادم التطوير وفي الإنتاج.



في هذه المقالة، سنشرح كيفية حاوينة تطبيقات Java باستخدام Docker: من Dockerfile بسيط إلى تحسين الصور للهندسة المعمارية للخدمات المصغرة. جميع الأمثلة مكتوبة بلغة Java وجاهزة للاستخدام.



أساسيات Docker لتطبيقات Java



ما هي صورة Docker والحاوية؟

صورة Docker هي قالب (للقراءة فقط) يحتوي على كل ما هو ضروري لتشغيل التطبيق: JVM والمكتبات والرمز والإعدادات. الحاوية هي مثيل قيد التشغيل للصورة. بالنسبة لـ Java، هذا يعني أنك لست بحاجة إلى تثبيت JDK يدويًا على الخادم - ستكون JVM موجودة بالفعل داخل الحاوية.



إنشاء Dockerfile بسيط لـ Java

لننظر إلى مثال أساسي. لدينا تطبيق Java بسيط (على سبيل المثال، HelloWorld.java).



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


سنقوم بإنشاء Dockerfile:



# نستخدم الصورة الرسمية لـ OpenJDKFROM 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)، تصبح العملية أكثر تعقيدًا. لننظر إلى خدمة مصغرة نموذجية.



البناء متعدد المراحل (Multi-stage build)

هذه هي أفضل ممارسة لـ Java: أولاً نقوم ببناء التطبيق باستخدام 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 بناء الطبقات الأخيرة فقط، وسيأخذ التبعيات من ذاكرة التخزين المؤقت.



العمل مع متغيرات البيئة والملفات الشخصية



تمرير المعاملات إلى تطبيق Java

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


مثال docker-compose لـ Java + قاعدة بيانات

بالنسبة للخدمات المصغرة، من المناسب استخدام docker-compose.yml:



version: '3.8'services:  app:    bu                

المدونات

توصيات الكتب