מושגים בסיסיים בדוקר: אימג'ים וקונטיינרים

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

1. מה זה דוקר

דוקר הוא פלטפורמת תוכנה שמאפשרת לבנות, לשתף ולהריץ יישומים בתוך מיכלים (Containers).

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

בלי דוקר אתם עלולים להיתקל במספר בעיות בעבודה עם מערכת כזאת. קודם כל בסביבת הפיתוח:

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

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

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

ובאותו האופן בשלב המעבר לייצור אתם עשויים להיתקל במספר בעיות:

  1. קושי להוסיף או להוריד "שרתים" מהרשת - מאחר וכל שרת צריך להחזיק את כל רכיבי התשתית כדי להריץ את המערכת.

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

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

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

2. ההבדל בין אימג'ים לקונטיינרים

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

קונטיינר הוא הפעלה של אימג' מסוים.

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

$ docker ps

בדיוק כמו שהפקודה ps מראה את כל התהליכים.

העבודה עם דוקר מחולקת לשני תהליכים מרכזיים:

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

  2. תהליך שני הוא הפעלת קונטיינר מתוך האימג' - אחרי שהשגנו אימג' (מחבר, מהרשת, או כי בנינו אחד לבד) אנחנו יכולים "להפשיר" אותו כלומר להריץ אותו בתור תוכנית על המחשב.

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


הרצאה מומלצת של אחד המייסדים של דוקר על הסיבות לפיתוח דוקר ומה המטרה של הכלי:

https://www.youtube.com/watch?v=3Kn6_b-1mK4