פיתוח קונטיינרים באמצעות קובצי Docker

1. סקירה כללית

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

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

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

מה תלמדו

בשיעור Lab זה תלמדו איך:

  • יצירת קובץ Docker לאפליקציה לדוגמה
  • יצירת תמונה
  • הפעלת קובץ האימג' כקונטיינר באופן מקומי
  • שינוי ההתנהגות של מאגרי תגים
  • דחיפת התמונה ל-Artifact Registry

דרישות מוקדמות

זהו שיעור Lab ברמת מבוא. ההנחה היא שאין ניסיון קודם ב-Docker ובקונטיינרים, אם בכלל. מומלץ להכיר את Cloud Shell ואת שורת הפקודה, אבל לא חובה.

הגדרת סביבה בקצב אישי

  1. נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או עושים שימוש חוזר בפרויקט קיים. אם אין לכם עדיין חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name הוא השם המוצג של המשתתפים בפרויקט. זו מחרוזת תווים שלא נעשה בה שימוש ב-Google APIs, ואפשר לעדכן אותה בכל שלב.
  • Project ID חייב להיות ייחודי בכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו (אי אפשר לשנות אותו אחרי שמגדירים אותו). מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי; בדרך כלל לא מעניין אותך מה זה. ברוב ה-Codelabs תצטרכו להפנות אל מזהה הפרויקט (ובדרך כלל הוא מזוהה כ-PROJECT_ID), כך שאם הוא לא מוצא חן בעיניכם, תוכלו ליצור פרויקט אקראי אחר או לנסות בעצמכם ולבדוק אם הוא זמין. ואז המכשיר 'קפוא' לאחר יצירת הפרויקט.
  • יש ערך שלישי, Project Number, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי התיעוד.
  1. בשלב הבא צריך להפעיל את החיוב במסוף 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