لقد قمت بإنشاء تطبيق Spring Boot. إنه يعمل بشكل رائع على جهازك المحلي، والآن تحتاج إلى نشر التطبيق في مكان آخر. في بعض الأنظمة الأساسية، يمكنك إرسال ملف jar مباشرة وسيتم نشره. في بعض الأماكن، يمكنك تشغيل جهاز افتراضي، وتنزيل الكود المصدري هناك، وإنشائه، وتشغيله. ولكن، في أغلب الأحيان، ستحتاج إلى نشر التطبيق باستخدام الحاويات. في معظم الأحيان، يتم استخدام Docker لإنشاء الصورة وتشغيلها في حاوية. أيضًا، عند تحميل ملف الجرة إلى بعض الأنظمة الأساسية، يتم تشغيل التطبيق داخل حاوية أسفل الغطاء.
لذلك، في هذه المدونة، سنرى 3 طرق مختلفة لإنشاء صورة Docker لتطبيق Spring Boot المحدد. لنبدأ:
الطريقة الساذجة وغير الكافية لإنشاء صورة Docker لأي تطبيق هي استخدام ملف Dockerfile البسيط الذي يقوم بنسخ ملف jar داخل الصورة وتشغيله باستخدام أمر java -jar.
إليك ملف Dockerfile الذي يمكنك وضعه في جذر المشروع:
FROM eclipse-temurin:21-jre-ubi9-minimal ARG JAR_FILE COPY ${JAR_FILE} application.jar ENTRYPOINT ["java", "-jar", "/application.jar"]
لقد حددنا وسيطة واحدة JAR_FILE وهي موقع ملف الجرة المطلوب استخدامه.
بعد إنشاء ملف Dockerfile أعلاه، يتم استخدام الخطوات التالية لإنشاء صورة Docker:
قم بإنشاء ملف jar لمشروع Spring Boot:
./gradlew bootJar # For Gradle build system
أو
./mvnw spring-boot:build-jar # For Maven build system
استخدم ملف Dockerfile لإنشاء صورة Docker باستخدام أحدث ملف jar. في الأمر أدناه، استبدل {IMAGE_NAME} باسم الصورة المطلوبة و{JAR_FILE} بالمسار إلى ملف الجرة الذي تم إنشاؤه. يحتوي اسم الصورة على علامة أيضًا، مثل - mycompany/product-service:0.0.1-SNAPSHOT:
docker build --build-arg JAR_FILE={JAR_FILE} --tag {IMAGE_NAME} .
تحقق من إنشاء صورة Docker باستخدام الأمر التالي. يجب أن تكون قادرًا على رؤية الصورة بالاسم المحدد في الأمر أعلاه:
docker images
على الرغم من أنه من الممكن والسهل تعبئة جرة Spring Boot uber كصورة Docker (كما هو مذكور في الطريقة السابقة)، إلا أن هناك العديد من الجوانب السلبية لنسخ وتشغيل جرة الدهون كما هي في صورة Docker. على سبيل المثال،
نظرًا لأننا نقوم بتجميع التعليمات البرمجية الخاصة بنا في كثير من الأحيان بدلاً من ترقية إصدار Spring Boot، فمن الأفضل فصل الأشياء أكثر قليلاً. إذا وضعنا ملفات jar هذه (التي نادرًا ما يتم تغييرها) في الطبقة قبل طبقة التطبيق، فغالبًا ما يحتاج Docker إلى تغيير الطبقة السفلية فقط ويمكنه اختيار الباقي من ذاكرة التخزين المؤقت الخاصة به.
لإنشاء صورة Docker ذات طبقات، نحتاج إلى إنشاء جرة ذات طبقات أولاً. في الوقت الحاضر، يتم تمكينه افتراضيًا في Gradle وMaven. يمكنك تمكين أو تعطيل سلوك الجرة ذات الطبقات باستخدام الإعداد التالي:
// build.gradle tasks.named("bootJar") { layered { enabled = false } }
// build.gradle.kts tasks.named("bootJar") { layered { enabled.set(false) } }
org.springframework.boot spring-boot-maven-plugin true
يمكنك أيضًا ضبط كيفية إنشاء الطبقات. راجع الوثائق الخاصة بتكوين Gradle أو Maven.
يوجد أدناه ملف Dockerfile، والذي يمكن استخدامه للاستفادة من الجرة ذات الطبقات وإنشاء صورة Docker ذات طبقات لتطبيق Spring Boot.
# Perform the extraction in a separate builder container FROM eclipse-temurin:21-jre-ubi9-minimal AS builder WORKDIR /builder # This points to the built jar file in the target folder # Adjust this to 'build/libs/*.jar' if you're using Gradle ARG JAR_FILE=target/*.jar # Copy the jar file to the working directory and rename it to application.jar COPY ${JAR_FILE} application.jar # Extract the jar file using an efficient layout RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted # This is the runtime container FROM eclipse-temurin:21-jre-ubi9-minimal WORKDIR /application # Copy the extracted jar contents from the builder container into the working directory in the runtime container # Every copy step creates a new docker layer # This allows docker to only pull the changes it really needs COPY --from=builder /builder/extracted/dependencies/ ./ COPY --from=builder /builder/extracted/spring-boot-loader/ ./ COPY --from=builder /builder/extracted/snapshot-dependencies/ ./ COPY --from=builder /builder/extracted/application/ ./ # Start the application jar - this is not the uber jar used by the builder # This jar only contains application code and references to the extracted jar files # This layout is efficient to start up and CDS friendly ENTRYPOINT ["java", "-jar", "application.jar"]
خطوات إنشاء صورة Docker ذات الطبقات هي نفس خطوات إنشاء صورة Docker الأساسية. يرجى الرجوع هناك.
ماذا لو أخبرتك أنه يمكنك إنشاء صورة Docker دون إنشاء ملف Dockerfile؟ يمكننا إنشاء صور عامل الإرساء مباشرة من المكون الإضافي Gralde أو Maven باستخدام Cloud Native Buildpacks. تستخدم بعض الأنظمة الأساسية (مثل Heroku أو Cloud Foundry) حزم Buildpacks لتحويل ملفات jar المتوفرة إلى صور قابلة للتشغيل.
يتضمن Spring Boot دعمًا مباشرًا لـ Maven وGradle. لا نحتاج إلى تضمين أي مكونات إضافية. فقط قم بتشغيل الأمر أدناه:
./gradlew bootBuildImage # For gradle build system
أو
./mvnw spring-boot:build-image # For maven build system
يقوم الأمر أعلاه بإنشاء صورة بالاسم الافتراضي {PROJECT_NAME}:${PROJECT_VERSION}. إذا كنت تريد تكوين اسم الصورة التي تم إنشاؤها، يمكنك اتباع الخطوات التالية:
يمكننا تكوين مهمة bootBuildImage لتعيين اسم الصورة، مثل هذا:
// For build.gradle.kts val imagePrefix = "javarush" val dockerImageName = "docker-example" tasks.named("bootBuildImage") { imageName.set("${imagePrefix}/${dockerImageName}:${version}") }
// For build.gradle def imagePrefix = "javarush" def dockerImageName = "docker-example" tasks.named("bootBuildImage") { imageName = "${imagePrefix}/${dockerImageName}:${version}" }
يمكننا تكوين Spring-boot-maven-plugin لاستخدام اسم صورة آخر، مثل هذا:
... javarush org.springframework.boot spring-boot-maven-plugin ${imagePrefix}/${project.artifactId}:${project.version}
يمكننا أيضًا تحديد اسم الصورة أثناء تشغيل أمر إنشاء الصورة.
./gradlew bootBuildImage --imageName=javarush/docker-example:1.0.0 # For grade build system ./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=javarush/docker-example:1.0.0 # For maven build system
يمكنك الاطلاع على الوثائق لتكوين البرنامج الإضافي Gradle أو Maven بشكل أكبر.
هذه هي طريقتي المفضلة لإنشاء صورة Docker لأي تطبيق Spring Boot.
بمجرد إنشاء صورة عامل إرساء، عليك التأكد من أنها تعمل كما هو متوقع. بعد التأكد من إنشاء الصورة، يمكنك تشغيلها مباشرةً باستخدام أمر docker run. على سبيل المثال،
docker run -p "8080:8080" {IMAGE_NAME}
ولكن هذه ليست الطريقة التي يتم بها استخدام الصور في تطبيقات الإنتاج. يُستخدم Docker Compose لتشغيل وإدارة صور عامل الإرساء المتعددة.
لقد رأينا في هذه المدونة كيفية إنشاء صور Docker لتطبيقات Spring Boot باستخدام طرق مختلفة. تعد القدرة على إنشاء صور عامل إرساء لتطبيقاتك مهارة يجب معرفتها لأن الصورة هي ما يتم تسليمه. شكرا لقراءة المقال حتى النهاية. أنا أقدر ذلك. سألتقي بك في المرة القادمة. كما هو الحال دائمًا، نرحب بجميع التعليقات والاقتراحات.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3