יצירת תמונות Docker עם Spring Boot

1. הקדמה

ככל שיותר ארגונים עוברים לעבר מכולות ושרתים וירטואליים, דוקר הופך לחלק משמעותי יותר בתהליכי העבודה של פיתוח תוכנה. לשם כך, אחת התכונות החדשות והגדולות ב- Spring Boot 2.3 היא היכולת ליצור תמונת Docker ליישומי Spring Boot בקלות.

במדריך זה נבדוק כיצד ליצור תמונות Docker ליישום Spring Boot.

2. בניית דוקר מסורתית

הדרך המסורתית לבנות תמונות דוקר עם Spring Boot היא שימוש בקובץ Docker. להלן דוגמה פשוטה:

FRA openjdk: 8-jdk-alpine EXPOSE 8080 ARG JAR_FILE = target / demo-app-1.0.0.jar הוסף $ {JAR_FILE} app.jar ENTRYPOINT ["java", "- jar", "/ app.jar"]

ואז נוכל להשתמש ב- לבנות דוקר פקודה ליצור תמונת Docker. זה עובד בסדר עבור רוב היישומים, אבל יש כמה חסרונות.

ראשית, אנו משתמשים בצנצנת השומן שיצר Spring Boot. זה יכול להשפיע על זמן ההפעלה, במיוחד בסביבה המיכלת. אנו יכולים לחסוך זמן אתחול על ידי הוספת התוכן המפוצץ של קובץ הצנצנת במקום.

שנית, תמונות Docker בנויות בשכבות. אופי צנצנות השומן של Spring Boot גורם לכל קוד היישומים וספריות הצד השלישי להיות בשכבה אחת. המשמעות היא שגם כאשר רק שורת קוד אחת משתנה, יש לבנות מחדש את כל השכבה.

על ידי התפוצצות הצנצנת לפני הבנייה, קוד היישום וספריות צד שלישי מקבלים שכבה משלהם. זה מאפשר לנו לנצל את מנגנון המטמון של דוקר. כעת, כאשר שורת קוד אחת משתנה, יש לבנות מחדש את אותה שכבה מתאימה בלבד.

עם זאת בחשבון, בואו נסתכל כיצד Spring Boot שיפר את תהליך יצירת תמונות ה- Docker.

3. Buildpacks

Buildpacks הם כלי המספק תלות מסגרת ויישומים.

לדוגמא, בהינתן צנצנת שומן של Spring Boot, buildpack יספק לנו את זמן הריצה של Java. זה מאפשר לנו לדלג על קובץ ה- Docker ולקבל תמונת Docker הגיונית באופן אוטומטי.

Spring Boot כולל תמיכה ב- Maven וגם ב- Gradle עבור חבילות בניין. לדוגמה, אם נבנה עם Maven, נפעיל את הפקודה:

./mvnw אביב-אתחול: build-image

בואו נסתכל על כמה מהפלטים הרלוונטיים כדי לראות מה קורה:

[INFO] בניית צנצנת: target / demo-0.0.1-SNAPSHOT.jar ... [INFO] בניית תמונה 'docker.io/library/demo:0.0.1-SNAPSHOT' ... [INFO]> משיכת תמונת בונה 'gcr.io/paketo-buildpacks/builder:base-platform-api-0.3' 100% ... [INFO] [creator] ===> זיהוי [INFO] [creator] 5 מתוך 15 buildpacks המשתתפים [INFO] [ יוצר] paketo-buildpacks / bellsoft-liberica 2.8.1 [INFO] [creator] paketo-buildpacks / executable-jar 1.2.8 [INFO] [creator] paketo-buildpacks / apache-tomcat 1.3.1 [INFO] [creator] paketo-buildpacks / dist-zip 1.3.6 [INFO] [creator] paketo-buildpacks / spring-boot 1.9.1 ... [INFO] תמונה שנבנתה בהצלחה 'docker.io/library/demo:0.0.1-SNAPSHOT' [INFO] זמן כולל: 44.796 שניות

השורה הראשונה מראה שבנו את צנצנת השומן הסטנדרטית שלנו, בדיוק כמו כל חבילת maven טיפוסית.

השורה הבאה מתחילה את בניית התמונות של דוקר. מיד לאחר מכן אנו רואים את בניית המשימות בבונה Packeto.

Packeto הוא יישום של buildpacks ילידי ענן. הוא מבצע את עבודת ניתוח הפרויקט שלנו וקביעת המסגרות והספריות הנדרשות. במקרה שלנו, זה קובע שיש לנו פרויקט Spring Boot ומוסיף את ה- buildpacks הנדרשים.

לבסוף, אנו רואים את תמונת ה- Docker שנוצרה ואת זמן הבנייה הכולל. שימו לב איך בפעם הראשונה שאנחנו בונים, אנחנו משקיעים זמן לא מבוטל בהורדת חבילות בנייה ויצירת שכבות שונות.

אחת התכונות הגדולות של buildpacks היא שתמונת ה- Docker היא מספר שכבות. אז אם רק נשנה את קוד היישום שלנו, הבניינים הבאים יהיו מהירים בהרבה:

... [INFO] [יוצר] שימוש חוזר בשכבה 'paketo-buildpacks / executable-jar: class-path' [INFO] [creator] שימוש חוזר בשכבה 'paketo-buildpacks / spring-boot: web-application-type' ... [INFO] התמונה שנבנתה בהצלחה 'docker.io/library/demo:0.0.1-SNAPSHOT' ... [INFO] זמן כולל: 10.591 שניות

4. צנצנות שכבות

במקרים מסוימים, אנו עשויים להעדיף לא להשתמש ב- buildpacks - אולי התשתית שלנו כבר קשורה לכלי אחר, או שכבר יש לנו Dockerfiles מותאמים אישית שאנו רוצים להשתמש בהם מחדש.

מסיבות אלה, Spring Boot תומך גם בבניית תמונות Docker באמצעות צנצנות שכבות. כדי להבין כיצד זה עובד, בואו נסתכל על פריסת צנצנת שומן של Spring Boot:

org / springframework / boot / loader / ... BOOT-INF / שיעורים / ... lib / ...

צנצנת השומן מורכבת משלושה אזורים עיקריים:

  • דרושים שיעורי Bootstrap להפעלת יישום Spring
  • קוד יישום
  • ספריות צד ג '

עם צנצנות שכבות, המבנה נראה דומה, אבל אנחנו מקבלים חדש שכבות.ידקס קובץ הממפה כל ספריה בצנצנת השומן לשכבה:

- "תלות": - "BOOT-INF / lib /" - "spring-boot-loader": - "org /" - "תלות תמונת מצב": - "יישום": - "BOOT-INF / מחלקות /" - "BOOT-INF / classpath.idx" - "BOOT-INF / layer.idx" - "META-INF /"

מחוץ לקופסה, Spring Spring מספק ארבע שכבות:

  • תלות: תלות טיפוסית מצדדים שלישיים
  • תלות בתמונות: תלות בתמונה של צדדים שלישיים
  • אֶמְצָעִי: משאבים סטטיים
  • יישום: קוד יישום ומשאבים

המטרה היא למקם קוד יישומים וספריות צד שלישי לשכבות המשקפות את התדירות שבה הן משתנות.

לדוגמא, קוד יישום הוא ככל הנראה המשתנה בתדירות הגבוהה ביותר, כך שהוא מקבל שכבה משלו. יתר על כן, כל שכבה יכולה להתפתח בפני עצמה, ורק כששכבה תשתנה היא תיבנה מחדש לתמונת ה- Docker.

עכשיו, לאחר שהבנו את מבנה הצנצנת החדש בשכבות, בואו נסתכל כיצד נוכל להשתמש בו ליצירת תמונות Docker.

4.1. יצירת צנצנות בשכבות

ראשית, עלינו להגדיר את הפרויקט שלנו ליצירת צנצנת שכבתית. עם Maven, המשמעות היא הוספת תצורה חדשה לחלק התוסף Spring Boot של ה- POM שלנו:

 org.springframework.boot spring-boot-maven-plugin נכון 

עם תצורה זו, Maven חֲבִילָה הפקודה (יחד עם כל אחת מהפקודות התלויות שלה) תיצור צנצנת שכבתית חדשה באמצעות ארבע שכבות ברירת המחדל שהוזכרו קודם לכן.

4.2. צפייה וחילוץ שכבות

לאחר מכן, עלינו לחלץ את השכבות מהצנצנת, כך שלתמונת ה- Docker יהיו השכבות המתאימות.

כדי לבחון את השכבות של כל צנצנת שכבתית, נוכל להפעיל את הפקודה:

java -Djarmode = layertools -jar demo-0.0.1.jar רשימה

ואז כדי לחלץ אותם, היינו רצים:

תמצית java -Djarmode = layertools -jar demo-0.0.1.jar

4.3. יצירת תמונת ה- Docker

הדרך הקלה ביותר לשלב שכבות אלה בתמונת Docker היא באמצעות קובץ Docker:

FROM adoptopenjdk: 11-jre-hotspot כמו בונה ARG JAR_FILE = target / *. Jar COPY $ {JAR_FILE} application.jar RUN java -Djarmode = layertools -jar application.jar extract FROM adoptopenjdk: 11-jre-hotspot COPY = תלות בונה / ./ COPY --from = תלות תמונת מצב של בונה / ./ COPY --from = builder-boot-loader / ./ COPY --from = יישום בונה / ./ ENTRYPOINT ["java", "org .springframework.boot.loader.JarLauncher "]

קובץ Docker זה מחלץ את השכבות מצנצנת השומן שלנו, ואז מעתיק כל שכבה לתמונת ה- Docker. כל אחד עותק ההנחיה מביאה לשכבה חדשה בתמונת ה- Docker הסופית.

אם אנו בונים קובץ Docker זה, אנו יכולים לראות כל שכבה מהצנצנת השכבתית מתווספת לתמונת ה- Docker כשכבה משלה:

... שלב 6/10: העתק - מ = תלות בונה / ./ ---> 2c631b8f9993 שלב 7/10: העתק - מ = תלות תמונת מצב של בונה / ./ ---> 26e8ceb86b7d שלב 8/10: COPY --from = builder spring-boot-loader / ./ ---> 6dd9eaddad7f שלב 9/10: העתק --from = יישום הבונה / ./ ---> dc80cc00a655 ...

5. מסקנה

במדריך זה ראינו דרכים שונות לבניית תמונות Docker בעזרת Spring Boot. באמצעות buildpacks, אנו יכולים לקבל תמונות Docker מתאימות ללא boilerplate או תצורות מותאמות אישית. לחלופין, עם קצת יותר מאמץ, נוכל להשתמש בצנצנות מרובדות כדי לקבל תמונת Docker מותאמת יותר.

את כל הדוגמאות במדריך זה ניתן למצוא באתר GitHub.

למידע נוסף על השימוש ב- Java ו- Docker, עיין במדריך בנושא jib.