Docker وKotlin: حاويات التطبيقات من الألف إلى الياء

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

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

ابدأ الدورة

Docker وKotlin: حاويات التطبيقات من الألف إلى الياء



أصبحت الحاويات المعيار الفعلي للتطوير الحديث. فهي تحل مشكلة "يعمل على جهازي" وتُبسّط CI/CD. في هذه المقالة، سنشرح كيفية حاوية تطبيقات Kotlin بكفاءة باستخدام Docker - بدءًا من إنشاء Dockerfile بسيط وصولاً إلى تحسينات الإنتاج والتنسيق.



1. الأساسيات: Dockerfile لتطبيق Kotlin



قلب الحاويات هو Dockerfile. بالنسبة لتطبيقات Kotlin التي تُترجم إلى bytecode JVM، نستخدم البناء متعدد المراحل (multi-stage build). وهذا يسمح بفصل بيئة البناء عن بيئة التشغيل، مما يقلل حجم الصورة النهائية.



لننظر إلى تطبيق نموذجي على Kotlin باستخدام Gradle (ملف build.gradle.kts مبسط):



// build.gradle.ktsplugins {    kotlin("jvm") version "1.9.0"    application    id("com.google.cloud.tools.jib") version "3.4.0" // اختياري}

application { mainClass.set("com.example.MainKt")}


لننشئ Dockerfile بمرحلتين:



# المرحلة 1: البناءFROM gradle:8.5-jdk21 AS builderWORKDIR /appCOPY build.gradle.kts settings.gradle.kts ./COPY gradle ./gradleCOPY src ./srcRUN gradle build --no-daemon

# المرحلة 2: التشغيلFROM eclipse-temurin:21-jre-alpineWORKDIR /appCOPY --from=builder /app/build/libs/my-app-*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]


أوامر البناء والتشغيل:

docker build -t my-kotlin-app .docker run -p 8080:8080 my-kotlin-app


التوصيات:

  • استخدم eclipse-temurin (OpenJDK) بدلاً من JDK الكامل - الصورة أصغر.
  • خزّن التبعيات مؤقتًا: انسخ build.gradle.kts أولاً، ثم src.
  • لتطبيقات Spring Boot، يمكن استخدام layers للبناء التدريجي.


2. التحسين باستخدام Jib وGradle



كتابة Dockerfile يدويًا هي الطريقة التقليدية، لكن هناك أدوات تؤتمت العملية. Jib (من Google) يتكامل مع Maven/Gradle ويبني صور Docker محسّنة دون الحاجة إلى Docker daemon.



أضف إضافة Jib إلى build.gradle.kts:



plugins {    id("com.google.cloud.tools.jib") version "3.4.0"}

jib { from { image = "eclipse-temurin:21-jre-alpine" } to { image = "my-registry/my-kotlin-app:latest" } container { ports = listOf("8080") jvmFlags = listOf("-Xms512m", "-Xmx1024m") }}


البناء بأمر واحد:

./gradlew jibDockerBuild


مزايا Jib:

  • تقسيم تلقائي إلى طبقات (تبعيات، موارد، فئات).
  • لا يتطلب Dockerfile.
  • يعمل بدون Docker daemon - مثالي لـ CI/CD.


مثال لتطبيق Kotlin (خادم HTTP بسيط):



// src/main/kotlin/com/example/Main.ktpackage com.example

import com.sun.net.httpserver.HttpServerimport java.net.InetSocketAddress

fun main() { val server = HttpServer.create(InetSocketAddress(8080), 0) server.createContext("/") { exchange -> val response = "Hello from Kotlin in Docker!" exchange.sendResponseHeaders(200, response.length.toLong()) exchange.responseBody.write(response.toByteArray()) exchange.close() } server.start() println("Server started on port 8080")}


3. Docker Compose: تطبيقات متعددة الحاويات



نادرًا ما تتكون المشاريع الحقيقية من خدمة واحدة. Docker Compose يسمح بوصف وتشغيل عدة حاويات (مثل: تطبيق + قاعدة بيانات + Redis).



لننشئ docker-compose.yml لتطبيق Kotlin مع PostgreSQL:<

المدونات

توصيات الكتب