Docker وJava: حاويات التطبيقات المتقدمة

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

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

ابدأ الدورة

Docker وJava: حاويات التطبيقات المتقدمة



لطالما أصبحت حاويات تطبيقات Java باستخدام Docker معيارًا صناعيًا. ومع ذلك، فإن ملفات Docker الأساسية وأوامر docker run البسيطة ليست سوى غيض من فيض. على المستوى المتقدم، يواجه المطورون تحديات مثل تحسين أحجام الصور، وضبط JVM داخل الحاوية، وتنظيم عمليات البناء متعددة المراحل، وتنسيق الخدمات المصغرة. في هذه المقالة، سنغطي التقنيات الرئيسية التي ستساعدك على نقل حاويات Java إلى المستوى الاحترافي.



1. البناء متعدد المراحل: صورة مصغرة للإنتاج



من المشاكل الرئيسية عند حاويات Java هو حجم الصورة النهائية. تزن صورة openjdk:17-jdk الأساسية حوالي 400 ميجابايت، وهو حجم زائد عن الحاجة لوقت التشغيل. الحل هو البناء متعدد المراحل.



المرحلة الأولى (البناء) تستخدم JDK الكامل وأدوات البناء (Maven/Gradle). المرحلة الثانية (وقت التشغيل) تستخدم صورة JRE خفيفة الوزن وتنسخ فقط ملف JAR/WAR الذي تم بناؤه.



# Stage 1: Build the applicationFROM maven:3.8.5-openjdk-17 AS builderWORKDIR /appCOPY pom.xml .COPY src ./srcRUN mvn clean package -DskipTests

# Stage 2: Minimal runtime imageFROM openjdk:17-jre-slimWORKDIR /app# Copy only the built artifactCOPY --from=builder /app/target/myapp-*.jar app.jarEXPOSE 8080CMD ["java", "-jar", "app.jar"]


المزايا:

  • تزن الصورة النهائية ~180 ميجابايت بدلاً من 400+ ميجابايت
  • يقلل من سطح الهجوم (لا يوجد مترجم، أدوات غير ضرورية)
  • يسرع أوقات النشر وتنزيل الصورة


2. تكوين JVM لعمل الحاويات



لفترة طويلة، كان JVM يتكيف بشكل سيئ مع قيود الحاوية (cgroups). بدءًا من Java 10، ظهرت علامات لتحديد الموارد بشكل صريح، وفي Java 17+ أصبح السلوك أكثر قابلية للتنبؤ. ومع ذلك، على المستوى المتقدم، من المهم التحكم يدويًا في الذاكرة ووحدة المعالجة المركزية.



معلمات JVM الرئيسية للحاويات:

  • -XX:MaxRAMPercentage=75.0 — يخصص 75% من ذاكرة الحاوية للـ heap (بدلاً من -Xmx الثابت)
  • -XX:+UseContainerSupport — يتيح الوعي بحدود الحاوية (مفعل افتراضيًا منذ Java 10+)
  • -XX:ActiveProcessorCount=2 — يحدد صراحة عدد المعالجات المتاحة
  • -XX:+ExitOnOutOfMemoryError — ينهي العملية عند حدوث OutOfMemoryError (لإعادة تشغيل الحاوية بسرعة)


# Example Dockerfile with optimized JVM flagsFROM eclipse-temurin:17-jre-alpineWORKDIR /appCOPY target/app.jar app.jar

# JVM configuration for the containerENV JAVA_OPTS="-XX:MaxRAMPercentage=75.0 \ -XX:+UseContainerSupport \ -XX:+ExitOnOutOfMemoryError \ -XX:+PrintGCDetails"

EXPOSE 8080CMD ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]


هام: استخدم eclipse-temurin أو amazon-corretto — فهذه صور رسمية ومدعومة جيدًا بسياسة تحديث شفافة.



3. Docker Compose لهندسة الخدمات المصغرة



في المشاريع الحقيقية، نادرًا ما يوجد تطبيق Java بمعزل عن الآخر. عادة ما يكون مزيجًا: Spring Boot الخلفي + PostgreSQL + Redis + Kafka. يتيح لك Docker Compose وصف البنية التحتية بأكملها في ملف YAML واحد.



version: '3.8'

services: postgres: image: postgres:15-alpine environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: secret volumes: - pgdata:/var/lib/postgresql/data networks: - backend

redis: image: redis:7-alpine ports: - "6379:6379" networks: - backend

app: build: context: . dockerfile: Dockerfile ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:postgresql:

المدونات

توصيات الكتب