מה כדאי לסטודנט לדעת - Docker

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

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

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

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

מקווה שעד סוף הפוסט תבינו את הקשר ותבינו למה כל פוסט על Docker חייב לכלול תמונה של מכולות.

אז, מה זה Docker?

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

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

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

כלומר, Docker לא מקבל מהמחשב כמות קבועה של זכרון ודיסק, אלא הוא תהליך של מערכת ההפעלה, וככזה, מערכת ההפעלה מקצה לו משאבים על פי הצורך. אבל בשונה מתהליך רגיל, הContainer (מופע של Docker) יוצר לעצמו סביבה חדשה של מערכת ההפעלה. זאת אומרת שהוא יקבל תיקייה מסוימת אצלנו במחשב, אבל ימפה אותה אצלו כC:\ProgramFiles, למשל. כך, הוא משתמש במערכת הקבצים ובשאר המשאבים כמו תהליך רגיל, אבל התוכנות שרצות בתוכו מתנהגות כאילו הם במערכת אחרת לגמרי.

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

למה זה מועיל

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

לכן, אני אתן כמה מקרים שבהם ניתן לראות את היתרונות של Docker:

  • סביבה אחידה:
    כאשר אנחנו כותבים תוכנה, הרבה פעמים יש לה תלויות שנדרשות, כמו מסד נתונים מותקן, מערכת הפעלה מסוימת, גרסת סביבת ההרצה וכד'. אם אנחנו מספקים Dockerfile, שהוא קובץ שמגדיר לDocker איך לבנות את הסביבה, כל מי שמריץ את התוכנה לא יצטרך להתמודד עם הדרישות הללו.
    זה משפיע על המתכנתים, שכשהם בודקים את הקוד שהם כתבו, הם יודעים שהם לא מסתמכים על דברים שנמצאים רק בסביבת העבודה שלהם.
    בנוסף, זה משפיע על הבדיקות, כך שכדי לתמוך בגרסאות שונות של מסדי נתונים וכד', כל מה שצריך לעשות הוא להגדיר Dockerים עבור כל מקרה, ולהריץ את אותה בדיקה כל פעם בסביבה אחרת.
    וכמובן, הלקוחות, ברמה כזאת שאם התוכנה שלנו רצה על לינוקס, הלקוח יכול להשתמש בDocker כדי להריץ תוכנות לינוקס על שרתי Windows שיש לו בחברה, והוא לא צריך להתעסק בהקמת סביבה תומכת לתוכנה וכל מיני תוכנות צד שלישי שנדרשות, כי הכל מסופק לו בקובץ הDocker יחד עם התוכנה.
  • הקצאת משאבים לפי צורך:
    בגלל שההרצה של Docker היא בעצם תהליך של מערכת ההפעלה, מערכת ההפעלה מקצה לו משאבים בהתאם לצורך ולעומס על מערכת ההפעלה.
    נניח שיש לנו למשל אתר שצורך 4GB RAM ביום, חוץ מפעם בשבוע כשיש מבצע באתר, ואז הוא צורך 8GB RAM. אם היינו מאחסנים אותו במכונה וירטואלית בענן, היינו צריכים להקצות לו מראש את כמות הRAM המקסימלית שהוא דורש. אבל מכיוון שאנחנו מריצים אותו מעל Docker, נוכל להגדיר לשירות הענן שכאשר יש עומס, רק אז יקצה עוד משאבים.
    מקרה דומה הוא בעולם הMicroservices, כאשר יש לנו שירות שמבצע פעולה מסוימת, למשל הורדה של המון נתונים ממקום מרוחק כלשהו. השירות מוריד את הנתונים לתוך תיקייה בדיסק. כאשר אנחנו משתמשים בDocker, ומגיעים למצב שהשירות לא עומד בעומס, נוכל בקלות להרים עוד מופע של השירות, ולא תהיה התנגשות מכיוון שכל המופעים מורידים את המידע לאותה תיקייה, אבל כל אחד מהם הוא סביבה נפרדת, אז אלו לא באמת אותם תיקיות שבשרת.

מקורות:

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