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

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

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

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

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

מה תלמדו

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

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

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

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

הגדרת סביבה בקצב עצמי

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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