
FROM scratch, העתקת קובץ ההרצה, והגדרת נקודת הכניסה.docker build בונה את האימג' בתגית, והאימג' שנוצר מכיל רק את קובץ ההרצה. בדיקה מראה שגודלו כשני מגה.docker run מפעיל את התוכנה, היא מדפיסה את ההודעה ויוצאת, ולכן הקונטיינר נסגר מיד.הטקסט המלא של הדקות הראשונות בהרצאה «יצירת Docker Image מאפס - ללא בסיס» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, לפני שנעבור לחלק של קלאסטרים, אני רוצה לדבר על משהו קטן, שככה אני מרגיש שצריך לדבר עליו, שאפשר לעשות אימג'ים לא על הבסיס אימג' קיים, אלא מאפס, פרום סקרייץ' מה שנקרא, מאפס.
לא להתבסס אימג' על אימג', כל הזמן עד עכשיו עשינו אימג' שמבוסס על אימג' אחר. אני רוצה לעשות אימג' מאפס.
זאת אומרת שכלום, לא יהיה שום בסיס, אוקיי? תהיה אימג' רק עם קובץ אחד של התוכנה שלי. זה הכל. בואו נעשה פולדר חדש, תיקייה חדשה.
נקרא לה image from scratch, מ-0. No base image, אין בייס, בלי בסיס, אוקיי? אז אנחנו, ונפתח visual studio code כדי שלא יהיה נוח לכתוב.
נסגור את הכל. אתם יודעים, נעשה ככה open folder עוד פעם. תראו פה בצד. אתם רואים, אני עכשיו בדסקטופ. אני לא רוצה להיות בדסקטופ שיהיה לי יותר נוח, אני עושה Open Folder ואני פותח את התיקייה Image From Scratch.
זאת תהיה התיקייה שלי על המסך. אתם יכולים לראות שזאת התיקייה שלי על המסך ואין בה אף קובץ. ואנחנו נעשה קובץ חדש ונקרא לו Hello.C++, בסדר?
נעשה תוכנה קטנה ב-C++ שרק מדפיסה Hello על המסך, זה כל מה שהיא עושה, אוקיי? ואנחנו רוצים שיהיה לנו אימג' רק עם התוכנת הלו.
עכשיו, בגלל שאנחנו לא בקורס C-Sharp, אז אנחנו נרשום פה שתי שורות בלבד. אחד אומרת להשתמש בספרייה מוכנה input-output stream, זו ספרייה שיודעת לקלוט נתונים ולשלוח אותם החוצה, קלט-פלט, זאת ספרייה חיצונית, וזו פונקציה שנקראת מיין,
והיא אומרת תפלוט החוצה סטנדרט output std, סטנדרט אאוטפוט, מילת הלו ושלושה סימני קריאה ותרד שורה. בוא נעשה עוד ירידת שורה שירד שתי שורות.
אוקיי, ותחזיר חזרה למי שהפעיל אותך אפס, כאילו שהכל תקין. זהו, זה כל התוכנה שלנו שרק מדפיצה על המסך מילת הלו בשפת C++. אנחנו עושים לזה סייב פייל סייב שומרים את זה וזהו.
אוקיי, עכשיו אני מקטין את זה ואנחנו חוזרים לתיקייה, אנחנו רואים שיש לנו פה קובץ הלו, אם נעשה דאבל קליק נפתח אותו נראה שזה הקובץ שלנו, אני עושה רייט קליק, אופן אין טרמינל.
זהו, אני עכשיו בטרמינל בתוך התיקייה שלי, עכשיו אני חייב להפוך אותה קודם כל לקובץ xc, כן, משפת c++ להפוך אותו לשפת מכונה, זה נקרא לעשות קומפייל, לקמפל אותה, ועושים את זה עם תוכנת קומפיילר g++, אני רואה שהקומפיילר לא מותקן אצלי, כן, למה צריך קומפיילר?
לכתוב בשפת מכונה ממש לא נוח אנחנו כותבים בשפה שנוחה לנו והופכים אותו לשפת מכונה זה מתרגם כזה אז אני מתקין אותו את הקומפיילר g++ יש הרבה קומפיילרים כן שיודעים להבין את הסינטקס את השפה של c++ או של c-sharp ולהפוך אותו לשפת מכונה עכשיו מאוד חשוב לציין שיש הבדל גדול בין שפת מכונה של לינוקס לשפת מכונה של נניח וינדוס
אז כשאני מקמפל אותו, אני הופך אותו לשפת מכונה שמערכת ההפעלה יודעת להבין. ומערכת ההפעלה של לינוקס, יש לה שפת מכונה משלה, זה פר מכונה, זה פר מערכת ההפעלה.
כי בסופו של דבר זה פקודות למערכת ההפעלה מה לבצע, כי בפועל מערכת ההפעלה היא היחידה שיכולה לגשת לתוך החומרה. זאת אומרת כל תוכנות אקזה, כל התוכנות שרצות, מבקשות ממערכת ההפעלה לעשות כל מיני פעולות עבורן.
אוקיי, אז יש לנו g++ יופי כבר לא כותב טעויות ואנחנו יכולים לעשות g++ Hello.cc לפני שאני עושה את זה אני רוצה להראות לכם שיש לי פה רק קובץ Hello אני עושה g++ Hello.cc הוא עשה לי ויש לנו קובץ a.out בואו נריץ אותו a.out נקודה סלאש a.out מה יש לו הנה a.out והנה הוא מדפיס
לי Hello אתם רואים זה עובד יפה מאוד. עכשיו אני פה בבעיה קטנה, קודם כל אני רוצה לשנות לו את השם, שלא יהיה ה-a.out אלא יהיה לו שם יותר יפה.
אנחנו רואים עוד פעם שמחקתי את ה-a.out ועכשיו אני אעשה את ה-g++ על כובש הלו ואני אתן לו או שיעשה לי עוד port, הלו.exe. אני רוצה שזה יהיה השם של הכובש, בסדר?
מה אכפת לכם שיהיה קובץ xc ככה אני אוהב לראות אותו אני יודע שהלו xc זה רק בווינדוס כן אבל ככה אני אוהב לראות אותו הנה יש לי הלו xc ואני יכול להריץ אותו אני יכול להריץ אותו והנה הוא עובד.
עכשיו מה הבעיה שלי אם אני אתיק אותו לתוך האימג' הרי הוא לא יעבוד למה כי יש לו תלות בספרייה חיצונית זוכרים הספרייה איו סטרים הזאת יש לו תלות בספרייה הזאת איו סטרים והוא בלעדיה לא יעבוד.
אנחנו יכולים גם לבדוק את זה, אני יכול לעשות ldd ולבדוק שקובץ hello.exe מה התלויות שלו ואני רואה ש ldd תלוי בכל הדברים האלו פה. את כל זה הוא צריך dynamic libraries, ספריות חיצוניות.
זה לא מתאים לי, אני רוצה שכל הספריות החיצוניות ייכנסו לתוך קובץ ה-XE. אז תראו, הקובץ עכשיו תופס 8776 קילו בייט, נכון?
ברגע שאני אכניס את כל הספריות הוא יגדל אז אני עושה כזה דבר אני עושה rm ל-hello.exe מחקתי אותו אנחנו רואים שהוא נמחק ועכשיו אני עושה עוד פעם gg++ -o.hello.exe זה האוטפוט מינוס static static אומר כל מה שהוא תלוי בו תכניס פנימה כל מה שצריך תכניס פנימה ועכשיו אני נותן את הקובץ מקור של c++ את הקובץ המקורי
שזה Hello CC. אם היה לי עוד קבצים, יכלתי גם להוסיף אותם. ואז עכשיו, אם אנחנו נבדוק, אנחנו נראה ש-hello.exe תופס, תראו כמה מקום.
שימו לב, היה 8,776, כשהוא נהיה בכלל היה 8,000 בתים, נהיה בכלל, מה זה? 3,6, נהיה מה זה? 2 מגה, נכון? קילו בייט מגה בייט, נהיה 2 מגה.
למה? כי הוא נהיה תלוי בזה, בקובץ, בכל הספרות החיצוניות. אנחנו יכולים לעשות ldd עוד פעם על hello.exe וכבר לראות ש- not a dynamic executable, כאילו אין לו תלויות דינמיות, הוא לא תלוי באף גורם חיצוני, אין לו שום תלות.
כאשר לפני כן עשינו ldd, אתם זוכרים, עשינו לפני כן ldd, ראינו שהוא תלוי בכל הספריות האלו, אבל אז הוא היה גם קטן. עכשיו, הנחת היסוד היא שהספריות האלו מותקנות בכל מחשב, וכל תוכנה לא צריכה שוב ושוב להתקין אותן.
בגלל שהאימג' משתמש אך ורק בקבצים הפנימיים שלו, והוא לא משתמש בקבצים הפיזיים של המחשב, הרי מהמחשב הפיזי הוא לוקח רק את מערכת ההפעלה, רק פניות למערכת ההפעלה.
אז עשיתי קובץ שכולל הכל, והוא שוקל, שימו לב, 2 קילו בייט מגה בייט, נכון? נכון, 2 מגה בייט. יופי, אז יש לנו קובץ HelloAXC מוכן, בשפת מכונה.
עכשיו צריך לעשות ממנו אימג'. איך אנחנו עושים אימג'? אתם זוכרים, אנחנו עושים קובץ חדש, קוראים לו dockerfile, נכון? dockerfile, זה השם ברירת מחדל.
כמובן שאפשר לעשות שם אחר, ואז בזמן ה-build אנחנו נצטרך לכתוב אותו. דרך אגב, פה הוא אומר שיש פה c++ extension, להתקין לנו סביבת c++ כדי שיהיה לנו קל לתכנת.
בואו נעשה לו install, שיתקין אותו. הלאה, עכשיו אנחנו בונים קובץ dockerfile, שימו לב, אנחנו ב- dockerfile, עד שהוא מתקין פה והפרום שלו יהיה משהו חדש פרום שלו יהיה סקראץ' סקראץ' זה כאילו שם של אימג' אבל בגדול זה מסמן לו להתחיל בלי שום אימג' להתחיל ריק לחלוטין להעתיק לשמה בקופי הלואו זה אותו דבר כמו קופי קובץ הלואו אקסי לתיקי הראשית שלו
ולעשות אנטרי פוינט כאילו אוטומט להעריץ איך שמריצים את האימג' HelloXE אם מישהו מפעיל את האימג' ישר תריץ את התוכנה הזאת יופי זה כל הסיפור אני עושה לזה save שמרתי אותו ctrl s אז זה כל האימג' שלנו בוא נעשה ll אנחנו רואים פה את הקובץ dockerfile שלנו אם נעשה cut dockerfile אנחנו נראה את התוכן שלו שזה למעשה השלוש שורות שלנו
אד אד ואנטרים פוינט יופי עכשיו אנחנו עושים בילד זוכרים איך עושים בילד דוקר בילד ונותנים לו איזשהו טאג הלו נקודה טיים לייטסט לא חייבים לכתוב לייטסט הוא יכתוב לבד איזשהו טאג ובאיזה תיקייה נמצאים כל הקבצים שלנו שקשורים דוקר פייל וכל מיני קבצים שצריך נקודה
שזה התיקייה השוטפת אנטר הנה הוא עשה לנו בילד שימו לב מה הוא עושה הוא יוצר לנו קונטיינר, עושה לו קומיט ואז מוחק את הקונטיינר. בואו נראה דוקר אימג'ס ויש לנו פה הלואו לייטסט שימו לב כמה הוא תופס 2 מגה, אתם רואים? הוא תופס רק 2.25
אתם זוכרים מה זה 2.25? זה זה, הנה שימו לב 2.25, אתם רואים? רק קובץ אחד יהיה שם, אוקיי? רק קובץ אחד יהיה שם, בואו נעשה דוקר ראן דוקר ראן, נראה שהוא באמת פועל דוקר ראן להלואו, אוקיי?
אנחנו מריצים אותו ואנחנו רואים שהוא מדפיס Hello ויוצא החוצה. התוכנה מסתיימת והקונטיינר יוצא החוצה. בואו ננסה לעשות מינוס אינטראקטיב, לא עוזר לי.
כי אין שם שום דבר אינטראקטיבי להתחבר אליו. זה שאני מתחבר אליו, בסוף התוכנה יוצאת והוא מתנתק. מינוס D, מפעיל אותו מאחורי הקלעים ואני לא רואה תוצאה.
לא רואה תוצאה כי הוא רץ מאחורי הקלעים. אוקיי, Run Hello, בבקשה. בואו נעשה דוקר PS, אנחנו רואים ששום דבר לא רץ כי הוא הסתיים ויצא.
PS-A אנחנו רואים את כל הדברים שהם בסטופ. אם אנחנו נעשה עכשיו docker ps-a-q נקבל רק את ה-IDs של אלו שהם בסטופ, ואם נעשה docker rm נמחק אותם, למחוק את כל מה שהפקודה היא נותנת.
עשינו docker ps-a-q אין לנו כלום, אין לנו שום אימג' הכל ריק. דבר אחרון שרציתי להראות לכם אם לא בא לכם כל פעם למחוק ככה אני כבר אמרתי את זה יכולנו לעשות מינוס מינוס rm זה אומר איך שאתה מריץ איך שאתה עובר למצב סטופ מינוס מינוס rm אומר שאם אתה עובר למצב סטופ תמחק את הקונטיינר
תמחק אותו אז הוא עבר למצב סטופ כי הוא הסתיים ואז ps מינוס a אין כלום מינוס a זה אומר גם אלו שהם במצב סטופ טוב זה כל מה שרציתי להראות לכם איך עושים קונטיינר ריק רק עם קובץ אחד ואני מזכיר לכם עשינו קובץ אחד בגודל שתיים וחצי ועשינו ממנו אימג' בגודל של שתיים וחצי, שימו לב זה אחד לאחד בתוך האימג' הזה יש רק קובץ
אחד שלנו ועשינו את זה על ידי from scratch זה הסורט שלנו אבל כמובן שאין בו את כל הספריות האחרות יש בו רק קובץ אחד ככה אני יכול ליצור למעשה אימג'ים משלי ריקים לחלוטין ולדחוף