הפיכת יישום Java לגורמים מכילים
ביחידה זו, עליך ליצור גורם מכיל של יישום Java.
כפי שצוין קודם לכן, גורמים מכילים פועלים ישירות מעל מערכת ההפעלה המארחת, ליבה וחומרה כתהליכי מערכת רגילים. גורמים מכילים דורשים פחות משאבי מערכת, והתוצאה היא טביעת רגל קטנה יותר, פחות תוקף ושעות אתחול מהירות יותר של אפליקציות. יתרונות אלה הם מקרי שימוש נהדרים לקנה מידה לפי דרישה.
קיימים גורמים מכילים של Windows וגורמים מכילים של Linux. במודול זה, אתה משתמש בזמן ריצה נרחב של Docker לבניית תמונה של גורם מכיל של Linux. לאחר מכן עליך לפרוס את תמונת הגורם המכיל של Linux במערכת ההפעלה המארחת של המחשב המקומי שלך. לבסוף, עליך לפרוס את תמונת הגורם המכיל של Linux בשירות Azure Kubernetes.
מבט כולל על Docker
זמן הריצה של Docker משמש לבניית תמונות, משיכה, הפעלה וגורמים מכילים של דחיפה, כפי שמוצג בדיאגרמה הבאה:
הטבלה הבאה מתארת כל פקודה של Docker:
| הפקודה Docker | תיאור |
|---|---|
docker build |
בונה תמונת גורם מכיל המכילה את ההוראות או השכבות הדרושות ל- Docker כדי ליצור גורם מכיל פועל מתמונה. התוצאה של פקודה זו היא תמונה. |
docker pull |
גורמים מכילים מאותחלים מתמונות, אשר לקוחות מרכלים כגון Azure Container Registry. רישום זה הוא המקום שבו Azure Kubernetes Service מושך. התוצאה של פקודה זו היא משיכה ברשת של תמונה, המתרחשת ב- Azure. אם תרצה, תוכל למשוך תמונות באופן מקומי. אפשרות זו נפוצה בעת בניית תמונות הדורשות יחסי תלות או שכבות שייתכן שהיישום שלך זקוק להם, כגון שרת יישומים. |
docker run |
מופע פועל של תמונה הוא גורם מכיל, ופקודה זו מפעילה את כל השכבות הדרושות להפעלה ואינטראקציה עם יישום הגורם המכיל הפועל. התוצאה של פקודה זו היא תהליך יישום פועל במערכת ההפעלה המארחת. |
docker push |
Azure Container Registry מאחסן את התמונות כך שהן יהיו זמינות וסגורות ברשת עבור פריסות וקנה מידה של Azure. |
שכפול יישום Java
תחילה, שכפל את מערכת הזמנת הטיסה עבור מאגר הזמנות טיסה ונווט אל תיקיית הפרוייקט של יישום האינטרנט של Airlines.
הערה
אם יצירת שירות Azure Kubernetes הסתיימה בכרטיסיה CLI, השתמש בכרטיסיה זו. אם היא עדיין פועלת, פתח כרטיסיה חדשה ונווט אל המיקום שבו אתה מעדיף לשכפל את מערכת הזמנת הטיסה עבור הזמנות טיסה.
הפעל את הפקודות הבאות:
git clone https://github.com/Azure-Samples/containerize-and-deploy-Java-app-to-Azure.git
cd containerize-and-deploy-Java-app-to-Azure/Project/Airlines
באופן אופציונלי, אם מותקן במחשב Java ו- Maven, באפשרותך להפעיל את הפקודה הבאה במסוף המסוף שלך כדי לקבל תחושה של החוויה של בניית היישום ללא Docker. אם Java ו- Maven אינם מותקנים במחשב שלך, תוכל להמשיך בבטחה למקטע הבא, לבנות קובץ Docker. במקטע זה, תשתמש ב- Docker כדי לפתוח את Java ואת Maven כדי לבצע את גירסאות ה- Build בשמך.
mvn clean package
הערה
השתמשנו בפקודה mvn clean package כדי להמחיש את האתגרים התפעוליים של לא להשתמש ב-Docker multistage builds, אשר אנו מכסים בשלב הבא. שוב, שלב זה הוא אופציונלי. בכל מקרה, תוכל להמשיך בבטחה מבלי לבצע את הפקודה של Maven.
אם התהליך הצליח, Maven בנה בהצלחה את מערכת הזמנת הטיסה עבור ארכיון יישום האינטרנט של הזמנות טיסה פריט AirlinesReservationSample-0.0.1-SNAPSHOT.war, כפי שמוצג בפלט הבא:
[INFO] Building war: $PROJECT_PATH/containerize-and-deploy-Java-app-to-Azure/Project/Airlines/target/AirlinesReservationSample-0.0.1-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.776 s
[INFO] Finished at: 2024-11-15T09:33:26+09:00
[INFO] ------------------------------------------------------------------------
דמיין שאתה מפתח Java ו שזה עתה בנית את AirlinesReservationSample-0.0.1-SNAPSHOT.war. השלב הבא הוא ככל הנראה לעבוד עם מהנדסי הפעולה כדי לפרוס ממצא זה בשרת מקומי או במחשב וירטואלי. כדי שהיישום יופעל ויפעל בהצלחה, השרתים והמחשבים הווירטואליים חייבים להיות זמינים ומוגדרים עם יחסי התלות הנדרשים. תהליך זה הוא מאתגר ולצרוך זמן רב, במיוחד לפי דרישה כאשר עומס מוגבר פוגע ביישום שלך. עם גורמים מכילים, האתגרים הללו פוחתים.
בניית Dockerfile
כעת אתה מוכן לבנות Dockerfile. Dockerfile הוא מסמך טקסט המכיל את כל הפקודות שמשתמש יבצע בשורת הפקודה כדי להרכיב תמונת גורם מכיל. כל תמונה היא שכבה שניתן אחסון במטמון ליעילות. השכבות נבנות זו על זו.
לדוגמה, Flight Booking System for Airline Reservations צריך לפרוס ולהפעיל אותו בתוך שרת יישום. שרת יישומים אינו ארוז בתוך AirlinesReservationSample-0.0.1-SNAPSHOT.war. זו תלות חיצונית הדרושה ל- AirlinesReservationSample-0.0.1-SNAPSHOT.war כדי להפעיל, להאזין לבקשות HTTP ולעבד ןן, לנהל הפעלות משתמשים ולסייע להזמין טיסות. אם השתמשת בפריסה מסורתית שאינה מכילה גורמים מכילים, מהנדסי פעולה התקינו וקביעת התצורה של שרת יישומים בשרת פיזי או במחשב וירטואלי מסוימים לפני פריסת AirlinesReservationSample-0.0.1-SNAPSHOT.war עבורה. מהנדסי פעולה אלה יצטרכו גם לוודא ש- JDK נמצא בשימוש במחשב שלך - mvn clean package שהוא מה ששימש להידור קובץ WAR - תואם למעשה לאותו JRE המשמש את שרת היישומים. ניהול יחסי תלות אלה הוא מאתגר ולצרוך זמן.
באמצעות Dockerfile, באפשרותך לכתוב את ההוראות או השכבות הדרושות לביצוע יעד זה באופן אוטומטי, על-ידי יצירת שכבות בשלבים הדרושים כדי להבטיח שמערכת הזמנת הטיסה עבור הזמנת טיסה כוללת את כל יחסי התלות הדרושים כדי לפרוס בזמן הריצה של הגורם המכיל של Docker. פתרון זה משכנע כאשר אתה עובד עם קנה מידה לפי דרישה במרווחי זמן לא מתוכננים. כל שכבה משתמשת במטמון Docker, המכיל את המצב של תמונת הגורם המכיל בכל אבן דרך לימודית, מיטוב זמן החישוב ושימוש חוזר. אם שכבה אינה משתנה, נעשה שימוש בשכבות המאוחסנות במטמון. מקרי שימוש נפוצים עבור שכבות המאוחסנות במטמון הם זמן הריצה של Java, שרת היישומים ו יחסי תלות אחרים עבור יישום האינטרנט Flight Booking System for Airline Reservations. אם ומתי גירסה משתנה בשכבה שאוחסנה בעבר במטמון, נוצר ערך מאוחסן במטמון חדש.
הדיאגרמה הבאה מתארת את השכבות של תמונת גורם מכיל. כאשר הפקודות ב- Dockerfile מבוצעות, נוצרות השכבות. השכבה העליונה היא מערכת הזמנת הטיסה לקריאה/כתיבה עבור שכבת יישום האינטרנט של הזמנות חברות תעופה. שכבה זו בנויה על גבי השכבות הקודמות לקריאה בלבד.
ל- Docker יש את הרעיון של גירסאות Build מרובות-Stage, תכונה המאפשרת לך ליצור תמונת גורם מכיל קטנה יותר עם אחסון במטמון טוב יותר ו טביעת רגל קטנה יותר של אבטחה, המאפשרת מיטוב משופר ותחזוקה של Dockerfile לאורך זמן. לדוגמה, באפשרותך להפריד את שלב ה- Build של הגורם המכיל לצורך הידור ובנייה של היישום מהשלב להפעלת היישום. תכונה זו מאפשרת לך להעתיק רק את הממצאים שנוצרו במהלך גירסת ה- Build לתמונה של הגורם המכיל של הייצור, דבר שמצמצם את טביעת הרגל. מכיוון שתמונות של גורמים מכילים מאוחסנות במטמון, אם אין שינויים, ניתן לעשות שימוש חוזר בתמונות המאוחסנות במטמון, תוך צמצום העלות והשעה של ההורדה מהרשת.
שירותים החשופים בסביבת הייצור חייבים להיות מנוהלים בקפידה לאבטחה. לכן, סביבת הייצור משתמשת בתמונת גורם מכיל מאובטחת ומשתמשת בה. הדוגמה משתמשת בתמונה CBL-Mariner שסופקה על-ידי Microsoft.
CBL-Mariner Linux היא מערכת הפעלה קלה, המכילה רק את החבילות הדרושות עבור סביבת ענן. באפשרותך להתאים אותו אישית באמצעות חבילות וכלים מותאמים אישית בהתאם לדרישות היישום שלך. CBL-Mariner עובר בדיקות אימות של Azure ותואמים לנציגי Azure. Microsoft בונה ומבחנים CBL-Mariner כדי להפעיל מקרי שימוש שונים, החל משירותי Azure וכלה בתשתית IoT. זו הפצת Linux המומלצת באופן פנימי לשימוש עם שירותי הענן של Microsoft ומוצרים קשורים.
הערה
Microsoft מספקת תמונות של גורמים מכילים בחבילה עם OpenJDK, כולל Ubuntu, CBL-Mariner, ותמונות distroless . התמונה distroless כוללת את גודל התמונה הקטן ביותר, אך הפעלת Tomcat עליו היא מאתגרת. כדי להשיג עיצוב קל משקל, distroless התמונה מסירה פקודות וכלים רבים, כולל המעטפת, כך שלא ניתן לקרוא ל- catalina.sh להפעיל את Tomcat. התמונה distroless מתאימה להפעלת JARs הניתנים להפעלה, כגון אלה שנמצאים בשימוש עם Spring Boot או Quarkus.
בדוגמה הבאה, אותה גירסה של Microsoft Build של OpenJDK משמשת הן בשלב גירסת ה- Build והן בשלב הסופי. גישה זו מבטיחה לבנות את קוד המקור עם אותה גירסה של JDK שבה משתמשת Tomcat פריסת השירות, דבר שמסייע במניעת אופן פעולה בלתי צפוי עקב אי-התאמה של גירסאות.
התמונה הבאה מתארת את גירסת ה- Build של Multistage ואת מה שמתרחש בכל שלב בהתבסס על הפקודות שצוינו ב- Dockerfile:
בשלב 0, Tomcat יורד ו מחולץ אל ספריה שצוינה על-ידי משתנה סביבה בתמונה של Ubuntu. המשתנה TOMCAT_VERSION מציין את הגירסה של Tomcat להורדה. אם מופצת גירסה חדשה של Tomcat, עליך לעדכן את מספר הגירסה, מכיוון שתמונה חדשה מובאת רק כאשר מספר הגירסה משתנה. אחרת, נעשה שימוש בתמונה המאוחסנת במטמון. ה-Tomcat שהורדת מועתק לסביבת השלב הסופי לשימוש.
בשלב 1, Maven מותקן בתמונה של Ubuntu, וקבצי קוד המקור והתצורה שנוצרו מועתקים לפני בניית פרוייקט Maven. כל שכבה מאוחסנת במטמון, כך ששכבות התמונה של מערכת ההפעלה ו- Maven משתמשות מחדש במטמון. אם קבצי תצורה, קבצי קוד מקור או ספריית האינטרנט מתעדכנים, השכבות מהשינויים והלאה ייווכנו מחדש. אם גירסת ה- Build מסתיימת בהצלחה ללא שגיאות במהלך ההידור, חפץ בשם AirlinesReservationSample-0.0.1-SNAPSHOT.war נוצר תחת מדריך הכתובות של היעד . ממצא זה מועתק לסביבת השלבים הסופית לשימוש.
בשלב הסופי, CBL-Mariner התמונה המאובטחת שסופקה על-ידי Microsoft משמשת להעתקת ממצאי ה- Build של Tomcat ו- Java משלב 0 ושלב 1, בהתאמה. משתמש בשם הוא app הבעלים של כל הקבצים שנמצאים בשימוש בפרוייקט, app והיישום פועל גם כמשתמש במקום כבעל root הרשאות. הגדרה זו מבטיחה שניתן יהיה להפעיל את תמונת הגורם המכיל באופן מאובטח מבלי להעניק הרשאות מיותרות. לבסוף, מספר יציאה 8080 נחשף, וקובץ ה catalina.sh Script של היציאה מופעל כדי להפעיל את Tomcat. כאשר פעולה זו מופעלת בשולחן העבודה המקומי של Docker, באפשרותך לגשת אליו באמצעות כתובת ה- URL http://localhost:8080/AirlinesReservationSample.
בתוך תיקיית הבסיס של הפרוייקט שלך, containerize-and-deploy-Java-app-to-Azure/Project/Airlines, השתמש בפקודה הבאה כדי ליצור קובץ בשם Dockerfile:
vi Dockerfile
הוסף את התוכן הבא ל- Dockerfile ולאחר מכן שמור ויציאה. כדי לשמור ולצאת, הקש ESC, הקלד :wq!, ולאחר מכן הקש Enter.
############################################
# Tomcat Intall stage
############################################
FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS tomcat
ENV CATALINA_HOME=/usr/local/tomcat
# Configure Tomcat Version (Be sure to use the latest version)
ENV TOMCAT_VERSION=10.1.33
# Install Tomcat and required packages
RUN apt-get update ; \
apt-get install -y curl ; \
curl -O https://downloads.apache.org/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz ; \
tar xzf apache-tomcat-${TOMCAT_VERSION}.tar.gz ; \
mv apache-tomcat-${TOMCAT_VERSION} ${CATALINA_HOME} ; \
rm apache-tomcat-${TOMCAT_VERSION}.tar.gz && \
apt-get remove --purge -y curl && \
apt-get autoremove -y && \
apt-get clean
############################################
# Build stage (Compiles with Java 17)
############################################
FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS build
WORKDIR /build
# Install Maven
RUN apt-get update && apt-get install -y maven && mvn --version
# Copy source code
COPY pom.xml .
COPY src ./src
COPY web ./web
# Build the project
RUN mvn clean package
############################################
# Package final stage
############################################
FROM mcr.microsoft.com/openjdk/jdk:17-mariner
# Configure the location of the Tomcat installation
ENV CATALINA_HOME=/usr/local/tomcat
# Configure the path to the Tomcat binaries
ENV PATH=$CATALINA_HOME/bin:$PATH
# This is the user that runs the Tomcat process
USER app
# Copy the Tomcat installation from the Tomcat stage
COPY --chown=app:app --from=tomcat ${CATALINA_HOME} ${CATALINA_HOME}
# Copy the Tomcat configuration files
COPY --chown=app:app tomcat-users.xml ${CATALINA_HOME}/conf
# Copy the compiled WAR file from the build stage
COPY --chown=app:app --from=build /build/target/*.war ${CATALINA_HOME}/webapps/AirlinesReservationSample.war
# Expose the default Tomcat port
EXPOSE 8080
# Start Tomcat
CMD ["catalina.sh", "run"]
הערה
באופן אופציונלי, באפשרותך להשתמש בקובץ Dockerfile_Solution הבסיס של הפרוייקט, המכיל את התוכן הדרוש לך.
Dockerfile מחולק לשלושה שלבים, המתוארים בטבלאות הבאות:
שלב ההתקנה של Tomcat:
הפקודה Docker תיאור FROMFROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS tomcatמגדיר את תמונת הבסיס ל- Microsoft Build של OpenJDK 17 באובונטו, ושמות השלב הזהtomcat. כאן יותקן Tomcat.ENVENV CATALINA_HOME=/usr/local/tomcatמגדיר משתנה סביבה עבור ספריית ההתקנה של Tomcat.ENVENV TOMCAT_VERSION=10.1.33מגדיר את הגירסה של Tomcat להתקנה. יש לעדכן זאת לגירסה העדכנית ביותר לפי הצורך.RUNהפקודה RUNמעדעדכן את רשימת החבילות,curlמתקינים , מורידה את הגירסה שצוינה של Tomcat, מחלצית אותה, מעבירה אותה למדריך הכתובות שצוין ו מנקה קבצים וחבילות מיותרים. פעולה זו מבטיחה שהתמונה תישאר קלילה.שלב ה- Build, אשר מבצע הידור עם Java 17:
הפקודה Docker תיאור FROMFROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS buildמגדיר את תמונת הבסיס ל- Microsoft Build של OpenJDK 17 באובונטו, ושמות השלב הזהbuild. שלב זה משמש להידור יישום Java.WORKDIRWORKDIR /buildמגדיר את ספריית העבודה בתוך הגורם המכיל ל/build- , כאשר קוד המקור מועתק ומהידור.RUNRUN apt-get update && apt-get install -y maven && mvn --versionמתקין את Maven, כלי אוטומציה של גירסת Build המשמש עבור פרוייקטים של Java, ומ מאמת את ההתקנה שלו.COPYCOPY pom.xml .מעתיק את קובץ התצורה של Maven אל ספריית העבודה. קובץ זה חיוני לבניית הפרוייקט.COPYCOPY src ./srcמעתיק את ספריית קוד המקור אל הגורם המכיל. זהו המקום שבו שצוין קוד היישום Java.COPYCOPY web ./webמעתיק את ספריית משאבי האינטרנט אל הגורם המכיל. הדבר כולל משאבי יישום אינטרנט הדרושים עבור גירסת ה- Build.RUNRUN mvn clean packageמבצע את תהליך גירסת ה- Build של Maven, אשר מבצע קומפילציה של יישום Java ומחבילה אותו לקובץ WAR.השלב הסופי של החבילה:
הפקודה Docker תיאור FROMFROM mcr.microsoft.com/openjdk/jdk:17-marinerמגדיר את תמונת הבסיס ל- Microsoft Build של OpenJDK 17CBL-Marinerב- , המשמשת לפריסה הסופית של היישום.ENVENV CATALINA_HOME=/usr/local/tomcatמגדיר את משתנה הסביבה עבור ספריית ההתקנה של Tomcat, בדומה לשלב ההתקנה.ENVENV PATH=$CATALINA_HOME/bin:$PATHמוסיף את הספריה Tomcat bin למערכתPATH, ומאפשר לפקודות Tomcat לפעול בקלות.USERUSER appמציין את המשתמש שתחתיו פועל התהליך Tomcat, תוך שיפור האבטחה על-ידי כך שהוא אינו פועל כמשתמש הבסיס.COPYCOPY --chown=app:app --from=tomcat ${CATALINA_HOME} ${CATALINA_HOME}מעתיקה את התקנת Tomcattomcatמהשלב, מגדירה את הבעלות למשתמשapp.COPYCOPY --chown=app:app tomcat-users.xml ${CATALINA_HOME}/confמעתיק את קובץ קביעת התצורה של המשתמש Tomcat לתוך הגורם המכיל, תוך הגדרת הבעלות למשתמשapp.COPYCOPY --chown=app:app --from=build /build/target/*.war ${CATALINA_HOME}/webapps/AirlinesReservationSample.warמעתיק את קובץ WAR מהשלבbuildאל ספריית ה- WebApps של Tomcat, תוך הגדרת הבעלות למשתמשapp.EXPOSEEXPOSE 8080חושף את יציאה 8080, יציאת ברירת המחדל עבור Tomcat, ומאפשרת גישה חיצונית ליישום.CMDCMD ["catalina.sh", "run"]מציין את הפקודה להפעלת Tomcat בעת הפעלת הגורם המכיל.
לקבלת מידע נוסף על בניית Dockerfile, עיין בהפניה ל- Dockerfile.