مقدمة: لماذا يعتبر Docker مهمًا لمطور Java؟
نادرًا ما يخلو تطوير Java الحديث من الحاويات. يتيح Docker حزم التطبيق مع جميع التبعيات و JVM والإعدادات في حاوية معزولة. هذا يحل مشكلة "يعمل على جهازي" ويبسط CI/CD. في هذه المقالة، سنستعرض الدورة الكاملة: من تثبيت Docker إلى تحسين الصور للإنتاج.
1. أساسيات Docker لـ Java
1.1 ما هو Docker ولماذا هو مهم لمشاريع Java؟
Docker هي منصة لإنشاء وتسليم وتشغيل التطبيقات في حاويات. بالنسبة لـ Java، هذا مهم بشكل خاص:
- عزل إصدارات JVM — يمكن استخدام Java 11 لخدمة و Java 17 لخدمة أخرى على نفس المضيف.
- قابلية التكرار — تحتوي الصورة على إصدار دقيق من JDK والمكتبات والأدوات النظامية.
- قابلية التوسع — سهولة تشغيل عدة نسخ عبر Kubernetes أو Docker Swarm.
1.2 تثبيت Docker
للبدء، قم بتثبيت Docker Desktop (Windows/Mac) أو Docker Engine (Linux). تحقق من التثبيت:
docker --versiondocker info2. إنشاء Dockerfile لتطبيق Java
لنفكر في تطبيق Spring Boot بسيط. سننشئ ملف Dockerfile في جذر المشروع.
2.1 Dockerfile أساسي
# استخدام الصورة الرسمية لـ OpenJDKFROM openjdk:17-jdk-alpine
# تعيين دليل العملWORKDIR /app
# نسخ ملف JARCOPY target/myapp.jar app.jar
# فتح المنفذEXPOSE 8080
# أمر التشغيلENTRYPOINT ["java", "-jar", "app.jar"]2.2 بناء وتشغيل الحاوية
# بناء الصورةdocker build -t my-java-app .
# تشغيل الحاويةdocker run -p 8080:8080 my-java-appبعد التشغيل، سيكون التطبيق متاحًا على العنوان http://localhost:8080.
3. تحسين صور Docker لـ Java
الصور الكبيرة تبطئ النشر. سنستعرض تقنيات التحسين الرئيسية.
3.1 البناء متعدد المراحل (Multi-stage builds)
يسمح بفصل مرحلة البناء عن مرحلة التشغيل. تحتوي الصورة النهائية على JAR فقط، بدون Maven/Gradle والملفات المصدرية.
# مرحلة البناءFROM maven:3.8.5-openjdk-17 AS buildWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offlineCOPY src ./srcRUN mvn package -DskipTests
# مرحلة التشغيلFROM openjdk:17-jdk-alpineWORKDIR /appCOPY --from=build /app/target/myapp.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]3.2 تحسين الطبقات
يقوم Docker بتخزين الطبقات مؤقتًا. قم بتقسيم نسخ البيانات: أولاً التبعيات (تتغير نادرًا)، ثم الكود (يتغير كثيرًا).
FROM maven:3.8.5-openjdk-17 AS buildWORKDIR /app# نسخ POM فقط وتنزيل التبعياتCOPY pom.xml .RUN mvn dependency:go-offline# نسخ الملفات المصدرية والبناءCOPY src ./srcRUN mvn package -DskipTests
FROM openjdk:17-jdk-alpineWORKDIR /appCOPY --from=build /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]3.3 استخدام jlink لإنشاء JRE مصغرة
إذا كنت تستخدم Java 9+، يمكنك إنشاء JRE مخصصة بالوحدات المطلوبة فقط.
FROM openjdk:17-slim AS jre-buildRUN jlink --add-modules java.base,java.logging,java.sql \ --output /jre \ --strip-debug \ --no-man-pages \ --no-header-files
FROM alpine:latestCOPY --from=jre-build /jre /jreCOPY target/app.jar /app.jarENTRYPOINT ["/jre/bin/java", "-jar", "/app.jar"]يمكن أن تزن هذه الصورة أقل من 50 ميجابايت بدلاً من 300+ ميجابايت.
4. Docker Compose للخدمات المصغرة Java
إذا كان لديك عدة خدمات (مثل Spring Boot + PostgreSQL)، استخدم docker-compose.yml.