مقدمة إلى 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