1. סקירה כללית
Docker היא פלטפורמה פתוחה לפיתוח, להפצה ולהרצה של אפליקציות. באמצעות Docker, אתם יכולים להפריד את האפליקציות מהתשתית ולטפל בתשתית כמו באפליקציה מנוהלת. Docker עוזרת לכם לשלוח קוד מהר יותר, לבדוק מהר יותר, לפרוס מהר יותר ולקצר את המחזור בין כתיבת קוד להרצת קוד.
Docker עושה את זה על ידי שילוב של תכונות קונטיינריזציה של ליבת המערכת עם תהליכי עבודה וכלים שעוזרים לכם לנהל ולפרוס את האפליקציות שלכם.
אפשר להשתמש ישירות בקונטיינרים של Docker ב-Kubernetes, כך שקל להריץ אותם ב-Kubernetes Engine. אחרי שתלמדו את היסודות של Docker, יהיו לכם הכישורים להתחיל לפתח אפליקציות בקונטיינרים וב-Kubernetes.
מה תלמדו
בשיעור Lab זה תלמדו איך:
- יצירת קובץ Dockerfile לאפליקציה לדוגמה
- יצירת תמונה
- הפעלת התמונה כקונטיינר באופן מקומי
- שינוי ההתנהגות של מאגר התגים
- העברת התמונה אל Artifact Registry
דרישות מוקדמות
זהו שיעור Lab ברמת מבוא. אנחנו יוצאים מנקודת הנחה שיש לכם מעט מאוד ניסיון ב-Docker ובקונטיינרים, או שאין לכם ניסיון בכלל. מומלץ להכיר את Cloud Shell ואת שורת הפקודה, אבל לא חובה.
הגדרת סביבה בקצב עצמי
- נכנסים ל-מסוף Google Cloud ויוצרים פרויקט חדש או משתמשים בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או Google Workspace, אתם צריכים ליצור חשבון.



- שם הפרויקט הוא השם המוצג של הפרויקט הזה למשתתפים. זו מחרוזת של תווים שלא נמצאת בשימוש ב-Google APIs, ואפשר לעדכן אותה בכל שלב.
- מזהה הפרויקט חייב להיות ייחודי לכל הפרויקטים ב-Google Cloud, והוא קבוע (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר באופן אוטומטי מחרוזת ייחודית. בדרך כלל לא צריך להתייחס אליה. ברוב סדנאות ה-Codelab, צריך להפנות למזהה הפרויקט (ובדרך כלל הוא מזוהה כ-
PROJECT_ID), אז אם לא מוצא חן בעיניכם, אפשר ליצור מזהה אקראי אחר, או לנסות מזהה משלכם ולבדוק אם הוא זמין. אחרי שהפרויקט נוצר, הוא 'קפוא'. - יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. במאמרי העזרה מפורט מידע נוסף על שלושת הערכים האלה.
- בשלב הבא, תצטרכו להפעיל את החיוב במסוף Cloud כדי להשתמש במשאבי Cloud או בממשקי API. העלות של התרגול הזה לא אמורה להיות גבוהה, ואולי אפילו לא תצטרכו לשלם בכלל. כדי לכבות את המשאבים ולא לחייב אתכם מעבר למה שמוסבר במדריך הזה, צריך לפעול לפי ההוראות לניקוי שמופיעות בסוף ה-Codelab. משתמשים חדשים ב-Google Cloud זכאים לתוכנית תקופת ניסיון בחינם בשווי 300$.
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.
- לוחצים על 'תצוגה מקדימה' ביציאה 8080
בסיום
- מקישים על Ctrl + c ב-Cloud Shell כדי להפסיק את האפליקציה הפועלת.
3. קובץ Docker
יצירת קונטיינר לאפליקציה באמצעות Dockerfile
אחת השיטות לאריזת אפליקציה בקונטיינר היא באמצעות קובץ Dockerfile. קובץ Docker דומה לסקריפט שמנחה את הדימון (daemon) איך להרכיב את קובץ אימג' של קונטיינר. מידע נוסף זמין במאמרי העזרה בנושא Dockerfile.
יוצרים קובץ Dockerfile ריק במאגר של האפליקציה לדוגמה.
touch ${HOME}/sample-app/Dockerfile
פותחים את קובץ ה-Dockerfile בכלי העריכה הרצוי.
vi ${HOME}/sample-app/Dockerfile
בחירת תמונה ראשונית
כדי ליצור קונטיינר באמצעות קובץ Docker, צריך ידע ישיר על האפליקציה כדי להרכיב את הקונטיינר. השלב הראשון ביצירת קובץ Dockerfile הוא בחירת תמונה שתשמש כבסיס לתמונה שלכם.התמונה הזו צריכה להיות תמונת אב או תמונת בסיס שמתוחזקת ומפורסמת על ידי מקור מהימן, בדרך כלל החברה שלכם.
ההוראה FROM מאתחלת שלב חדש של build ומגדירה את קובץ האימג' הבסיסי לפקודות רציפות הבאות. לכן, ההוראה FROM היא בדרך כלל ההוראה הראשונה בקובץ Dockerfile, ויכולה להופיע רק אחרי הוראת 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>.
במעבדה הזו אנחנו משתמשים בתמונה הציבורית openjdk:11.0-jdk. מוסיפים את השורה הבאה לקובץ Dockerfile
FROM openjdk:11.0-jdk
הגדרת ספריית העבודה
ההוראה WORKDIR מגדירה את ספריית העבודה לכל ההוראות הבאות בקובץ Dockerfile. מידע נוסף מופיע בקטע WORKDIR במאמרי העזרה בנושא Dockerfile
תחביר: WORKDIR <path>
במעבדה הזו אנחנו משתמשים בספרייה /app כ-WORKDIR שלנו, ומוסיפים את השורה הבאה לחלק התחתון של קובץ ה-Dockerfile
WORKDIR /app
העתקת קובצי האפליקציה
ההוראה COPY מעתיקה ספריות או קבצים מהמיקום <source> לנתיב <destination> של מערכת הקבצים של התמונה. אפשר לציין כמה משאבי <source>, וכולם יחסיים להקשר של ה-build. הקשר הבנייה יוסבר בהמשך בקטע 'בנייה'. מידע נוסף מופיע בקטע COPY במאמרי העזרה בנושא Dockerfile
תחביר: COPY <source>... <destination>
בשיעור Lab זה, נעתיק את כל הקבצים במאגר למערכת הקבצים של התמונה, ונוסיף את השורה הבאה לתחתית של קובץ ה-Dockerfile
COPY . /app
קומפילציה של האפליקציה
ההוראה RUN מריצה פקודות בשכבת תמונה חדשה מעל התמונה הנוכחית ומבצעת את התוצאות. התמונה שנוצרת תישמר ותשמש לשלבים הבאים בקובץ Dockerfile. מידע נוסף מופיע בקטע RUN במאמרי העזרה של Dockerfile
תחביר: RUN <command>
במעבדה הזו נשתמש ב-Maven כדי לקמפל את האפליקציה לקובץ JAR. מוסיפים את השורה הבאה לתחתית של קובץ ה-Dockerfile
RUN ./mvnw compile assembly:single
הגשת הבקשה
ההוראה CMD מספקת את פקודת ברירת המחדל לקונטיינר פעיל. יכולה להיות רק הוראת CMD אחת בקובץ Dockerfile. אם מציינים יותר מהוראת CMD אחת, רק הוראת ה-CMD האחרונה תהיה בתוקף. יש פונקציונליות מתקדמת יותר שזמינה באמצעות ההוראות CMD ו-ENTRYPOINT, אבל היא לא נכללת במעבדה הזו. מידע נוסף מופיע בקטע CMD` במאמרי העזרה בנושא Dockerfile
תחביר: CMD ["executable","param1","param2"]
במעבדה הזו מריצים את קובץ ה-JAR שקומפל, ומוסיפים את השורה הבאה לתחתית של קובץ ה-Dockerfile
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]
קובץ Dockerfile סופי
קובץ ה-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"]
ביצוע Commit של קובץ ה-Dockerfile באופן מקומי
cd ${HOME}/sample-app
git add Dockerfile
git commit -m "Added Dockerfile"
4. תכנות
עכשיו ניצור את קובץ האימג' מקובץ Docker באמצעות הפקודה docker build. הפקודה הזו מורה לשירות ה-daemon של Docker ליצור את קובץ האימג' באמצעות ההוראות מקובץ ה-Dockerfile. מידע נוסף זמין במאמרי העזרה בנושא docker build.
יצירת התמונה
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. ריצה
אחרי שיוצרים בהצלחה את קובץ האימג' של הקונטיינר, אפשר להריץ את האפליקציה ולוודא שהיא פועלת כמצופה באמצעות הפקודה docker run. הפקודה הזו תפעיל את הקונטיינר בחזית של שורת הפקודה לצורך בדיקה או ניפוי באגים. מידע נוסף מופיע במאמרי העזרה בנושא docker run.
הפעלת קונטיינר באמצעות התמונה
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.
- לוחצים על 'תצוגה מקדימה' ביציאה 8080
- מקישים על Ctrl + c ב-Cloud Shell כדי לעצור את הקונטיינרים.
שינוי ההתנהגות של מאגר התגים
ההרצה של Docker Run משתמשת בהגדרות ברירת המחדל בקובץ Dockerfile. אפשר להוסיף הוראות ופרמטרים נוספים כדי לשנות את ההתנהגות הזו.
הפעלת רישום ביומן של 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.
- לוחצים על 'תצוגה מקדימה' ביציאה 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.
- לוחצים על שינוי הניוד.
- מזינים 8081.
- לוחצים על 'שינוי ותצוגה מקדימה'.
- מקישים על Ctrl + c ב-Cloud Shell כדי לעצור את הקונטיינר.
6. דחיפה
אחרי שמוודאים שקובץ אימג' של קונטיינר פועל כמו שצריך ורוצים להפוך את הקונטיינר הזה לזמין להרצה בסביבות אחרות או על ידי משתמשים אחרים, צריך להעלות את התמונה למאגר משותף. הפעולה הזו אמורה להתבצע כחלק מצינור build אוטומטי, אבל בסביבת הבדיקה שלנו כבר מוגדר מאגר ואנחנו יכולים להעלות את התמונה באופן ידני.
שליחת הקומיט של Dockerfile למאגר sample-app
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!
מה נכלל
- נוצר קובץ Dockerfile לאפליקציה לדוגמה
- יצירת תמונה
- הפעלת התמונה כקונטיינר באופן מקומי
- שינוי התנהגות הקונטיינר
- התמונה הועברה אל Artifact Registry