מודול 1 · היסודות — שיעור 1 מתוך 6

דימוי ומכולה: מה באמת קורה

9 דקות קריאה

התחברו כדי שההתקדמות בקורס תישמר בחשבון.

הדימוי הוא המתכון, המכולה היא המנה

כשמריצים docker run nginx, קורים שני דברים שונים לגמרי. הראשון: מורידים דימוי — חבילה קפואה של מערכת קבצים ופקודת הפעלה. השני: נוצרת מכולה, תהליך שרץ במערכת שלכם אבל רואה רק את מערכת הקבצים של הדימוי.

ההבחנה הזו היא כל הקורס. דימוי הוא בלתי משתנה. מכולה היא זמנית. אם מחקתם מכולה, לא איבדתם את הדימוי; אם שיניתם דימוי, לא שיניתם מכולה שכבר רצה ממנו.

docker images          # הדימויים שקיימים אצלכם
docker ps -a           # כל המכולות, גם אלו שכבו
docker run --rm alpine echo "hello"   # מכולה שנוצרת ונמחקת

מה המכולה לא עושה

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

מכאן נובעות שתי השלכות מעשיות:

  1. מכולה רצה כל עוד התהליך הראשי שלה חי. אם התהליך יוצא — המכולה נגמרת. אין "מכולה חיה אבל ריקה".
  2. מה שלא נשמר במפורש — נעלם. כל קובץ שנכתב בתוך מערכת הקבצים של המכולה נמחק איתה, אלא אם הוא בכרך (volume) מפורש.

למה זה טוב לנו

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

טעות נפוצה: להריץ תהליך התקנה בתוך מכולה שכבר רצה (docker exec ... apt install). זה עובד עד שהמכולה נמחקת. כל מה שצריך להיות קבוע — שייך ל-Dockerfile.

תרגיל

הריצו docker run -it --rm alpine sh, ואז ls /. זה לא המחשב שלכם: זה שורש של מערכת קבצים אחרת. כתבו קובץ, צאו, הריצו שוב — הקובץ לא שם. זה כל ההבדל בין דימוי למכולה, ב-30 שניות.