• בלוג
  • מה זה Docker ולמה מפתחים אוהבים אותו?

מה זה Docker ולמה מפתחים אוהבים אותו?

    מה זה Docker ולמה מפתחים אוהבים אותו?

    פורסם ב 17-02-2025

    information-security

    Docker הוא פלטפורמה ל"אריזה" של יישומים, בנייתם, ניהולם והרצתם בסביבה וירטואלית ומבודדת הנקראת "קונטיינר" (Container – מכולה).

    אבל מהם קונטיינרים?

    קונטיינרים הם "חבילות" או "קופסאות" המכילות בתוכן יישום, תוכנה, סקריפט וכדומה, בנוסף לכל ספריות הקבצים (Libraries) והתְּלוּיוֹת (Dependencies) הנחוצים לפעולתו הרציפה והתקינה. היישום בקונטיינר "יחשוב וירגיש" כאילו הוא נמצא בסביבה בה המפתח או המשתמש רוצים להשתמש בו. פעולה זו תתרחש ללא קשר למערכת ההפעלה עליה הקונטיינר ירוץ.

    דימוי? בבקשה:
    ניתן לדמות את הקונטיינר לאקוואריום מאובזר, ואת היישום לדג שאנו מגדלים באקוואריום. את המערכות בהן פועל הקונטיינר ניתן לדמות למקום בו נניח את האקוואריום. אין זה משנה אם נניח את האקוואריום במבואת הבניין (ווינדוס), במשרד (לינוקס), בחדר השינה (מאק) או בכל מקום אחר. הדג ייתנהג בהתאם לסביבה שניצור באקוואריום (ספריות הקבצים וההתְּלוּיוֹת).

    קונטיינרים משתמשים בטכנולוגיית וירטואליזציה ברמת מערכת ההפעלה כדי להתקיים (OS-Level virtualization). כלומר, ליבת מערכת ההפעלה (Kernel), המקשרת בין שכבות התוכנה והחומרה במערכת ההפעלה, מאפשרת לקונטיינרים (וכל דבר אחר שמשתמש ב-וירטואליזציה ברמת מערכת ההפעלה) להתקיים כ-מרחבי משתמש (חלקים בזיכרון המוקצים ע"י מערכת ההפעלה לתוכנות ולתהליכים) נפרדים. ליבת מערכת ההפעלה ומערכת ההפעלה עצמה יספקו לקונטיינרים (או למרחבי המשתמש הללו) רק מה שהם צריכים כדי שימשיכו "לחשוב" שהם מתקיימים איפה שהם חושבים שהם מתקיימים.

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

    היתרונות של קונטיינרים

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

    שימוש בקונטיינרים הוא בעל יתרונות ברורים, במיוחד למפתחים:

    צריכת משאבים נמוכה משמעותית

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

    הפחתת עלויות

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

    בידוד כמעט מלא אחד מהשני

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

    טעינה מהירה

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

    ניתנים להעברה בין מערכות

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

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

    לפתוח קונטיינר לינוקס על Windows באמצעות Docker.
    קונטיינר מבוסס לינוקס, על Windows, דרך Docker

    החסרונות של קונטיינרים

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

    אבטחה

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

    התמדה

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

    לא מתאים לכל יישום

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

    עכשיו, משהבנו מהם קונטיינרים..

    Docker

    Docker הוא כלי מומלץ לניהול, בנייה והפעלת קונטיינרים, הן למפתחים ולאנשי מקצוע והן למתחילים ולחובבנים.
    למעשה, לפי אתר 6sense, הוא מחזיק במעל ל-87% (!!!) מנתח השוק של הכלים והפלטפורמות לניהול קונטיינרים. בהמון מקרים הוא מוזכר באותה נשימה עם קונטיינרים, ולפעמים "מבלבלים" בינו לבין המונח "קונטיינר".

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

    הפלטפורמה של Docker מורכבת מכמה רכיבים בסיסיים:

    לקוח (Client)

    מערכת התקשורת העיקרית בינינו, המשתמש, לבין הדמון (Daemon), כלומר, בינינו לבין מה שמריץ את הקונטיינר עצמו. כאשר אנו מזינים פקודות, הלקוח "שולח" אותן לדמון, ש"מפעיל" את הקונטיינר. או, במילים אחרות, ממשק המשתמש.

    דמון (Daemon)

    "מנהל" פקודות בשמו של הלקוח ו"מפקח" על ביצוען לאחר שהתקבלו מהלקוח. הדמון אחראי גם על:

    • התקשורת של הקונטיינרים עם רכיבים רשתיים, תשתיתיים ורכיבים הכרחיים אחרים על המערכת
    • העברת המשאבים הדרושים מ-ליבת מערכת ההפעלה (Kernel)
    • התממשקות עם כלים צד-שלישי
    • אינטראקציה עם המִרשָׁמָה (Registry) בביצוע פקודות Push ו-Pull
    מִרשָׁמָה (Registry)

    מיקום נגיש (נגיד, שרת באינטרנט, שרת פרטי) בו ניתן לאחסן קונטיינרים ואימג'ים שיצרנו או לקבל כאלה שנוצרו על ידי אחרים.
    דוגמאות למִרשָׁמות ציבוריות:
    Docker Hub
    Amazon Elastic Container Registry (ECR)
    Azure Container Registry (ACR)
    Google Container Registry (GCR)

    מתוך Docker Hub.
    מתוך DockerHub
    תמונות מערכת (Images)

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

    קונטיינר (Container)

    נבנה באמצעות תמונת המערכת, מנוהל על ידי הדמון. מעין "חבילה" או "קופסה", מכיל בתוכו יישום, תוכנה, סקריפט וכדומה, בנוסף לכל ספריות הקבצים (Libraries) והתְּלוּיוֹת (Dependencies) הנחוצים לפעולתו הרציפה והתקינה.
    אם זה נשמע לכם מוכר, כנראה שקראתם את המאמר מההתחלה.

    רשת (Networking)

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

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

    יתרונות

    בנוסף לכל אלה, ולכל היתרונות ה"מובנים" מעצם השימוש בקונטיינרים, יש לו עוד כמה יתרונות:

    בניית תמונות מערכת

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

    תאימות

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

    ממשק פשוט

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

    חלק מהממשק של Docker.
    חלק מהממשק
    קוד פתוח

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

    קהילת תמיכה ענקית

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

    כלים

    בשל השימוש הנרחב שלו, ישנם עשרות כלים שפותחו כדי לתמוך בשימוש קל ויעיל יותר. חלקם יעילים במיוחד עבור מפתחים.

    חסרונות

    לכל כלי, גם היעיל ביותר, ישנם חסרונות מסויימים. חלקם נובעים מעצם פעולתו או מהפעולה לשמה הוא משמש, חלקם נובעים מהכרח מסויים (כמו החובה לחבוש קסדה כשרוכבים על אופנוע), וחלקם יחסיים ותלויים בצרכי המשתמש עצמו.

    משאבים

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

    ניטור

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

    תמיכה מוגבלת בקונטיינרים מבוססי Windows

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

    הקשר אלינו?

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

    השירותים שאנו מציעים כוללים:

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

    אבטחה: השרתים שלנו מאובטחים מכל כיוון. האבטחה כוללת חומות-אש מותאמות אישית, כלים מתקדמים לניהול הגישה לשרתים באופן מאובטח, הגנה מפני מתקפות שונות (כמו מתקפת מניעת שירות – DDoS), ועוד. בנוסף, ניתן להוסיף שרת חומת-אש לבחירתכם לטופולוגיית הרשת. השקט הנפשי שלכם חשוב לנו, ואנחנו רוצים שתוכלו לפתח בלי דאגות.

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

    גיבויים: ניתן לגבות קבצים באמצעות מנוע הגיבוי JetBackup, ולבצע גיבויי Snapshot על בסיס יומי.

    תמיכה: צוות ה-DevOps שלנו עומד לשירותכם, בנוסף לתמיכה טכנית בכל עת.

    לסיכום

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

    השותפים שלנו

    • js-partners-02
    • js-partners-03
    • nginx-js-partners-04
    • js-partners-06
    • mariadb-icon
    • docker-icon
    • nodejs
    Skip to content