המדריך המלא ל-Docker — השרת שלך בקופסאות
containers, docker-compose, והארכיטקטורה שמאפשרת רשת סוכנים ב-VPS אחד
Docker היא אחת הטכנולוגיות החשובות ביותר שצמחו בעולם התוכנה בעשור האחרון, והיא זו שמאפשרת לרוב שירותי הענן והסוכנים החכמים של היום לעבוד כמו שהם עובדים. בבסיסה, Docker פותרת בעיה פשוטה אבל כואבת: כל שירות תוכנה דורש סביבה מסוימת כדי לרוץ (גרסה מסוימת של שפה, ספריות ספציפיות, הגדרות רשת), וכשמנסים להתקין כמה שירותים על אותו שרת — הם מתנגשים, ומה שעבד אתמול מפסיק לעבוד מחר. Docker פותרת את זה באמצעות אריזה של כל שירות ל'קופסה' מבודדת משלו (באנגלית: container — קונטיינר), שמכילה את כל מה שהשירות צריך — וכך הוא רץ בדיוק אותו דבר על כל מחשב ובכל סביבה. ההרחבה של Docker שנקראת docker-compose מאפשרת להגדיר כמה קופסאות יחד בקובץ אחד, להרים את כולן בפקודה אחת ולנהל את הרשת ביניהן — ממש כמו מנצח תזמורת. אצלי (אלעד) כל רשת הסוכנים שמופיעה באתר הזה (עשרה שירותים שונים כמו Kami, Kaylee, Qdrant ו-Delegator) רצה בהתקנה אחת של docker-compose על Hetzner CPX11 בכ-4.75€ לחודש (2 vCPU · 2GB RAM). אצלכם, Docker יכולה להיות הבסיס לכל פרויקט: מסביבת פיתוח מקומית, דרך pipeline של CI/CD, ועד שירות ייצור מלא בענן. אחרי שמכירים את docker-compose, רוב מה שמוצג בשאר המדריכים הופך להיות אפשרי בעצמכם.
מה המדריך מכסה
מה זה Docker? התמונה המעשית
container אחד = שירות אחד, אטומי ומבודד
Docker היא מערכת הפעלה-על (container runtime) שמאפשרת לקחת תהליך תוכנה כלשהו יחד עם כל הסביבה שהוא צריך (גרסת שפה, ספריות, קבצי תצורה) ולארוז את הכל ל'קופסה' אחת סגורה וקטנה — שנקראת container (קונטיינר). הקונטיינר הזה רץ בדיוק אותו דבר אצלי (אלעד) על השרת ב-Hetzner, אצלכם על המחשב ובתוך GitHub Actions — כי הוא נושא איתו את כל מה שהוא צריך. מאחורי הקלעים Docker מנצלת מנגנונים של Linux (namespaces ו-cgroups) שמאפשרים בידוד ברמת הליבה, ולכן זה מרגיש כמו מכונה וירטואלית — אבל הרבה יותר קל ומהיר.
docker-compose: תזמור של כמה שירותים
קובץ YAML אחד שמגדיר את כל הרשת
docker-compose היא הרחבה של Docker שמטפלת בבעיה הטבעית הבאה: כשיש לכם יותר משירות אחד, להריץ כל קונטיינר ידנית בפקודה נפרדת הופך לכאב ראש. במקום זה, כותבים קובץ טקסט אחד בפורמט YAML (קובץ בשם `docker-compose.yml`) שמתאר את כל השירותים ברשת — איזה אימג' לכל אחד, לאילו תיקיות יש גישה, באילו פורטים הם מקשיבים ואפילו מי תלוי במי. מאז Compose v2 (שמובנה בתוך Docker עצמה כתוסף `compose` — אין צורך להתקין את הבינארי הישן `docker-compose` בנפרד) הפקודה היא `docker compose up -d` (עם רווח, לא מקף) — והיא מרימה את כולם יחד, בסדר הנכון, על אותה רשת פרטית. זה כמו מנצח של תזמורת שמקריא את התווים לכולם בו-זמנית.
רשתות ו-DNS פנימי
איך containers מדברים אחד עם השני
רשת Docker (network) היא רשת וירטואלית פרטית שנוצרת אוטומטית בתוך השרת, ומחברת את כל הקונטיינרים שרצים יחד בתוך אותו docker-compose. הקסם הוא שכל שירות זוכה לשם חוקי ברשת הזו — Kami יכול לפנות ל-Qdrant פשוט דרך `http://qdrant:6333`, כאילו המילה 'qdrant' היא כתובת שרת אמיתית. הדבר הזה נקרא Service Discovery (זיהוי שירותים), והוא חוסך מאיתנו את כל כאב הראש של הגדרת כתובות IP פנימיות או שרת DNS משלנו.
אחסון מתמיד: volumes ו-bind mounts
איפה שומרים state שלא ייעלם אחרי restart
מערכת הקבצים הפנימית של קונטיינר היא זמנית במהותה (ephemeral) — בכל אתחול של הקונטיינר היא נמחקת ונולדת מחדש נקייה לחלוטין. זה בכוונה: קונטיינר נועד להיות 'בר-החלפה' ולא לזכור דברים. אבל מה עם הדאטה שכן חייבת להישמר (בסיסי נתונים, לוגים, קבצי הגדרה)? כאן נכנסים שני מנגנונים: Volume (אחסון מנוהל על ידי Docker) ו-Bind Mount (חיבור ישיר של תיקייה מהשרת הפיזי אל תוך הקונטיינר). שניהם שומרים תוכן שחוצה את גבולות חיי הקונטיינר עצמו.
להריץ בייצור: אבטחה ו-reliability
מה חייבים להוסיף לפני שחושפים port 443
הרצה בייצור (production) היא המרחק בין 'זה עובד אצלי במחשב' ל'זה עובד 24/7 באינטרנט עם משתמשים אמיתיים'. בייצור Docker דורשת טיפול בשלושה צירים: אבטחה (לא להריץ כ-root, לשים מגבלות משאבים, לנהל סודות נכון), אמינות (בדיקות בריאות, מדיניות אתחול, ניטור) ופריסה (מערכת CI/CD, יכולת חזרה לגרסה קודמת). כל אחד מהם חיוני — והוויתור על אחד מהם גובה את המחיר ברגע הלא נכון.
ניפוי באגים: הכלים שחוסכים שעות
מה לעשות כש-container לא עולה
רוב הבעיות שתפגשו עם Docker הן לא באגים של Docker עצמה — אלא הגדרה לא נכונה של נפחים (volumes), רשתות (networks) או משתני סביבה. החדשות הטובות: יש רצף בדיקות מסודר שפותר בערך 80% מהמקרים תוך כמה דקות. אצלי (אלעד), אחרי שנים של עבודה עם Docker, פיתחתי שגרה קבועה שמתחילה תמיד מאותה פקודה ומתקדמת הלאה רק אם צריך.

