Docker מול מכונה וירטואלית - מה ההבדל, ומתי להשתמש בכל אחד¶
זו אחת השאלות הכי נפוצות של מי שמתחיל להיכנס לעולם התשתיות, וזה הגיוני - שניהם נשמעים כמו "להריץ מחשב בתוך מחשב". אבל הדמיון הזה מטעה. מכונה וירטואלית וקונטיינר פותרים בעיות דומות בשיטות שונות מאוד מבחינה טכנית, ולהבין את ההבדל הזה זה בדיוק מה שהופך אתכם ממישהו שמכיר מושגים למישהו שבאמת מבין תשתיות.
מכונה וירטואלית - מחשב שלם בתוך מחשב¶
מכונה וירטואלית (Virtual Machine, או VM) היא בדיוק מה שהשם שלה אומר - סימולציה מלאה של מחשב, כולל מערכת הפעלה משלה, שרצה בתוך מחשב פיזי אחר. תוכנה שנקראת Hypervisor (למשל VMware או VirtualBox) מדמה חומרה וירטואלית - מעבד, זיכרון, דיסק - ועל החומרה המדומה הזאת מותקנת מערכת הפעלה מלאה, בדיוק כאילו זה מחשב אמיתי.
זה אומר שאם המחשב הפיזי שלכם מריץ Windows, אתם יכולים להריץ עליו מכונה וירטואלית עם לינוקס, ובתוכה יש בעצם עותק שלם ונפרד לגמרי של מערכת הפעלה - עם הקרנל שלה, קבצי המערכת שלה, הכל. שתי המערכות מבודדות זו מזו לחלוטין, אבל המחיר הוא שכל מכונה וירטואלית "גוררת" איתה עותק שלם ומלא של מערכת הפעלה, עם כל המשקל שזה כולל.
קונטיינר - בידוד בלי לשכפל את מערכת ההפעלה¶
קונטיינר, כמו זה שDocker מריץ, עובד בשיטה חכמה יותר. במקום להריץ מערכת הפעלה שלמה בפני עצמה, הוא משתמש בקרנל של מערכת ההפעלה המארחת (host), ורק מבודד את התהליכים, הקבצים והרשת של האפליקציה שבתוכו. זה כמו לחלק דירה אחת לכמה יחידות סגורות, במקום לבנות בניין נפרד לכל דייר.
התוצאה היא שקונטיינרים נהיים קלים בצורה דרמטית. מכונה וירטואלית יכולה לשקול כמה גיגהבייט ולקחת דקות להיפתח. קונטיינר בדרך כלל שוקל עשרות או מאות מגה, ועולה תוך שניות. זה גם אומר שאפשר להריץ הרבה יותר קונטיינרים על אותה חומרה פיזית, בהשוואה למכונות וירטואליות.
אז מה עדיף - התשובה שאף אחד לא אוהב¶
"זה תלוי" זה תשובה מעצבנת, אבל היא נכונה כאן ממש. לכל טכנולוגיה יש את היתרון שלה, ובחברות אמיתיות לרוב תמצאו את שתיהן בשימוש במקביל, כל אחת למטרה שהיא הכי מתאימה לה.
מתי קונטיינרים הם הבחירה הנכונה:
- כשאתם רוצים להריץ הרבה אפליקציות קטנות ונפרדות בצורה יעילה וזולה.
- כשמהירות פריסה קריטית - קונטיינר עולה בשניות, לא בדקות.
- כשאתם בונים תשתית שצריכה להתרחב ולהצטמצם דינמית לפי עומס.
- כשהאפליקציות שלכם רצות בכל מקרה על אותה מערכת הפעלה (בדרך כלל לינוקס).
מתי מכונה וירטואלית עדיפה:
- כשצריך בידוד אבטחתי מלא ממש ברמת החומרה, למשל בסביבות רגישות במיוחד או אצל ספקי ענן עצמם שמריצים לקוחות שונים על אותה חומרה פיזית.
- כשצריך להריץ מערכת הפעלה שונה לגמרי ממערכת ההפעלה המארחת - למשל Windows על שרת לינוקס.
- כשעובדים עם תוכנה ישנה שדורשת סביבת מערכת הפעלה שלמה ומדויקת שלא ניתן לפרק לקונטיינר.
בפועל, גם ענני ה-AWS וה-Azure שאתם מריצים עליהם קונטיינרים, בבסיסם רצים על מכונות וירטואליות. אז שתי הטכנולוגיות לא באמת מתחרות זו בזו - הן שכבות שונות שיכולות לעבוד ביחד.
שגיאה נפוצה - "אז קונטיינר זה VM קליל"¶
זה תיאור נוח אבל לא מדויק, וכדאי לתקן אותו כי הוא יוצר בלבול. ההבדל הוא לא רק כמותי (פחות כבד), הוא איכותי - קונטיינר לא מדמה חומרה בכלל, הוא רק מבודד תהליכים בתוך אותה מערכת הפעלה. זו הסיבה שקונטיינר לינוקס לא יכול לרוץ ישירות על Windows בלי שכבת תיווך - כי הוא צריך את הקרנל של לינוקס בדיוק, לא רק "חומרה מדומה".
איך זה בא לידי ביטוי בעבודה אמיתית¶
מפתח backend בחברת הייטק ממוצעת יפגוש היום בעיקר קונטיינרים - כמעט כל אפליקציית שרת מודרנית ארוזה כקונטיינר, מנוהלת דרך כלים כמו Kubernetes, ורצה בענן. מכונות וירטואליות עדיין קיימות ומשמעותיות, בעיקר ברמת התשתית הבסיסית שמעליה כל זה רץ, אבל היומיום של רוב המפתחים היום מתרחש ברמת הקונטיינר.
בקורס צד-שרת שלנו אתם לומדים לעבוד עם קונטיינרים בפועל, כחלק מהבנה רחבה יותר של תשתיות ענן ו-DevOps.
קורס צד-שרת מלמד את כל זה צעד אחר צעד, בעברית, בחינם.
ואם ההבדל הזה עדיין קצת מעורפל לכם, בואו לשאול בקהילה - יש שם אנשים שישמחו להסביר עם דוגמאות מהשטח.
לסיכום¶
מכונה וירטואלית מדמה מחשב שלם, עם מערכת הפעלה נפרדת ומבודדת לגמרי. קונטיינר מבודד רק את מה שצריך, תוך שימוש משותף בקרנל של מערכת ההפעלה המארחת, ובזכות זה הוא הרבה יותר קל ומהיר. שתיהן פותרות בעיות בידוד, אבל בשכבות שונות ובמחירים שונים - ולכן שתיהן ימשיכו לחיות זו לצד זו בעולם התשתיות עוד הרבה זמן.