מה זה Docker? הסבר פשוט + כמה משרות פתוחות בישראל
זמן קריאה: 6 דקות
Docker היא טכנולוגיה שאורזת אפליקציה יחד עם כל מה שהיא צריכה כדי לרוץ - ספריות, גרסאות, הגדרות - לחבילה אחת שרצה אותו דבר בכל מקום. זו התשובה המעשית ל"אצלי במחשב זה עובד". בלוח HiTakeJob פתוחות כרגע 68 משרות שמזכירות Docker ו-68 שמזכירות Kubernetes.
מה הבעיה שזה פתר
לפני קונטיינרים, העלאת אפליקציה לשרת פירושה היה להתקין עליו ידנית את גרסת השפה הנכונה, את הספריות ואת התלויות. שרת אחד קיבל עדכון ואחר לא; מפתח חדש בילה יומיים בהקמת סביבה; ותקלות "רק בייצור" נבעו מהפרש גרסה שאיש לא תיעד.
קונטיינר הופך את כל זה לקובץ תיאור אחד ששמור בגיט. מי שמריץ אותו מקבל בדיוק את אותה סביבה - במחשב, בשרת הבדיקות ובייצור. זהו גם מה שהפך פריסה אוטומטית לאפשרית בקנה מידה.
קונטיינר מול מכונה וירטואלית
| קונטיינר | מכונה וירטואלית | |
|---|---|---|
| מה מבודד | תהליכים, קבצים ורשת - על גבי אותו kernel | מערכת הפעלה שלמה |
| זמן עלייה | שניות | עשרות שניות עד דקות |
| נפח טיפוסי | עשרות עד מאות מגה-בייט | גיגה-בייטים |
| כמה רצים על שרת | עשרות | בודדים |
| רמת בידוד | טובה, אך חלשה יותר | חזקה |
ההבדל בשורה האחרונה חשוב ולא תמיד מוזכר: קונטיינרים חולקים את ה-kernel של המארח, ולכן הבידוד ביניהם חזק פחות מזה של מכונות וירטואליות. לרוב השימושים זה מספיק לחלוטין, אבל כשמריצים קוד לא מהימן של צד שלישי, זו שאלה שצריך להישאל.
איך בנוי image ולמה זה משנה
image נבנה משכבות: כל הוראה בקובץ הבנייה מייצרת שכבה חדשה שמונחת על הקודמת. השכבות נשמרות במטמון, ולכן סדר ההוראות משפיע ישירות על מהירות הבנייה.
- שכבה שלא השתנתה נלקחת מהמטמון - הבנייה מדלגת עליה.
- ברגע ששכבה אחת משתנה, כל מה שמעליה נבנה מחדש.
- לכן מעתיקים קודם את קובץ התלויות ומתקינים, ורק אחר כך מעתיקים את הקוד - כי הקוד משתנה בכל commit והתלויות לא.
- בנייה רב-שלבית מאפשרת לקמפל בשלב אחד ולהעביר רק את התוצר לשלב הסופי, בלי כלי הבנייה.
- קובץ התעלמות מונע העתקה של תיקיות ענק שאין בהן צורך.
הנקודה השלישית היא ההבדל בין בנייה של עשרים שניות לבנייה של חמש דקות, וזה מתורגם ישירות לכמה פעמים ביום הצוות מוכן לדחוף קוד.
מה נשבר בפועל
- שמירת קבצים בתוך הקונטיינר. כל מה שנכתב פנימה נעלם בפריסה הבאה. המקום לנתונים הוא אחסון חיצוני.
- שימוש בתג latest. אין דרך לדעת מה בדיוק רץ ואין לאן לחזור. תג גרסה מפורש הוא חובה.
- סודות בתוך ה-image. מפתח שהוכנס בזמן בנייה נשאר בשכבות גם אם נמחק אחר כך.
- הרצה כ-root. ברירת מחדל נוחה שמגדילה את הנזק האפשרי מפריצה.
- image ענק. תמונת בסיס מלאה במקום מינימלית מאטה כל משיכה ומגדילה שטח תקיפה.
- שעון ואזור זמן. קונטיינר שרץ ב-UTC בזמן שהאפליקציה מניחה שעון ישראל מייצר באגים שקשה לאתר.
הסעיף האחרון רלוונטי במיוחד כאן: מערכות שמחשבות ימי עסקים או שעות פעילות בישראל חייבות להגדיר אזור זמן במפורש ולא להסתמך על ברירת המחדל של הבסיס.
איך נראית סביבת פיתוח מקומית עם קונטיינרים
זה השימוש הראשון שרוב המפתחים נתקלים בו, והוא גם ההמחשה הטובה ביותר לערך. במקום להתקין על המחשב מסד נתונים, מטמון ותור הודעות - כל אחד בגרסה משלו ועם קונפליקטים בין פרויקטים - מגדירים קובץ אחד שמתאר את כל השירותים, ומרימים אותם בפקודה אחת.
- כל פרויקט מקבל את הגרסאות המדויקות שלו, בלי להתנגש עם פרויקט אחר במחשב.
- מפתח חדש מריץ פקודה אחת במקום לעבור על מסמך התקנה בן שני עמודים.
- אפשר למחוק הכול ולהתחיל נקי בשניות, וזה קריטי כשמנפים בעיות נתונים.
- אותן הגדרות משמשות גם את שרשרת הבדיקות האוטומטית, כך שסביבת הבדיקות זהה למקומית.
חשוב להבהיר: הקובץ הזה מיועד לפיתוח ולבדיקות ולא לייצור. בייצור משתמשים במערכת ניהול קונטיינרים אמיתית, שמטפלת ביתירות, בסקיילינג ובריפוי עצמי.
מה צריך לדעת בפועל
| נושא | למה זה נדרש |
|---|---|
| כתיבת קובץ בנייה | זה מה שמבקשים להראות בראיון |
| שכבות ומטמון | ההבדל בין בנייה מהירה לאיטית |
| נפחים ואחסון | איפה נשמרים נתונים שצריכים לשרוד |
| רשת בין קונטיינרים | איך שירותים מדברים זה עם זה |
| הרצת כמה שירותים יחד | סביבת פיתוח מקומית מלאה |
| מגבלות משאבים | מניעת מצב שבו שירות אחד חונק את השרת |
אפשר לראות את המשרות במשרות Docker, ואת השכבה שמנהלת קונטיינרים בקנה מידה במה זה Kubernetes.
איך מקטינים image ולמה זה משתלם
נפח אינו רק עניין של אחסון: image גדול נמשך לאט בכל פריסה, מאט את שרשרת הבנייה, ומכיל יותר חבילות שעלולות להיות פגיעות. שלוש פעולות שנותנות את רוב החיסכון - מעבר לתמונת בסיס מינימלית במקום הפצה מלאה, בנייה רב-שלבית שמשאירה רק את התוצר בלי המהדר וכלי הפיתוח, וניקוי מטמון ההתקנה באותה הוראה שבה התקינו. בפרויקטים טיפוסיים השלושה יחד מורידים מאות מגה-בייט, ובמערכת שנפרסת עשרות פעמים ביום זה מורגש מיד.
איפה זה מופיע מחוץ ל-DevOps
הטעות הנפוצה היא לחשוב שזה כלי של אנשי תשתית בלבד. בפועל הוא מופיע בשלושה הקשרים נוספים: מפתחים מריצים בעזרתו מסד נתונים מקומי בלי להתקין אותו על המחשב; צוותי דאטה אורזים בו סביבות Python עם גרסאות ספריות מדויקות, כדי שתוצאה תהיה ניתנת לשחזור; וצוותי בדיקות מקימים בעזרתו סביבה נקייה לכל ריצת בדיקות.
זו הסיבה שהוא מופיע ב-72 משרות ולא רק במשרות תשתית - וגם הסיבה שהיכרות בסיסית איתו נחשבת היום למובנת מאליה גם במשרות פיתוח, כפי שמפורט במה זה Backend.
שאלות נפוצות
מה ההבדל בין image לקונטיינר?
image הוא התבנית הקפואה - מה שנבנה ונשמר; קונטיינר הוא מופע רץ שלה. מאותו image אפשר להריץ עשרה קונטיינרים במקביל, וכל אחד מהם יקבל מערכת קבצים משלו שנמחקת כשהוא נעצר.
Docker מחליף מכונות וירטואליות?
לא לגמרי. ברוב המקרים קונטיינרים רצים בתוך מכונות וירטואליות בענן, כך שהשניים משלימים. מכונה נדרשת כשצריך בידוד חזק, מערכת הפעלה אחרת, או גישה לחומרה ברמה נמוכה.
צריך את זה גם אם לא עובדים ב-DevOps?
כן, ברמה בסיסית. מפתחים נדרשים היום להריץ סביבה מקומית, להבין למה בנייה נכשלה ולתקן קובץ בנייה. 72 משרות פעילות מזכירות אותו, וחלק ניכר מהן אינן משרות תשתית.
למה ה-image שלי כל כך גדול?
שלוש סיבות נפוצות: תמונת בסיס מלאה במקום מינימלית, כלי בנייה שנשארו בתוצר הסופי במקום בנייה רב-שלבית, וקבצים מיותרים שהועתקו כי לא הוגדר קובץ התעלמות. שלושתן ניתנות לתיקון בלי לגעת בקוד.
איך מריצים כמה שירותים יחד בפיתוח?
בעזרת קובץ הגדרה שמתאר את כל השירותים - אפליקציה, מסד נתונים, מטמון - ומרים אותם בפקודה אחת. זו הדרך המקובלת לסביבת פיתוח מקומית, והיא לא מיועדת לייצור.
מה ההבדל בין Docker לכלי קונטיינרים אחרים?
הפורמט של ה-image והממשק להרצה הם סטנדרט פתוח, ולכן image שנבנה בכלי אחד רץ בכלים אחרים. מערכות ניהול קונטיינרים בייצור לרוב אינן משתמשות ב-Docker עצמו כמנוע הרצה, אבל מריצות את אותם images ללא שינוי.
האם זה בטוח להריץ קוד לא מוכר בקונטיינר?
בטוח יותר מהרצה ישירה, אך לא מספיק כשמדובר בקוד עוין. הבידוד נשען על אותו kernel, ולכן לתרחישים כאלה משתמשים בשכבת בידוד חזקה יותר או במכונה נפרדת לחלוטין.