1. סקירה כללית
Docker היא פלטפורמה פתוחה לפיתוח, משלוח והפעלה של אפליקציות. באמצעות Docker תוכלו להפריד בין האפליקציות שלכם לתשתית ולהתייחס לתשתית שלכם כמו לאפליקציה מנוהלת. Docker עוזר לשלוח קוד מהר יותר, לבדוק מהר יותר, לפרוס מהר יותר ולקצר את מחזור כתיבת הקוד להרצת הקוד.
כדי לעשות זאת ב-Docker, משלבים תכונות של קונטיינרים של ליבה עם תהליכי עבודה וכלים שעוזרים לנהל ולפרוס את האפליקציות.
אפשר להשתמש בקונטיינרים של Docker ישירות ב-Kubernetes, וכך להריץ אותם ב-Kubernetes Engine בקלות. אחרי שתלמדו את העקרונות הבסיסיים של Docker, תהיה לכם כישרון להתחיל לפתח אפליקציות בקונטיינרים ו-Kubernetes.
מה תלמדו
בשיעור Lab זה תלמדו איך:
- יצירת קובץ Docker לאפליקציה לדוגמה
- יצירת תמונה
- הפעלת קובץ האימג' כקונטיינר באופן מקומי
- שינוי ההתנהגות של מאגרי תגים
- דחיפת התמונה ל-Artifact Registry
דרישות מוקדמות
זהו שיעור Lab ברמת מבוא. ההנחה היא שאין ניסיון קודם ב-Docker ובקונטיינרים, אם בכלל. מומלץ להכיר את Cloud Shell ואת שורת הפקודה, אבל לא חובה.
הגדרת סביבה בקצב אישי
- נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.
- Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא נעשה בה שימוש ב-Google APIs, ואפשר לעדכן אותה בכל שלב.
- Project ID חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (ובדרך כלל הוא מזוהה כ-
PROJECT_ID
), כך שאם הוא לא מוצא חן בעיניכם, תוכלו ליצור פרויקט אקראי אחר או לנסות בעצמכם ולבדוק אם הוא זמין. ואז המכשיר 'קפוא' לאחר יצירת הפרויקט. - יש ערך שלישי, Project Number, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
- בשלב הבא צריך להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבים או בממשקי API של Cloud. מעבר ב-Codelab הזה לא אמור לעלות הרבה, אם בכלל. כדי להשבית את המשאבים ולא לצבור חיובים מעבר למדריך הזה, פועלים לפי ההנחיות למחיקת המשאבים. בסוף ה-Codelab. משתמשים חדשים ב-Google Cloud זכאים להצטרף לתוכנית תקופת ניסיון בחינם בשווי 1,200 ש"ח.
2. אפליקציה לדוגמה
ניתנה אפליקציה לדוגמה כדי להקל על שיעור ה-Lab הזה. בקטע הזה נאחזר את קוד המקור ותבנה את האפליקציה בצורתו המקורית לפני שתמשיכו לתהליך יצירת הקונטיינרים.
קוד מקור
קוד המקור של שיעור ה-Lab הזה זמין במאגר GoogleCloudPlatform/container-developer-workshop, יחד עם מסמכי תיעוד של אפליקציות לדוגמה.
הגדרת Git
git config --global user.name ${USER}
git config --global user.email ${USER}@qwiklabs.net
שכפול האפליקציה לדוגמה Cloud Source Repository
gcloud source repos clone sample-app ${HOME}/sample-app &&
cd ${HOME}/sample-app &&
git checkout main
פלט
Cloning into '/home/student_03_49720296e995/sample-app'... remote: Finding sources: 100% (16/16) remote: Total 16 (delta 0), reused 16 (delta 0) Receiving objects: 100% (16/16), 47.23 KiB | 681.00 KiB/s, done. warning: remote HEAD refers to nonexistent ref, unable to checkout. Project [qwiklabs-gcp-02-4327c4e03d82] repository [sample-app] was cloned to [/home/student_03_49720296e995/sample-app]. Branch 'main' set up to track remote branch 'main' from 'origin'. Switched to a new branch 'main'
פיתוח גרסת build של האפליקציה לדוגמה
cd ${HOME}/sample-app
./mvnw compile
פלט
[INFO] Scanning for projects... ... [INFO] Compiling 1 source file to /home/student_03_49720296e995/sample-app/target/classes [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 10.080 s [INFO] Finished at: 2022-02-23T17:14:30Z [INFO] ------------------------------------------------------------------------
הרצת האפליקציה לדוגמה
cd ${HOME}/sample-app
./mvnw exec:java
פלט
[INFO] Scanning for projects... ... Listening at http://localhost:8080
תצוגה מקדימה של האפליקציה שפועלת
- לוחצים על הלחצן של Cloud Shell Web Preview.
- לוחצים על 'תצוגה מקדימה' ביציאה 8080
בסיום
- כדי להפסיק את ההפעלה של האפליקציה, מקישים על CTRL + c ב-Cloud Shell
3. קובץ Docker
יצירת קונטיינרים של האפליקציה באמצעות קובץ Docker
אחת מהשיטות לארוז אפליקציה בקונטיינר היא באמצעות קובץ Docker. קובץ ה-Docker דומה לסקריפט שמלמד את הדימון (daemon) כיצד להרכיב את קובץ האימג' בקונטיינר. מידע נוסף זמין במאמרי העזרה של Dockerfile.
יוצרים קובץ Docker ריק במאגר האפליקציות לדוגמה.
touch ${HOME}/sample-app/Dockerfile
פותחים את קובץ Docker בעורך הרצוי.
vi ${HOME}/sample-app/Dockerfile
בחירת תמונה התחלתית
השימוש ב-method של Dockerfile לפיתוח קונטיינר דורש ידע ישיר על האפליקציה כדי להרכיב את הקונטיינר. השלב הראשון ליצירת קובץ Docker הוא בחירת תמונה שתשמש כבסיס לתמונה.תמונה זו צריכה להיות תמונת הורה או תמונה בסיסית שמתוחזקת ומפורסמת על ידי מקור מהימן, בדרך כלל החברה שלכם.
ההוראה FROM
מפעילה שלב build חדש ומגדירה את קובץ האימג' הבסיסי לפקודות הבאות ברצף. לכן, ההוראה FROM
היא בדרך כלל ההוראה הראשונה בקובץ Docker, ולפניה יכולה להופיע רק הוראת ARG אופציונלית שתומכת במשתנים.
תחביר: FROM <image>[:<tag> | @<digest>] [AS <name>]
הפורמט של תמונה הוא <image>:<tag>
או <image>@<digest>
. אם לא מציינים תג או תקציר, ברירת המחדל היא התג :latest
. הפורמט של <image>
משתנה בהתאם למרשם שמשמש לאחסון התמונה. ל-Artifact Registry, הפורמט <image>
הוא <region>-docker.pkg.dev/<project ID>/<repository name>/<image name>:<image tag>
.
בשיעור ה-Lab הזה נשתמש בתמונה הציבורית openjdk:11.0-jdk
, צריך להוסיף את השורה הבאה לקובץ ה-Docker
FROM openjdk:11.0-jdk
הגדרה של ספריית העבודה
ההוראה WORKDIR
מגדירה את ספריית העבודה לכל הוראות הרצף הבאות בקובץ Docker. מידע נוסף מופיע בקטע WORKDIR במשאבי העזרה של קובץ Docker
תחביר: WORKDIR <path>
בשיעור ה-Lab הזה נשתמש בספרייה /app
בתור WORKDIR
, מוסיפים את השורה הבאה לתחתית קובץ ה-Docker.
WORKDIR /app
העתקת קובצי האפליקציה
ההוראה COPY
מעתיקה ספריות או קבצים מהמיקום <source>
לנתיב <destination>
של מערכת הקבצים של התמונות. אפשר לציין כמה משאבים של <source>
, וכולם יחסיים להקשר של ה-build. הסבר נוסף על ההקשר של גרסת ה-build יופיע בקטע Build. מידע נוסף מופיע בקטע העתקה של מאמרי העזרה של Dockerfile
תחביר: COPY <source>... <destination>
בשיעור ה-Lab הזה נעתיק את כל הקבצים שבמאגר למערכת הקבצים של התמונות, נוסיף את השורה הבאה לתחתית של קובץ Docker.
COPY . /app
הידור האפליקציה
ההוראה RUN
מפעילה פקודות בשכבת תמונה חדשה מעל התמונה הנוכחית, ומחילה את התוצאות. התמונה המתחייבת שתתקבל תשמש לשלבים עוקבים בקובץ Docker. מידע נוסף מופיע בקטע RUN במסמכי העזרה של קובץ Docker
תחביר: RUN <command>
בשיעור ה-Lab הזה נשתמש ב-Maven כדי להדר את האפליקציה לקובץ JAR, מוסיפים את השורה הבאה לתחתית של קובץ Docker
RUN ./mvnw compile assembly:single
הפעלת האפליקציה
ההוראה CMD
מספקת את פקודת ברירת המחדל לקונטיינר פעיל. בקובץ Docker יכולה להיות רק הוראת CMD אחת. אם מציינים יותר מ-CMD אחד, רק ה-CMD האחרון ייכנס לתוקף. יש פונקציות מתקדמות יותר בעזרת ההוראות של CMD ו-ENTRYPOINT, אבל לא נלמד על כך בשיעור ה-Lab הזה. מידע נוסף מופיע בקטע CMD" במשאבי העזרה של קובץ Docker
תחביר: CMD ["executable","param1","param2"]
בשיעור ה-Lab הזה נריץ את קובץ ה-JAR שיצרנו, מוסיפים את השורה הבאה לתחתית קובץ ה-Docker.
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]
קובץ Docker סופי
קובץ ה-Docker הסופי יהיה
FROM openjdk:11.0-jdk
WORKDIR /app
COPY . /app
RUN ./mvnw compile assembly:single
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]
שמירת קובץ ה-Docker באופן מקומי
cd ${HOME}/sample-app
git add Dockerfile
git commit -m "Added Dockerfile"
4. פיתוח פתרונות
עכשיו נבנה את קובץ האימג' מקובץ ה-Docker באמצעות הפקודה docker build
. הפקודה הזו מנחה את ה-Docker daemon ליצור את התמונה באמצעות ההוראות מקובץ ה-Docker שלנו. מידע נוסף זמין במאמרי העזרה בנושא build של Docker.
יצירת התמונה
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker build --tag sample-app:${IMAGE_TAG} .
פלט
Sending build context to Docker daemon 221.2kB Step 1/4 : FROM openjdk:11.0-jdk 11.0-jdk: Pulling from library/openjdk 0c6b8ff8c37e: Pull complete 412caad352a3: Pull complete e6d3e61f7a50: Pull complete 461bb1d8c517: Pull complete e442ee9d8dd9: Pull complete 542c9fe4a7ba: Pull complete 41de18d1833d: Pull complete Digest: sha256:d72b1b9e94e07278649d91c635e34737ae8f181c191b771bde6816f9bb4bd08a Status: Downloaded newer image for openjdk:11.0-jdk ---> 2924126f1829 Step 2/4 : WORKDIR /app ---> Running in ea037abb273d Removing intermediate container ea037abb273d ---> bd9b6d078082 Step 3/4 : COPY . /app ---> b9aec2b5de51 Step 4/4 : RUN ./mvnw compile jar:jar ---> Running in 3f5ff737b7fd [INFO] Scanning for projects... ... [INFO] Building jar: /app/target/sample-app-1.0.0.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 22.952 s [INFO] Finished at: 2022-02-23T18:09:08Z [INFO] ------------------------------------------------------------------------ Removing intermediate container 331443caebd3 ---> 152f65cc441e Step 5/5 : CMD ["java", "-jar", "/app/target/sample-app-1.0.0.jar"] ---> Running in 3d595a72231c Removing intermediate container 3d595a72231c ---> 0e40d7548cab Successfully built 0e40d7548cab Successfully tagged sample-app:aaa8895
5. ריצה
לאחר פיתוח מוצלח של קובץ האימג' בקונטיינר שלנו, אנחנו יכולים להריץ את האפליקציה ולוודא שהיא פועלת כצפוי באמצעות פקודת ההרצה של Docer. הפקודה הזו תפעיל את הקונטיינר שלנו בחזית שורת הפקודה לצורך בדיקה או ניפוי באגים. מידע נוסף זמין במאמרי העזרה להרצת Docker.
הפעלת קונטיינר באמצעות קובץ האימג'
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-p 8080:8080 \
sample-app:${IMAGE_TAG}
פלט
Listening at http://localhost:8080
תצוגה מקדימה של האפליקציה שפועלת בקונטיינר
- לוחצים על הלחצן של Cloud Shell Web Preview.
- לוחצים על 'תצוגה מקדימה' ביציאה 8080
- כדי לעצור את הקונטיינרים, מקישים על CTRL + c ב-Cloud Shell
שינוי ההתנהגות של מאגר תגים
הרצת Docker Run משתמשת בהגדרות ברירת המחדל בקובץ Docker. ניתן להוסיף הוראות ופרמטרים נוספים כדי לשנות את ההתנהגות הזו.
הפעלת רישום ביומן TRACE
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-p 8080:8080 \
sample-app:${IMAGE_TAG} \
java -Dorg.slf4j.simpleLogger.defaultLogLevel=trace -jar /app/target/sample-app-1.0.0-jar-with-dependencies.jar
תצוגה מקדימה של האפליקציה שפועלת בקונטיינר
- לוחצים על הלחצן של Cloud Shell Web Preview.
- לוחצים על 'תצוגה מקדימה' ביציאה 8080
- עוברים לכרטיסייה Cloud Shell ובודקים את הרישום ביומן הנוסף
- כדי לעצור את הקונטיינר, מקישים על CTRL + c ב-Cloud Shell
שינוי היציאה
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-e PORT=8081 \
-p 8081:8081 \
sample-app:${IMAGE_TAG}
תצוגה מקדימה של האפליקציה שפועלת בקונטיינר
- לוחצים על הלחצן של Cloud Shell Web Preview.
- לוחצים על 'שינוי היציאה'.
- להזין את המספר 8081
- לוחצים על 'שינוי ותצוגה מקדימה'
- כדי לעצור את הקונטיינר, מקישים על CTRL + c ב-Cloud Shell
6. דחיפה
כאשר אנחנו בטוחים שקובץ האימג' בקונטיינר פועל בצורה תקינה ואנחנו רוצים להפוך את הקונטיינר לזמין להפעלה בסביבות אחרות או על ידי משתמשים אחרים, נצטרך להעביר את התמונה למאגר משותף. זה אמור לקרות כחלק מצינור עיבוד נתונים אוטומטי של build, אבל בסביבת הבדיקה שלנו כבר הוגדר מאגר, ואנחנו יכולים לדחוף את התמונה שלנו באופן ידני.
דחיפת את ההתחייבות ב-Docker למאגר האפליקציה לדוגמה
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
git push
תיוג התמונה עבור Artifact Registry
docker tag sample-app:${IMAGE_TAG} \
us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}
הגדרת פרטי הכניסה ל-Artifact Registry
gcloud auth configure-docker us-central1-docker.pkg.dev
כשמוצגת ההודעה Do you want to continue (Y/n)?
, צריך לענות y
וללחוץ על Enter
דחיפת התמונה ל-Artifact Registry
docker push us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}
פלט
The push refers to repository [us-central1-docker.pkg.dev/qwiklabs-gcp-04-b47ced695a3c/apps/sample-app] 453b97f86449: Pushed e86791aa0382: Pushed d404c7ee0850: Pushed fe4f44af763d: Pushed 7c072cee6a29: Pushed 1e5fdc3d671c: Pushed 613ab28cf833: Pushed bed676ceab7a: Pushed 6398d5cccd2c: Pushed 0b0f2f2f5279: Pushed aaa8895: digest: sha256:459de00f86f159cc63f98687f7c9563fd65a2eb9bcc71c23dda3351baf13607a size: 2424
7. מעולה!
כל הכבוד, סיימת את ה-Codelab!
מה נכלל
- יצרתם קובץ Docker לאפליקציה לדוגמה
- נוצרה תמונה
- הרצת התמונה כקונטיינר באופן מקומי
- התנהגות המאגר השתנתה
- בוצעה דחיפה של התמונה ל-Artifact Registry