PracticU

DockerFile

בלי כתוביותעם כתוביות
PracticU › קורס Docker - עם Swarm Cluster › DockerFile
מילון מושגים:
Dockerfile - קובץ טקסט עם הוראות לבניית Docker Image, המגדיר את הבסיס, הקבצים והפקודות שיירוצו.
Docker Image - תבנית לקריאה בלבד שמכילה אפליקציה ותלויותיה, וממנה מריצים קונטיינרים ב-Docker.
Docker - פלטפורמה להרצת אפליקציות בתוך קונטיינרים מבודדים וקלים, כדי שירוצו באופן אחיד בכל סביבה.
קונטיינר - חבילה קלה ומבודדת שאורזת אפליקציה עם כל תלויותיה, ורצה באופן אחיד בכל סביבה, למשל ב-Docker.
IIS - שרת האינטרנט של מיקרוסופט (Internet Information Services), המריץ אתרים ויישומי אינטרנט על Windows.
משתנה סביבה - ערך בעל שם שמוגדר במערכת ההפעלה ומשמש תוכנות להגדרות, כמו נתיבים או מפתחות תצורה.
מעטפת - תוכנה שמפרשת פקודות של המשתמש ומעבירה אותן למערכת ההפעלה, למשל Bash או PowerShell.
מטמון - אחסון זמני ומהיר של נתונים שנדרשים שוב, כדי להאיץ גישה ולהפחית עומס מהמקור המקורי.

DockerFile
ההרצאה מסבירה את קובץ ה-Dockerfile: סקריפט שבונה אימג' של Docker באופן אוטומטי, כך שאפשר לחזור על הבנייה שוב ושוב. במקום להיכנס לקונטיינר, לשנות בו דברים ידנית ולעשות לו commit, שבו ההיסטוריה של מה שנעשה נעלמת, כל פעולה נכתבת בקובץ ונשמרת בהיסטוריית האימג'.
למה לא לעשות commit ידני
אחרי commit לקונטיינר ששונה ידנית נוצרת שכבה עליונה גדולה שאין לה היסטוריה. אי אפשר לדעת איזו פקודה הורצה ומתי, וקשה מאוד לעדכן את האימג' בעתיד. סקריפט שמריץ את אותן פקודות בכל בנייה פותר את הבעיה.
השלבים העיקריים
1. אימג' מול קונטיינר: האימג' הוא שכבות לקריאה בלבד. הקונטיינר מוסיף עליהן שכבת כתיבה, וה-commit הופך את השכבה הזאת לשכבה חדשה של האימג'.
2. FROM: מגדיר את אימג' הבסיס, למשל אימג' Windows עם IIS של מיקרוסופט. זו השורה הראשונה בקובץ.
3. COPY ו-ADD: מעתיקים קבצים מהתיקייה שבה נמצא ה-Dockerfile לתוך האימג', למשל קובץ האינדקס של האתר. ADD יודע גם לחלץ קובצי ZIP ולהוריד קבצים מכתובת באינטרנט.
4. הקונטקסט של הבנייה: docker build שולח את כל התיקייה הנוכחית לשירות Docker, שבונה את האימג'. לכן עדיף לעבוד בתיקייה ריקה שמכילה רק את הקבצים הנדרשים, ולא בשורש של כונן.
5. תגיות: האפשרות -t נותנת לאימג' שם ותגית, ואפשר לתת כמה תגיות באותה בנייה, למשל latest ו-v2. לשיתוף במאגר משותף השם צריך להתאים לשם המאגר.
6. WORKDIR ו-RUN: WORKDIR קובע את התיקייה הנוכחית לכל הפקודות הבאות. RUN מריץ פקודה בזמן הבנייה. כל RUN הוא שלב נפרד, ולכן cd בשורה אחת לא נשמר לשורה הבאה.
7. ENV, LABEL ו-EXPOSE: ENV קובע משתני סביבה שהתוכנה בתוך הקונטיינר יכולה לקרוא. LABEL מוסיף מידע כללי שנראה ב-inspect. EXPOSE רק מצהיר על הפורט, והפורט נחשף בפועל רק כשמריצים את הקונטיינר עם -p.
8. ENTRYPOINT ו-CMD: ENTRYPOINT היא התוכנה הראשית שרצה כשמפעילים את הקונטיינר. CMD הוא פרמטר ברירת מחדל, וכל פרמטר שנכתב ב-docker run מחליף אותו. בצורת מערך עם סוגריים מרובעים התוכנה רצה ישירות, בלי מעטפת cmd.
9. מטמון (cache): כל הוראה יוצרת שכבה, ושכבה שלא השתנתה נלקחת מהמטמון. לכן כדאי לשים בסוף את הקבצים שמשתנים הכי הרבה. האפשרות --no-cache מכריחה בנייה מחדש מלאה.
10. בדיקה: docker history --no-trunc מציג את הפקודות של כל שכבה, docker images -a מציג גם שכבות ביניים, ו-docker run -d -p 80:80 מפעיל את האתר, שנבדק מהדפדפן.
פקודות והגדרות
docker build -t <שם>:latest . בונה אימג' מהתיקייה הנוכחית. docker ps מציג קונטיינרים רצים, docker stop עוצר קונטיינר, ו-docker rm מוחק אותו. docker exec -it <קונטיינר> cmd פותח מעטפת cmd בתוך קונטיינר רץ.
שימו לב
אל תריצו build מתיקיית שורש של כונן, כי כל הכונן יישלח לשירות. הנחיית ה-escape (התו שמאפשר לפצל פקודה לכמה שורות) חייבת להופיע בשורה הראשונה, לפני FROM. ב-docker run בלי הפרמטר --rm הקונטיינר נשאר במצב stopped, ועם --rm הוא נמחק מיד בעצירה.
ההרצאה הזאת נותנת את הבסיס: יודעים לכתוב Dockerfile פשוט, לבנות ממנו אימג' ולבדוק שהוא עובד.
השיעור הבא בקורס: התקנת Docker על וונדוס 10

פרקי ההרצאה: DockerFile

  1. 00:00

    סיכום: יצירת אימג' משלנו מקונטיינר

  2. 00:39

    שכבות האימג' לעומת הקונטיינר

  3. 02:09

    הבעיה: אימג' בלי היסטוריה ברורה

  4. 02:44

    התאמה אישית של האימג' בסקריפט

  5. 04:14

    ServiceMonitor ושמירת הקונטיינר פעיל

  6. 05:12

    הכרזת פורט 80 והגדרת נקודת הכניסה

  7. 06:32

    הכנת תיקיית פרויקט לסקריפט

  8. 09:46

    בניית האימג' עם docker build

תמלול ההרצאה: DockerFile

הטקסט המלא של הדקות הראשונות בהרצאה «DockerFile» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום לכולם, אחרי שבהרצאה הקודמת יצרנו אימג' משלנו ואני מזכיר לכם לקחנו אימג' מוכן של מייקרוסופט איי-אס הרצנו אותו נכנסנו פנימה הוספנו כל מיני דברים משלנו לדוגמה קובץ אינדקס html שינינו ואחרי שסיימנו לעשות את זה עצרנו את הקונטיינר עשינו לו סטופ והפכנו את הקונטיינר

  2. 00:35

    לאימג' נקרא לעשות קומיט ומאותו הרגע שהוא נהיה אימג' אפשר להפיץ אותו לאחרים ולהפעיל ממנו הרבה קונטיינרים אחרים. ההבדל בין אימג' לקונטיינר שמעל אימג' שמים שכבה של read-right וכל האימג' מתחת הוא ב-read-only ולמעשה קונטיינר זה אותו אימג' עם שכבה נוספת

  3. 01:02

    למעלה של read-right וכשעושים קומיט אז את השכבה של read-right הופכים חזרה לשכבת read-only ומעליה שמים שכבה חדשה. אז כל השכבות האלו זה קבצים בעצם כמו קובץ VHD כזה שיש בפנים הרבה קבצים אחרים.

  4. 01:24

    אז אימג' ממנו יוצרים קונטיינרים ומאותו אימג' אפשר ליצור המון קונטיינרים כמו מאיזו אחד אפשר ליצור הרבה מכונות וירטואליות. רק פה זה הרבה יותר חכם ומשוכלל.

  5. 01:37

    אז ראינו שלקחנו את המיקרוסופט ה-S כאימג' בסיסי, יצרנו ממנו קונטיינר, אחרי זה כיסמנו את הקונטיינר לצרכים שלנו, עצרנו אותו ועשינו לו קומיט, וברגע שעשינו לו קומיט, הפכנו אותו לאימג' משלנו.

  6. 01:56

    נהיה לנו אימג' של פרוג'קט אחד, מקף ה-S. וכך יש לנו אימג' משלנו. ועכשיו, אם אנחנו נריץ פקודה דוקר היסטורי על האימג' שלנו, אנחנו נראה שיש לנו פה שכבה עליונה חדשה שתופסת 25 מגה ואין בה היסטוריה, אי אפשר לדעת בדיוק מה קרה, אנחנו לא יודעים בדיוק איזה פקודה

  7. 02:24

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

  8. 02:55

    לקחת את האימייג' הבסיסי של ווינדוס נניח 1809 זה גרסה של ווינדוס הבסיסית ולהריץ עליה עוד ועוד פקודות, בואו אני אראה לכם, בואו נעשה פה מינוס מינוס help, no trunk, no trunk זה אומר להראות את כל הפקודות ואנחנו יכולים לראות באימג'ים, אתם רואים דוקר היסטורי, איזה אימג' no

  9. 03:22

    trunk, אנחנו רואים פה בדיוק מה עשו מייקרוסופט, הם בהתחלה לקחו את האימג' הבסיסי של ווינדוס, שלוש וחצי ג'יגה, אחרי זה עשו פקודה install update והתקינו את ה-update הזה, אחרי זה הם לקחו פקודה cmd/s והריצו cmd שמריץ powershell שמוסיף פיצ'ר של וב סרבר ומריץ

  10. 03:52

    פקודת invoke web server אתם רואים פקודה ראשונה נקודה פסיק פקודה שנייה וinvoke web request לבקש משהו מהווב העבירו לו אותה לינק לservice monitor ורשמו את זה בservicemonitor.exe כך הם שמרו למעשה בתוך אימג' קובץ סרוויס מוניטורי XE שהורידו מאתר של מייקרוסופט של דוטנט.

  11. 04:20

    מה התוכנה הזאת עושה? מה הקובץ XE הזה עושה? עוקב אחרי סרוויס ורק כשהוא עוצר הסרוויס הפרוצס הזה נעצר. למה צריך אותו? שמכונה וירטואלית שהקונטיינר לא יחשוב שאין שום תהליך שרץ, הוא חייב איזשהו תהליך שירוץ ולא ברקע אחרת הוא יוצא החוצה ונסגר.

  12. 04:46

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

  13. 05:10

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

  14. 05:25

    הלאה. אחרי זה הם קבעו entry point, entry point זה מה להריץ כשמישהו מפעיל את ה-image. אז הם מריצים פקודה c.2.servicemonitor.exe, את התוכנת ה-XE הזאת, שתעקוב אחרי סרוויס W3SVC, שזה למעשה תעקוב אחרי הסרוויס של ה-Web.

  15. 05:48

    ואחרי זה שכבה הבאה, מה אנחנו רואים? כלום. למה כלום? כי אף אחד לא יודע מה עשינו. וזאת בדיוק הבעיה שאני רוצה לפתור איתכם. אני לא רוצה להשאיר את זה ככה, אני רוצה להמשיך את האסטרטגיה של לבנות אימייג' משלי בצורת סקריפט מסודר שגם כותב את ההיסטוריה בעמודת comment וגם אם נרצה פעם אחת לעדכן את הסקריפט בעתיד נוכל לעשות את זה בקלות אז

  16. 06:20

    הרעיון שלי זה לא לעשות שכבה כמו שעשינו עד עכשיו שנכנסנו פנימה לתוך הקונטיינר עשינו מה שבא לנו ועשינו על זה קומיד בסוף אלא לעשות את זה על ידי סקריפט שהסקריפט יעשה את אותן הפעולות רק שירשום הכל בתוך הקומנט ותהיה לנו היסטוריה וסדר אז יופי איך אנחנו עושים את זה אז בואו ניכנס לתיקייה שנקראת אפ אחד נניח אתם יודעים מה שתקרא project 1

  17. 06:57

    נעשה md project 1 נכון אז יש לנו תיקיית project 1 cd project 1 נכנסים md is 2 נקרא לו is 2 נכון מה יש לנו docker images יש לנו is, project1 is, עכשיו נקרא לזה is2, cd is2, דיר, אין לנו כלום, אנחנו עושים ככה, נעשה notepad עם שם של קובץ, text.html, סתם דוגמא,

  18. 07:48

    אני סתם נותן לכם דוגמא, אין קובץ כזה ואני אכתוב בפנים 111, בסדר? או שבוא נעשה format h1, אתם יודעים מה, נעשה h1, לא עוד, dockerfile, בוא נעשה ככה, זה נקרא dockerfile דרך אגב,

  19. 08:17

    מה שאנחנו עושים, dockerfile זה הקובץ של הסקריפט. שכחתי להגיד לכם שככה חייבים לקרוא לו dockerfile. אז אני עשיתי פה Hello World from PracticU dockerfile.

  20. 08:32

    יפה מאוד, אז עשינו את זה, שומרים אותו. אתם יודעים מה? בואו נעשה, לא אינדקס נקרא לו, נקרא לו IS start html, נקרא לו ככה, כי זה הקובץ שיושב בפנים.

  21. 08:57

    יופי. עכשיו אנחנו צריכים ליצור קובץ חדש, נקרא לקובץ הזה docker file ככה חייבים לקרוא לו ונעשה פה בנוטפד נכתוב לו פקודות מה זה docker file זה למעשה הסקריפט שבונה לנו את האימג' משלנו איך נתחיל אותו אנחנו חייבים להישמע לפקודות של docker file ובואו נראה איזה פקודות

  22. 09:32

    נפתח דפן ונראה איזה פקודות אנחנו צריכים להכניס אני גם לא זוכר את כל הפקודות בעל פה נכון אז יש לנו פה docker file reference וכתוב פה כאלו הוראות docker can build image automatically by reading the instructions from docker file.

  23. 09:52

    אתם רואים? הוא בונה אימג' באופן אוטומטי על ידי זה שהוא קורא פקודות מתוך docker, קובץ docker. אז זה למעשה סקריפט שבונה לנו אימג', כן?

  24. 10:06

    איזה פקודות. אחרי זה אנחנו נריץ פקודת docker build ונבנה את ה-image. אומרים לו מאיזה תיקייה, התיקייה הנוכחית שלי.

  25. 10:18

    בואו נקרא ביחד מה שכתוב פה, זריז. דוקר פייל, שימו לב, מה שכתוב פה, ש-the build, התהליך של בניית אימג' מתבצע על ידי סרוויס, דיימון, דיימון של דוקר, ולא על ידי CLI, לא הקליינט עושה את זה, עושה את זה השרת.

  26. 11:05

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

  27. 11:19

    תיזהרו שאתם לא מפעילים את ה-Docker build בתיקייה M באיזה שורש של איזה R-Disk, שהוא לא ישלח את הכל דרך הרשת לסרוויס, מי שבונה את הכל זה סרוויס, את כל האימג' הזה.

  28. 11:37

    ולכן הם ממליצים להתחיל ב-empty folder, בתיקייה ריקה. זה מה שעשינו איתכם, נכון? עשינו תיקייה ריקה ושמנו כל הקבצים שאנחנו צריכים לאימג' שהיא תהיה קונטקסט.

  29. 11:53

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

  30. 12:23

    אפשר לבנות קובץ שנקרא docker ignore שיתעלם מקבצים מסוימים שיש בתיקייה הנוכחית, יש את זה פה בהמשך למטה, זה פחות חשוב. אני יכול לציין איפה נמצא קובץ docker, דוקר פייל נמצא בתיקייה אחרת זה תיקיות של לינוקס אבל לא משנה גם בווינדוס זה עובד להגיד לו איפה נמצא קובץ דוקר אם הוא לא נמצא בתיקייה נוכחית הלאה t זה tag איזה תגית אנחנו שמים

  31. 12:50

    על האימג' החדש שנבנה שיהיה לו לא רק מספר שיהיה לו תגית יפה אם אני רוצה להעלות אותו לשרת משותף אני חייב לתת את זה לפי הרפוזיטורי שלי לפי השם שלי אתם זוכרים שיש לנו שרת ואנחנו חייבים לקרוא לתיקייה פרקטיקיו סלאש והשם של הריפוזיטורי שלי.

  32. 13:12

    דוקר בילד, הנה בבקשה, t, איזה תגית הם שמים, כן, איזה תגית הם שמים, ועוד תגית, שימו לב, שתי תגיות הם שמים, גם תגית לייטסט וגם תגית ורשן, שתי תגיות באותו בילד, אין בעיה עם זה.

  33. 13:31

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

  34. 13:49

    אני רוצה להראות לכם את כל הפקודות ש... הנה בבקשה, פקודת Add שמוסיפה קובץ לתוך ה-Image, שזה למעשה כמו קרופי, קרופי ו-Add אותו דבר, רק Add יודע לפתוח זיפ וקרופי לא יודע לפתוח זיפ.

  35. 14:07

    Environment זה משתנה סביבה בתוך ה-Image, מכירים את זה שאתם כותבים Set, Enter? זה נקרא משתנה סביבה, אני יכול לקבע אותם בתוך אימג' אם נלך לפאורשל ונכתוב סט אנטר.

  36. 14:23

    אוי, צריך בסים די לעשות את זה, סט אנטר. אנחנו רואים את כל משתני הסביבה, לדוגמה, All Users Profiles נמצאים פה, Home Fold נמצא כאן.

  37. 14:34

    למה זה חשוב? כי ככה אני מעביר הוראות לתוכנה כלשהי. נניח יש תוכנה שרוצה לרוץ, אני יכול לשים משתנה סביבה והיא תקרא מתוך משתנה הסביבה הזה משהו שרציתי להעביר לה,

לקורס המלא: קורס Docker עם Swarm Cluster

ההרצאה הקודמת: Publish Image

ההרצאה הבאה: התקנת Docker על וונדוס 10

קורסים נוספים במסלול

  • קורס AWS - ניהול מכונה וירטואלית בענן
  • קורס Terraform - DevOps - Azure & AWS
  • קורס קוברנטיקס - Kubernetes
  • קורס DevOps - Ansible
  • קורס PowerShell
  • קורס Git ו-GitHub עם Visual Studio