לדלג לתוכן

מה זה Docker, ולמה כל מפתח משתמש בו היום

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

הבעיה שDocker בא לפתור

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

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

אז מה זה בעצם קונטיינר

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

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

איך זה נראה בפועל

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

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

למה זה שינה את כל תעשיית התוכנה

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

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

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

האם צריך ללמוד את זה כמפתח רגיל

כן, בלי ספק. Docker הפך מכלי DevOps ייעודי לכלי בסיסי שכל מפתח נדרש לו, בדיוק כמו git. גם אם אתם לא מתכננים להתמחות בתשתיות, הסיכוי שתיתקלו ב-Dockerfile בעבודה הראשונה שלכם גבוה מאוד, ועדיף להגיע מוכנים.

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

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

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

הצטרפו לקהילה בדיסקורד

לסיכום

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