- להסביר במילים פשוטות למה אפליקציה רצה על הלפטופ ונשברת על שרת — ולמפות את שלושת הגורמים העיקריים: גרסת שפה, dependency חסר, ו-OS שונה.
- להבחין בין container (תהליך רץ שמשתף את ה-kernel של המארח) לבין Virtual Machine (מכונה וירטואלית שמריצה OS אורח שלם) — לפי שיתוף ה-kernel, גודל ה-image, וזמן הרצה.
- להבחין בין image (המתכון הקפוא, read-only) לבין container (מופע רץ של ה-image) — ולקבוע איזו פקודה יוצרת מה (
docker buildמייצר image,docker runמתחיל container). - לתחום במדויק מה Vibe Coder צריך מ-Docker (לארוז אפליקציה אחת ולהריץ בכל מקום) ומה נשאר מחוץ ל-scope (Kubernetes, Swarm, orchestration מורכב) — ולנמק את הגבול.
- פרקים קודמים: אין — זה הפרק הראשון בקורס.
- מה תצטרכו: אפליקציה אחת שה-AI בנה לכם ורצה על הלפטופ (Next.js, Flask, FastAPI, Express, Streamlit — משהו שעובד עם
npm run devאוpython app.py), נוחות בסיסית ב-Terminal (הרצת פקודות, ניווט בין תיקיות, עריכת קובץ טקסט), ויכולת לקרוא קוד בסיסי. - זמן משוער: 60-75 דקות קריאה ותרגול.
לאורך 6 הפרקים של הקורס, אתם הופכים את האפליקציה שה-AI בנה לכם — web app + מסד נתונים — ל-container שרץ זהה בכל מקום: על הלפטופ שלכם, על מחשב של חבר, על VPS, או דרך Coolify עם HTTPS. בפרק הזה: אתם סוגרים את הפער התפיסתי — מבינים למה "רץ אצלי" שבור, מה Docker בעצם עושה, ומה אתם צריכים ממנו (ומה לא). בלי הבסיס הזה, כל פקודה בפרקים הבאים תרגיש אקראית.
מה הלאה: בפרק 2 (התקנה והרצה ראשונה) נתקין את Docker Desktop, נריץ container ראשון מ-image קיים, ונחבר אותו ל-browser דרך port mapping. תוך 20 דקות תראו בעיניים את ההפרש בין "מורידים הוראות התקנה" לבין "מריצים container".
'רץ אצלי במחשב' — הבעיה האמיתית
תרחיש שכל מי שעבד או עבדה עם AI על אפליקציה מכיר/ה: בלפטופ הקוד רץ. npm run dev עולה בשנייה, הדף ב-localhost:3000 נטען, ה-API מחזיר תשובות. הכל ירוק. עכשיו אתם רוצים להעלות את זה לאוויר — ל-VPS של ארבעה דולר בחודש, או לשלוח לחבר שיראה על מה עבדתם. ופתאום:
- גרסת Node לא מתאימה. על הלפטופ שלכם יש Node 20, על ה-VPS יש Node 18 מה-image הדיפולטי של Ubuntu 22.04.
Module not foundעל חבילה שדורשת Node 20+. האפליקציה לא עולה. - dependency חסר. ה-AI יצר
requirements.txt(פייתון) אוpackage.json(Node), אבל שכח חבילה אחת. או שהוסיף חבילה שלא תועדה. על הלפטופ שלכם זה עובד כי ההתקנה הידנית שעשיתם אתמול בלילה נשארה ב-node_modulesהמקומי, וכלום לא תיעד אותה. ברגע שעולים למכונה נקייה — קריסה. - OS שונה. האפליקציה שלכם רצה על macOS. חבר פתח את הריפו על Windows — וקיבל שגיאות על סלאשים בנתיבים (
/מול\), על line endings (\r\nמול\n), או על ספרייתlibשלמה שלא נטענת על Windows בלי WSL. - סוד שנחשף. מסתבר שה-AI הטמיע את ה-API key שלכם ישירות בקוד. עכשיו הוא ב-
.envשדחפתם ל-Git, וגם ייכנס ל-image של ה-VPS. זה לא רק "לא מקצועי" — זה חור אבטחה שאפשר לסרוק אוטומטית.
אלה לא תרחישים היפותטיים. זה המצב ברוב האפליקציות ש-AI בונה. והסיבה שזה קורה היא לא באג ב-AI — זה הפער המבני בין "הקוד רץ אצלי" לבין "הקוד רץ בכל מקום". Docker הוא הכלי שסוגר את הפער הזה — לא בכוח brute force של "תתקין את כל הגרסאות", אלא בכך שהוא אורז את האפליקציה כולה — קוד, גרסת שפה, dependencies, קונפיגורציה — ליחידה אחת ניידת.
ההבטחה של Docker בשפה פשוטה
אם הייתי צריך לסכם את Docker בשני משפטים: Docker לוקח את האפליקציה שלכם ואת כל מה שהיא צריכה כדי לרוץ, אורז את זה לקופסה אחת, ומבטיח שהקופסה הזו תרוץ באותה צורה בכל מקום — על הלפטופ שלכם, על מחשב של חבר, על שרת, או בענן. לא משנה מה ה-OS, מה הגרסה, מה הקונפיגורציה המקומית. אותה קופסה, אותה תוצאה.
זה הופך "works on my machine" — הבדיחה הכי ישנה בהנדסת תוכנה — ממשפט שמסתיר בעיה לעובדה מוגמרת: "works on every machine". וב-2026, עם הכמות של אפליקציות ש-AI בונה לבד, זה הפך מבדיחה לסטנדרט.
שלושת הכשלים של אפליקציות AI במספרים
לפני שמדברים על פתרון, צריך להבין את הבעיה במספרים. כל אפליקציה ש-AI בונה סובלת מאותו סט של כשלים סביבתיים — והמספרים מפתיעים:
1. ~82% התנגשויות dependencies
מחקרים של קהילת vibe-coding ו-2026 practical reports (כולל vibe-to-docker style guides) מראים ש-82% מהאפליקציות ש-AI בונה סובלות מהתנגשויות dependencies — חבילה שדורשת גרסה X של ספרייה, בזמן שחבילה אחרת דורשת גרסה Y. על הלפטופ שלכם זה עובד כי ה-AI ניסה, ראה שזה עובד, ושמר את ה-package-lock.json עם הגרסאות הנכונות. אבל ברגע שמנסים להעתיק את הריפו למכונה אחרת — או לבנות image מה-Dockerfile שאותו AI יצר — הקסם נשבר.
2. 60-70% אי-התאמת סביבה
60-70% מהאפליקציות נופלות בגלל אי-התאמת סביבה — גרסת Node/Python שונה, משתנה סביבה חסר (DATABASE_URL שלא הועבר), או ספריית מערכת (system library) שלא קיימת ב-VPS. זה הכשל הכי שקט: על הלפטופ שלכם npm install עובד כי הספרייה כבר מותקנת, ואף אחד לא תיעד את זה ב-package.json. ב-VPS — node: cannot open shared object file או libpython not found.
3. 48% סודות מקובעים בקוד
והנתון המפתיע ביותר: 48% מהאפליקציות ש-AI בונה מכילות סודות מקובעים (hardcoded secrets) — API keys, passwords, connection strings — שנכתבו ישירות בקוד, הוכנסו ל-Git, ועכשיו גלויים לכל מי שיש לו גישה לריפו. זה הכשל הכי מסוכן מבין השלושה, כי הוא לא רק גורם לקריסה — הוא גורם לדליפה. ה-API key שלכם ל-OpenAI או ל-Stripe עלול להיחשף תוך שעות.
בדיוק מה ש-Docker סוגר
שלושת הכשלים האלה הם בדיוק מה ש-Docker נועד לפתור — כל אחד מהם בצורה שונה:
- התנגשויות dependencies: ה-image הקפוא כולל בדיוק את הגרסאות שעבדו. אין הפתעות. אם ה-image רץ על הלפטופ שלכם, הוא ירוץ באותה צורה בכל מקום.
- אי-התאמת סביבה: ה-image כולל את כל מה שהאפליקציה צריכה — מערכת הפעלה מינימלית, ספריות מערכת, גרסת שפה, dependencies. מכונת היעד לא צריכה לספק שום דבר מלבד יכולת להריץ container.
- סודות מקובעים: Docker נותן כלי להעביר סודות בruntime (כשה-container רץ) — לא בזמן הבנייה. זה הופך את "סוד בתוך ה-image" מהנורמה לחריגה.
אם אתם עובדים עם AI על אפליקציות, תוך 6 פרקים תלמדו לעקוף את שלושת הכשלים האלה בצורה מכנית. הבסיס מתחיל כאן.
container מול Virtual Machine — למה זה משנה לכם
הרבה אנשים שמתחילים עם Docker חושבים שהוא "Virtual Machine קל". זו אחת הטעויות הראשונות שמייצרות בלבול, ולכן חשוב לסגור אותה כאן.
מה זה Virtual Machine (VM)
מכונה וירטואלית היא בעצם מחשב שלם שרץ בתוך המחשב שלכם — עם מערכת הפעלה אורחת משלה (guest OS): Ubuntu על Windows, או Red Hat על Mac. כדי להריץ VM צריך שכבה שנקראת hypervisor (כמו VirtualBox, VMware, או Hyper-V), שמדמה חומרה וירטואלית ל-OS האורח. ה-OS האורח לא יודע שהוא "בתוך" משהו; הוא חושב שהוא מחשב אמיתי. בגלל זה כל VM:
- שוקל גיגה-בייטים (3-10 GB בלי קוד, הרבה יותר עם אפליקציה) — בגלל שהוא כולל OS שלם.
- עולה בדקות (30 שניות עד 5 דקות) — בגלל שצריך לאתחל את כל ה-OS.
- מבודד לחלוטין — אם תקלקל משהו ב-VM, המכונה המארחת לא מושפעת, ולהפך.
מה זה container
container, לעומת זאת, חולק את ה-kernel של מערכת ההפעלה המארחת. ה-kernel (הליבה של ה-OS — מה שמדבר עם החומרה) הוא של המכונה שעליה רץ ה-container. מה שבתוך ה-container זה רק שכבה דקה של מערכת הפעלה (root filesystem) + האפליקציה + ה-dependencies שלה. בגלל זה כל container:
- שוקל מגה-בייטים (10-500 MB) — בגלל שאין בו OS שלם.
- עולה בשניות (50-500 אלפיות שנייה עד שתיים-שלוש שניות) — בגלל שאין אתחול OS.
- מבודד ברמת תהליך — אם תקלקלו container, הוא נופל; המכונה המארחת ו-containers אחרים לא נפגעים. הבידוד קל יותר מ-VM, אבל מספיק בשביל 99% מהצרכים של אפליקציה אחת.
ההשוואה בטבלה
הנה ההבדל במבט-על:
| מאפיין | Virtual Machine | container |
|---|---|---|
| גודל | GB (3-10 GB ומעלה) | MB (10-500 MB) |
| זמן הרצה | דקות (30 שנייה עד 5 דקות) | שניות (אלפיות שנייה עד 2-3 שניות) |
| מערכת הפעלה | OS אורח שלם (Ubuntu, Red Hat, Windows) | שיתוף kernel של המארח; רק rootfs דק |
| ריצוץ (density) | 10-15 VMs על שרת בינוני | 100-200 containers על אותו שרת |
| שימוש טיפוסי | הפרדה חזקה, legacy, סביבות מעורבות | אפליקציות מודרניות, microservices, CI/CD |
| הרצה על לפטופ | דורשת זיכרון רב ומעבד חזק | רץ בקלות גם על מחשב ישן |
למה זה משנה ל-Vibe Coder
המספר שכדאי לזכור: אותו שרת שמחזיק 10-15 VMs מחזיק 100-200 containers. זה לא תאוריה — זה המצב בפועל. ב-VPS של 4-6 דולר בחודש (Hetzner, DigitalOcean, Vultr, Contabo), אתם יכולים להריץ את האפליקציה שלכם + מסד נתונים + cache (Redis) + reverse proxy — הכל בתוך containers נפרדים, על אותה מכונה. אם הייתם צריכים VM לכל אחד מהם, הייתם צריכים 3 שרתים. זה ההבדל בין $4 לחודש לבין $20 לחודש — רק בגלל הארכיטקטורה.
בנוסף, containers זולים יותר בזיכרון. הם לא מריצים OS כפול, הם לא טוענים kernel נפרד, הם לא צריכים hypervisor. זה אומר שאתם יכולים לפתח ולבדוק את האפליקציה על הלפטופ שלכם, בלי לחימום המחשב ובלי לחכות דקה ל-boot של VM.
ברגע שההבחנה הזו ברורה, רוב הפחד מ-Docker נמוג: זה לא "מכונה וירטואלית שצריך להגדיר", זה תהליך שמקבל מעטפת קלה ומובטחת. בפרק 2 תראו את זה בעיניים: container של nginx (שרת web פשוט) עולה בפחות משתי שניות, ומגיש דף ב-browser תוך שלוש.
image מול container — ההבחנה שמסדרת את כל הקורס
אם הייתי צריך לבחור רק הבחנה אחת שתישאר איתכם לכל 6 הפרקים, זאת היא: image ≠ container. שני המושגים האלה נשמעים דומים, הם מופיעים באותו תחום, ורוב האנשים מערבבים ביניהם. ברגע שתנעלו את ההבחנה, כל פקודה בהמשך תהיה הגיונית.
image = המתכון הקפוא
image הוא קובץ קפוא, read-only (לקריאה בלבד), שמכיל את כל מה שצריך כדי להריץ את האפליקציה שלכם: מערכת הפעלה בסיסית (למשל Alpine Linux או Debian slim), גרסת שפה (Node 20, Python 3.11), dependencies מותקנים, קוד האפליקציה עצמו, והגדרות ברירת-מחדל. ה-image הוא בדיוק כמו קובץ התקנה של תוכנה (חושבים על .dmg במק או .exe בחלונות) — קובץ סטטי שאפשר לשמור, להעתיק, להעלות, להוריד.
הוא נוצר פעם אחת, מ-Dockerfile (קובץ טקסט של הוראות בנייה — נלמד בפרק 3), על-ידי הפקודה docker build. אחרי שהוא נוצר, הוא לא משתנה. אי אפשר "לערוך" image; אפשר רק לבנות גרסה חדשה ולשמור את הישנה.
container = התבשיל הרץ
container הוא מופע רץ של image. כשאתם כותבים docker run myapp:latest, Docker לוקח את ה-image של myapp, יוצר ממנו שכבת כתיבה דקה (writable layer) מעליו, ומריץ את התהליך הראשי שלו. זה ה-container.
מ-image אחד אפשר להריץ כמה containers שרוצים, במקביל. כל אחד מהם מקבל מקום משלו בזיכרון, ב-CPU, ברשת. הם לא רואים את הקבצים של השני (אלא אם כן מחברים ביניהם ב-volume או network — נלמד בפרק 4).
אפשר להריץ, לעצור, למחוק container בלי לפגוע ב-image. זה כמו להריץ תוכנה ולסגור אותה: התוכנה עדיין מותקנת, אבל המופע הספציפי שלה נעלם. אם תמחקו container, ה-image נשאר. אם תמחקו image, כל ה-containers שנוצרו ממנו מאבדים את הבסיס שלהם (אלא אם כן דחפתם את ה-image ל-registry קודם).
טבלת ההשוואה המסכמת
| image | container |
|---|---|
| קובץ קפוא, read-only | מופע רץ, עם שכבת כתיבה |
נוצר על-ידי docker build |
נוצר על-ידי docker run |
| אפשר לשמור, להעתיק, לדחוף ל-registry | חי עד שמכבים או מוחקים |
| מכיל: OS + שפה + deps + קוד | מריץ תהליך אחד (או יותר) מהקוד שב-image |
| אנלוגיה: מתכון בספר בישול | אנלוגיה: התבשיל הרותח במחבת |
למה ההבחנה הזו קריטית לקורס
בפרק 3 תלמדו docker build — זה יוצר image. בפרק 3 גם תלמדו docker run — זה יוצר container. בפרק 5 תכתבו compose.yaml שמגדיר כמה services (כלומר: כמה containers שרצים ביחד). בפרק 6 תדחפו image ל-registry ותמשכו אותו על שרת. אם תבלבלו בין המושגים, כל פקודה תרגיש כמו כישוף. אם ההבחנה ברורה, הכל מתיישר.
הסימן הראשון שמישהו מתבלבל: הוא אומר "הרצתי image של postgres" כשהוא בעצם הריץ container. או "מחקתי את ה-image הזה" כשהוא בעצם עצר container. שימו לב לעצמכם. תרגישו נוח לחזור לסעיף הזה בכל פעם שמשהו לא מסתדר.
האנלוגיה שתישאר לכם — class ו-instance
אם אתם מכירים תכנות, ההבחנה הזו דומה מאוד ל-class מול instance: ה-image הוא ה-class (ההגדרה, התוכנית), ה-container הוא ה-instance (האובייקט החי בזיכרון). אפשר ליצור מ-class אחד כמה instances. שינוי ב-instance לא משפיע על ה-class. מחיקת instance לא מוחקת את ה-class.
אם אתם לא מכירים תכנות, הנה אנלוגיה שעובדת לכולם: ה-image הוא כמו תבנית אפייה (קאקל). התבנית עצמה היא לא עוגה. היא קפואה, לא רואים אותה במקרר. אבל ברגע שלוקחים תבנית, שופכים בצק, ושולחים לתנור — יוצאת עוגה. זה ה-container: תהליך חי, רץ, שאפשר לאכול (או להפעיל). אפשר להשתמש באותה תבנית כמה פעמים — כל פעם עוגה אחרת. אם העוגה נשרפה, זורקים אותה — התבנית נשארת שלמה לעוגה הבאה.
או באנלוגיה קרובה יותר לעולם התוכנה: image = קובץ התקנה צרוב (.iso, .dmg), container = התוכנה שרצה אחרי שהתקנתם אותה. את קובץ ההתקנה אתם שומרים במחסן; את התוכנה אתם מריצים, סוגרים, ומריצים שוב. מחיקת התוכנה לא מוחקת את קובץ ההתקנה.
העוגן המנטלי הזה יעזור לכם בכל פעם שתתבלבלו: "אני בונה image? או מריץ container? מה אני עושה עכשיו?"
איזו פקודה עושה מה — היכרות בלי להריץ
בפרק 2 נריץ פקודות. בפרק 3 נריץ הרבה יותר. אבל כבר עכשיו שווה להכיר את שתי הפקודות הבסיסיות שתשתמשו בהן יותר מכל:
docker build — מייצר image
docker build לוקחת Dockerfile (קובץ טקסט שמכיל הוראות בנייה) ויוצרת ממנו image. ה-image נשמר במחסן המקומי של Docker על המכונה שלכם. בסוף הבנייה תקבלו image עם "tag" (תווית), למשל myapp:v1 או myapp:latest. ה-tag הוא בעצם השם שאתם נותנים ל-image, והוא מה שתצטטו אחר כך כשתריצו container.
בפרק 3 תכתבו Dockerfile בפעם הראשונה, ותראו איך docker build -t myapp:v1 . הופך 20 שורות של הוראות ל-image בגודל 200 MB שאפשר להריץ בכל מקום.
docker run — מתחיל container
docker run לוקחת image (או מושכת אותו מ-registry אם הוא לא מקומי) ויוצרת ממנו container רץ. ברירת המחדל: רץ ב-foreground, מדפיס את הפלט שלו לטרמינל שלכם, ונחסם עד שה-container יסתיים. אפשר להריץ ברקע (-d, מ-detach), לחבר פורטים (-p 8080:80), להעביר משתני סביבה (-e KEY=value), ועוד.
הדוגמה הכי קלאסית להראות את Docker עובד בפעם הראשונה: docker run -p 8080:80 nginx. זה אומר ל-Docker "תמשוך את ה-image של nginx מ-Docker Hub (אם עוד לא משכת), תיצור ממנו container, ותחבר את פורט 8080 במכונה שלי לפורט 80 בתוך ה-container". תוך שלוש שניות, אתם פותחים http://localhost:8080 בדפדפן ורואים את דף הברירת-מחדל של nginx. זה הרגע שבו "Docker" הופך ממילה מפחידה למשהו שרץ לכם מול העיניים. פרק 2 יוקדש כולו לרגע הזה.
הפקודות שתכירו בהמשך (לתזכורת)
רק כדי שתרגישו את ההיקף — בקורס הזה תפגשו את כל הפקודות האלה, ועוד:
docker ps/docker ps -a— רשימת containers רצים / כולל עצורים.docker logs <id>— הפלט של container (logs).docker stop/docker rm— עצירה ומחיקה.docker exec -it <id> sh— כניסה לתוך container רץ עם shell.docker compose up— הרצת מספר containers יחד מקובץ compose.yaml.docker push/docker pull— העלאה ל-registry / הורדה ממנו.
בפרק 2 נלמד את הראשונות מתוכן. בפרק 5 את המרכזית של הקבוצה (compose). בפרק 6 את ההעלאה ל-registry. אין צורך לשנן עכשיו — רק לדעת שהפקודות האלה קיימות ושיש לכן סדר הגיוני.
OCI — התקן הפתוח שהופך את ה-image לנייד
אחת השאלות הכי טבעיות אחרי "מה זה image" היא: "למה ה-image שלי ירוץ בכל מקום, ולא רק ב-Docker?" התשובה היא OCI — Open Container Initiative.
OCI הוא תקן פתוח (כמו HTML או PDF) שמגדיר איך image נראה ואיך runtime של container צריך להריץ אותו. הוא נוצר ב-2015 על-ידי Docker ושותפים (CoreOS, Red Hat, Google, Microsoft ועוד), ומאז הוא הסטנדרד של כל כלי ה-container המודרני: Docker, Podman, containerd, CRI-O, ועוד. זה אומר שכלי אחד יכול לבנות image, וכלי אחר לחלוטין יכול להריץ אותו.
ההשלכה המעשית: אתם לא נעולים על Docker. ה-image שלכם ירוץ גם על Podman (חלופה daemonless), גם על containerd (רכיב הליבה של Kubernetes), גם על כל ענן שתעלו אליו. זו לא טכנולוגיה קניינית של Docker; זה תקן בינלאומי.
ב-2026, אחרי שה-OCI התבסס, בנייה של multi-platform image (אותו image שרץ גם על Mac שלכם עם שבב M-series וגם על VPS עם מעבד amd64) היא פעולה סטנדרטית, לא תכנון מוקדם. תוצר הלוואי היחיד שכדאי להכיר: המונח OCI manifest list — רשימה של גרסאות ה-image לארכיטקטורות שונות, שה-registry שומר ושהמכונה המושכת בוחרת ממנה אוטומטית. זה מה שמאפשר לכם לדחוף image אחד שעובד בכל מקום. נחזור לזה לעומק בפרק 6.
registry — הגשר מהלפטופ לשרת
עד עכשיו דיברנו על המכונה המקומית שלכם. אבל ההבטחה האמיתית של Docker היא "רץ בכל מקום" — וה-"בכל מקום" הזה כולל גם שרתים. איך מעבירים image מהלפטופ לשרת? באמצעות registry — מחסן של images ברשת.
registry הוא בעצם GitHub של images: שרת מרכזי שאליו אתם דוחפים (docker push) וממנו אתם מושכים (docker pull). כל מכונה שיש לה Docker יכולה לדבר עם registry: לדחוף, למשוך, להריץ.
שני registries שתכירו
יש שני registries שכדאי להכיר כבר עכשיו, כי הם הרלוונטיים ביותר ל-Vibe Coder:
- Docker Hub (
docker.io) — ה-registry הציבורי הגדול בעולם, ברירת המחדל של Docker. רוב ה-images הפופולריים יושבים שם: nginx, postgres, redis, node, python, ועוד אלפים. חשוב: ל-Docker Hub יש מגבלות pull (100 אנונימי ל-6 שעות לכל IP, 200 אם אתם מחוברים עם חשבון Personal חינמי) — נדבר על זה בפרק 6 לעומק. - GitHub Container Registry (ghcr.io) — registry חינמי של GitHub, יושב ליד ה-repo שלכם. קל לדחוף אליו דרך
docker push ghcr.io/your-username/your-app:v1. מתאים במיוחד ל-Vibe Coder שכבר משתמש ב-GitHub — אין צורך בחשבון נוסף, ואין מגבלות pull בעייתיות.
איך זה עובד בפועל
התהליך ייראה בערך כך בפרק 6:
- על הלפטופ: אתם בונים image מקומי:
docker build -t myapp:v1 .. - על הלפטופ: אתם נותנים ל-image tag נוסף שמצביע על registry:
docker tag myapp:v1 ghcr.io/your-username/myapp:v1. - על הלפטופ: אתם נכנסים ל-registry ודוחפים:
docker push ghcr.io/your-username/myapp:v1. ה-image עכשיו בענן. - על השרת: אתם נכנסים ב-SSH, מושכים את ה-image, ומריצים:
docker pull ghcr.io/your-username/myapp:v1 && docker run -d -p 80:3000 ghcr.io/your-username/myapp:v1. האפליקציה רצה.
זה הכל. אין קסם, אין deploy מורכב. ה-image הוא האריזה; ה-registry הוא המעבורת; השרת הוא היעד. בפרק 6 נעבור את התהליך הזה צעד-צעד, כולל הבעיות הקלאסיות שעולות בדרך (image שלא רץ בגלל ארכיטקטורה שונה, למשל).
מה Vibe Coder צריך מ-Docker — ולמה זה מספיק
Docker הוא עולם גדול. אם תחפשו בגוגל, תמצאו 200 מאמרים על Kubernetes, 100 על Swarm, 50 על CI/CD, 30 על service mesh. כל זה לא בשבילכם — לפחות לא בקורס הזה.
ה-Vibe Coder צריך בדיוק ארבעה דברים מ-Docker, וכל הקורס מתמקד בהם:
- לארוז אפליקציה אחת (או שתיים, אם יש גם מסד נתונים) לתוך image שאפשר להריץ בכל מקום. זה מה שפרק 3 ילמד אתכם.
- לשמר נתונים שלא נעלמים כשה-container נכבה — במיוחד במסד נתונים. זה מה שפרק 4 (volumes) ילמד.
- להעביר config ו-API keys ב-runtime — בלי לאפות סודות לתוך ה-image. נלמד בפרק 4 גם כן (env vars ו-
--env-file). - להריץ את ה-image על שרת אמיתי — ידנית עם SSH או דרך Coolify, עם HTTPS אוטומטי. זה מה שפרק 6 יסגור.
זה הכל. ארבע יכולות. שישה פרקים. בלי הרבה תיאוריה, בלי הרבה ארכיטקטורה, בלי microservices-32. אפליקציה אחת, ארוזה טוב, רצה בכל מקום.
למה ה-scope הצר הזה עובד
הרבה אנשים שמתחילים עם Docker נכנסים למלכודת של "ללמוד הכל". הם קוראים על Kubernetes, מנסים להבין איך replicas עובדים, מתקינים Helm, מסתבכים, ומוותרים. זה קורה כי הם פתרו בעיה שהם לא צריכים לפתור.
הגישה של הקורס הזה הפוכה: להתחיל מהבעיה האמיתית שלכם (אפליקציה אחת שצריכה לרוץ ביותר ממקום אחד), לבנות בדיוק מה שצריך, ולעצור. אם תרצו Kubernetes בעוד שנתיים כשיש לכם 50 services — מצוין, יש קורסים מצוינים לזה. אבל עכשיו, 4 היכולות למעלה הן מה שמשנה.
מה מחוץ ל-scope — ולמה זה בסדר גמור
חשוב לא פחות ממה שנלמד: חשוב לדעת מה לא נלמד. רשימת ההחרגות קצרה אבל חד-משמעית, ולכל פריט בה יש סיבה.
Kubernetes — לא בשלב הזה
Kubernetes הוא מערכת לניהול אלפי containers במקביל, עם auto-scaling, healing, rolling updates, ועוד עשרות יכולות. זה לא רלוונטי לאפליקציה אחת. אם יש לכם אפליקציה אחת שרצה על שרת אחד — Kubernetes הוא כמו להזמין משאית 18 גלגלים להסעת סלולרי. אפשר, אבל זה לא מה שעושים.
Docker Swarm — הוצא משימוש בפועל
Docker Swarm היה ניסיון של Docker לעשות תחליף קל ל-Kubernetes. ב-2026, הוא כמעט לא בשימוש. אם תראו מדריך ישן שמציע "לעבור ל-Swarm בשביל קנה-מידה" — תדעו שזה מדריך מ-2018. האלטרנטיבה המודרנית היא או Kubernetes (לקנה-מידה גדול) או פשוט docker compose (לקנה-מידה קטן). אנחנו בקטגוריה השנייה.
service mesh, sidecars, distributed tracing
אלה כלים למערכות מבוססות-microservices, שבהן עשרות services מדברים ביניהם וצריך לעקוב אחרי הזרימה. לא רלוונטי כשיש לכם service אחד או שניים. גם אם האפליקציה שלכם תגדל בעתיד, הקפיצה ל-service mesh תגיע אחרי שיש לכם לפחות 5-10 services נפרדים, ואתם סובלים מבעיות של מעקב ואבטחה. לא לפני.
CI/CD מתקדם
יש הבדל בין "להריץ image על שרת" (זה כן בקורס, פרק 6) לבין "בנייה אוטומטית בכל push, deploy אוטומטי, rollback אוטומטי" (זה לא בקורס). בקורס הזה תדחפו image ידנית לאחר בנייה, ותריצו deploy ידני או דרך Coolify שעושה חצי מהעבודה בשבילכם. CI/CD מלא (GitHub Actions + deploy אוטומטי + staging environments) הוא קורס נפרד, ומגיע אחרי שיש לכם את הבסיס.
הסיבה העמוקה: scope creep הורס קורסים
הסיבה שהרבה קורסי Docker נכשלים: הם מנסים ללמד את הכל. הם מתחילים ב-"מה זה container", ותוך 3 פרקים מדברים על overlays, CNI plugins, ו-cgroup v2. באמצע הפרק 4 הלומד מרגיש אבוד, ובפרק 6 הוא כבר לא שם.
הקורס הזה נשבע לא ללכת לשם. אם תסיימו את 6 הפרקים ותרגישו שאתם יודעים לארוז אפליקציה אחת ולהריץ אותה בכל מקום — עשינו את שלנו. אם תרצו יותר, יש 6 קורסי-המשך טבעיים (production, scale, security, observability, CI/CD, multi-cloud). אבל זה אחר כך.
מבט קדימה — איך image הופך ל-cornerstone של deploy
ה-mental model של image-זה-האריזה, container-זה-הריצה, registry-זה-המעבורת — הוא לא רק "עוד דרך להריץ אפליקציה". זה הבסיס לכל מה שתעשו ב-2026 בעולם ה-deploy: ה-image הוא הנכס היחיד שעובר בין הלפטופ לשרת לענן.
כשתגיעו לפרק 6, התהליך ייראה כך: בונים image מקומי → דוחפים ל-registry → שרת מושך ומריץ. אם תרצו HTTPS — Coolify מוציא תעודה אוטומטית דרך Let's Encrypt. אם תרצו לעבור ספק ענן — מושכים את אותו image מאותו registry, בלי שינוי. אם תרצו rollback — מחזירים tag ישן (v0.9 במקום v1.0), בלי לבנות מחדש.
זה ה-cornerstone של קורס ה-production שיבוא אחרי זה. הרבה מהדברים שמסבירים בקורסי production (rolling updates, blue-green, canary) בנויים על ההנחה שיש לכם image שאפשר לתייג, לדחוף, ולהחליף. בלי הבסיס הזה, קורסי production הם אוויר. איתו — הם הגיוניים מאליהם.
ולכן השיעור של הפרק הזה הוא לא "תכיר את Docker" אלא "תבין שאתה בונה נכס שיחזיק לכם חודשים".
הפחד מול המציאות
הרבה אנשים שמתחילים עם Docker מתארים חוויה דומה: הם פותחים מדריך, רואים 200 עמודים, שומעים מושגים כמו "image layer", "cgroups", "namespace", "union filesystem", ומרגישים שזה מעבר להם. הפחד הזה הוא נורמלי — וברובו מוצדק רק אם אתם מנסים ללמוד הכל.
המציאות: אתם לא צריכים להבין את כל המנוע כדי לנהוג. רוב המכוניות בנויות על מנועי בעירה פנימית, אבל רוב הנהגים לא יודעים איך מנוע בעירה עובד. הם יודעים: מפתח → מתנע → הגה → דוושות. זה מספיק.
ב-Docker, המקבילה היא:
- מפתח = התקנה של Docker Desktop (פרק 2).
- מתנע =
docker run. - הגה =
docker build(ה-Dockerfile). - דוושות =
docker stop,docker rm,docker logs.
זה הבסיס. שאר ה-200 העמודים הם למי שרוצה להבין איך המנוע עובד — וזה מעולה, אבל זה לא דרישה. אם אתם יודעים לארוז אפליקציה אחת ולהריץ אותה בכל מקום, אתם כבר משתמשים ב-95% מהערך ש-Docker נותן. השאר הוא אופטימיזציה, שמגיעה כשצריך.
מה שמפחיד אתכם בעיקר בלבול מושגים
הפחד מ-Docker הוא לרוב בלבול בין מושגים, לא קושי אמיתי. ברגע שאתם יודעים:
- image ≠ container,
- container ≠ VM,
- build עושה image, run עושה container,
- registry שומר, push/pull מעביר,
- Dockerfile = מתכון, image = המנה הקפואה, container = המנה המוגשת,
הכל מסתדר. אין כאן קסם. יש רק אוצר מילים חדש, שברגע שהוא בראש — Docker הופך מסט של פקודות מפחידות לשפה טבעית.
לפני שאתם נכנסים לפרק 2, עצרו לרגע וכתבו שני רשימות קצרות. הראשונה — מה Docker יעשה לכם בקורס הזה. השנייה — מה הוא לא. הגבול הזה יחסוך לכם שעות של "למה זה לא עובד" אחר כך.
3 דברים ש-Docker כן יעשה לכם ב-6 הפרקים:
- לארוז את האפליקציה (שורה-שורה ב-Dockerfile) ל-image שאפשר להריץ בכל מקום. בלי "רץ לי במק, נשבר לי בחלונות".
- לשמר נתונים בין הרצות (volumes) ולהעביר config ב-runtime (env vars) — בלי סודות שנחשפים ב-Git.
- להעלות לשרת אמיתי (VPS, Coolify) ולקבל HTTPS אוטומטי, בלי להתעסק עם הגדרות nginx ידניות.
3 דברים ש-Docker לא יעשה בקורס הזה (וזה בסדר):
- לא ינהל לכם 200 services במקביל (לזה צריך Kubernetes, ואתם לא שם).
- לא יבנה לכם image אוטומטית בכל push (CI/CD מלא — זה קורס אחר, אחרי שתסיימו את הזה).
- לא יפתור לכם בעיות של production (monitoring, alerting, log aggregation) — אלה מגיעים אחרי שיש לכם image שרץ.
איך להשתמש ב-Framework: בכל פעם שאתם רואים מדריך, סרטון, או פלט AI שמציע "פתרון" שלא ברשימת ה-3-In — עצרו. זה לא הבעיה שלכם. הוסיפו לרשימת ה-Out והמשיכו. ה-Vibe Coder שמתמקד הוא זה שמסיים קורסים.
אם הייתי צריך לבחור 4 מושגים שיחזיקו אתכם לכל 6 הפרקים, אלה הם. שימו אותם על פתק ליד המקלדת. בכל פעם שמשהו לא מסתדר — חזרו לפה ובדקו איזה מהם לא ברור.
- image = המתכון הקפוא (read-only, נוצר על-ידי
docker build, נשמר ב-registry, לא משתנה). - container = המופע הרץ (נוצר על-ידי
docker run, חי עד שמכבים, ניתן להריץ הרבה מ-image אחד). - Dockerfile = הוראות ההכנה (קובץ טקסט שמגדיר איך לבנות את ה-image, שורה-שורה: FROM, COPY, RUN, CMD).
- registry = המחסן (Docker Hub, ghcr.io — שרת מרכזי שאליו דוחפים וממנו מושכים images).
החוק הפשוט: כל פעם שאתם רואים פקודה חדשה, שאלו "איזה מה-4 היא משנה?"
docker build→ יוצר image.docker run→ יוצר container.docker push/docker pull→ מעביר image דרך registry.docker exec→ נכנס ל-container קיים.docker logs→ רואה פלט של container.
אם אתם יודעים איזה מה-4 הפקודה משנה — אתם יודעים מה היא עושה, גם בלי להבין את המנוע.
פתחו Notepad או Google Doc, וכתבו במשפט אחד: "האפליקציה שלי היום רצה רק על הלפטופ שלי בגלל [X], ואחרי הקורס היא תרוץ בכל מקום". ה-[X] הוא הגורם העיקרי שבגללו היא נשברת: גרסת שפה, dependency חסר, OS שונה, או סוד שנחשף. אל תנסחו יפה — תנסחו מדויק. תוצאה צפויה: יהיה לכם עוגן אישי שמחבר את הקורס לאפליקציה הספציפית שלכם. כל פעם שתרגישו אבודים, תחזרו למשפט הזה.
באותו מסמך, הוסיפו שתי רשימות: "3 דברים שאני מצפה ש-Docker יפתור לי בקורס" ו-"3 דברים שאני לא מצפה ממנו". דוגמאות ל-In: "להריץ את האפליקציה על VPS", "לא לפחד מ-version mismatches", "לדחוס את ה-Env management". דוגמאות ל-Out: "לבנות לי CI/CD", "לנהל לי 50 services", "לפתור לי בעיות אבטחה ב-production". תוצאה צפויה: הגדרת scope אישית שתגן עליכם מפני סחף. בכל פעם שמשהו ירגיש "אולי זה מסובך מדי", תבדקו אם זה ב-In או ב-Out — ואם ב-Out, תזיזו הצדה.
בלי להריץ שום דבר, ענו לעצמכם בקול רם: "אני עומד/ת לבנות image — מה אני עומד/ת להריץ? docker build או docker run? אני עומד/ת להריץ container — מה אני צריך/ה לפני כן, image או Dockerfile?". חזרו על השאלות עד שהתשובה מיידית. תוצאה צפויה: ההבחנה image-vs-container תהפוך מ"משהו שאני חושב/ת עליו" ל"משהו שאני יודע/ת אוטומטית". זה הצעד הראשון בפתיחת הפקודות בפרק 2 בלי חרדה.
קחו נייר ועט (או המשיכו ב-Doc), והכינו טבלה עם 2 עמודות: "Container" ו-"Virtual Machine". מלאו 4 שורות: גודל, זמן הרצה, האם משתף kernel, וכמה נכנסים בשרת סטנדרטי. בלי להציץ. אחר כך השוו עם הטבלה בסעיף 3. תוצאה צפויה: תראו איפה הייתם צריכים חיזוק (אם בכלל). אם מילאתם 4/4 נכון — אתם מוכנים. אם לא — חזרו לסעיף 3 וקראו שוב. אין צורך להמשיך לפרק 2 בלי שזה ברור.
בחרו אנלוגיה אישית שעובדת לכם להבחנה בין image ל-container. הצעות: (1) תבנית אפייה מול עוגה, (2) מתכון מול תבשיל, (3) קובץ התקנה מול תוכנה מותקנת, (4) שרטוט של בית מול בית שנבנה, (5) class מול instance. רשמו את הבחירה ב-Doc, וכתבו משפט אחד שמסביר את ההבדל באנלוגיה שלכם. תוצאה צפויה: עוגן אישי שיחזיק אתכם גם אם תשכחו את המונחים הטכניים. כל אימת שתתבלבלו, תחזרו לאנלוגיה.
הרשימה הבאה כוללת 5 משפטים. קראו כל אחד, וסמנו אם הוא נכון או שגוי (הפועל בו לא מתאים למושג):
- "הרצתי image של postgres מ-Docker Hub."
- "בניתי container חדש עם ה-Dockerfile שלי."
- "ה-image הזה שוקל 300 מגה, אז ה-container יהיה באותו גודל."
- "דחפתי image ל-ghcr.io."
- "מחקתי את ה-container, אבל ה-image עדיין פה."
תשובות: (1) שגוי — מושכים image, מריצים container; (2) שגוי — בונים image, מריצים container; (3) נכון — ה-container רץ מתוך ה-image, הוא לא מוסיף לגודל; (4) נכון — דוחפים image, לא container; (5) נכון — מחיקת container לא מוחקת image. תוצאה צפויה: תוכלו לזהות איפה אתם עדיין מערבבים את המושגים, ולחזק את ההבחנה לפני שנכנסים לפקודות אמיתיות.
קחו את האפליקציה שלכם ובדקו אם היא נופלת לאחד משלושת הכשלים שתוארו בסעיף 2: (1) התנגשויות dependencies? האם יש package-lock.json או requirements.txt שמתעד כל חבילה, או שיש חבילות שהותקנו "פעם אחת בעבר" ולא תועדו? (2) אי-התאמת סביבה? האם יש משתני סביבה שמוגדרים רק על הלפטופ שלכם, או ספריות מערכת שאתם בטוחים שמותקנות? (3) סודות בקוד? חפשו בכל הקבצים שלכם (grep -r "API_KEY\|SECRET\|PASSWORD\|TOKEN") ובדקו אם משהו חשוף. תוצאה צפויה: תדעו בדיוק איפה האפליקציה שלכם כבר שבירה, ותוכלו לתעדף איפה Docker יעזור לכם הכי הרבה. גם אם תגלו שאין בעיות — עצם הבדיקה שווה את הזמן.
קחו 6 כרטיסיות (פיסות נייר או sticky notes). על 4 מהן רשמו את המושגים המרכזיים: image, container, Dockerfile, registry. על 2 הנותרות רשמו: build, run. ערבבו, הוציאו אחת, ובמשפט אחד הסבירו מה היא עושה. אם הצלחתם — העיקרון של הקורס בראש. אם לא — חזרו לסעיף המתאים. תוצאה צפויה: תוך 6 הקלקות על הכרטיסיות, תהפוך את המושגים מ"ידע" ל"מיומנות" — וזה מה שיבדיל אתכם מהלומד שמסיים את הפרק עם תחושה ש"הבנתי, אבל אני לא בטוח אם אני יודע להשתמש בזה".
המטרה: להפוך את המסע "image מהלפטופ → registry → שרת" לתרשים ויזואלי שלכם. עד שתציירו אותו, הוא רק מילים.
מה תעשו:
- פתחו Google Drawing, Excalidraw, או אפילו נייר ועט.
- ציירו 4 ריבועים: "הלפטופ שלי", "image", "ghcr.io", "VPS".
- חברו אותם בחיצים, ועל כל חץ רשמו את הפקודה המתאימה:
docker build,docker push,docker pull,docker run. - הוסיפו הערה קטנה: "איזה חלק זה יקרה בפרק 3, איזה בפרק 6".
תוצאה צפויה: תרשים פשוט עם 4 ריבועים ו-4 חיצים מתויגים, שמראה את כל המסע של ה-image מהקוד שלכם ועד שהוא רץ על שרת אמיתי. התרשים לא חייב להיות יפה — הוא חייב להיות שלכם. תדפיסו אותו או שמרו אותו כ-PNG ליד המקלדת.
המטרה: לראות בעיניים ש-image ו-container הם שני דברים שונים שמתקשרים בפקודה אחת.
מה תעשו:
- ציירו שני ריבועים זה לצד זה. השמאלי = "image", הימני = "container".
- בתוך ריבוע "image" רשמו: "read-only, frozen, נוצר על-ידי
docker build, שוקל MB-GB". - בתוך ריבוע "container" רשמו: "writable layer, רץ, נוצר על-ידי
docker run, חי עד stop/rm". - חברו חץ מ-image ל-container. על החץ רשמו:
docker run. - מתחת לתרשים רשמו: "מ-image אחד אפשר להריץ הרבה containers; מחיקת container לא מוחקת image".
תוצאה צפויה: דיאגרמה פשוטה שמתעדת את הקשר image→container. תלו אותה ליד המסך. כל פעם שתקראו הוראה או תקבלו הודעת שגיאה, תסתכלו על הדיאגרמה ותשאלו "איפה אני בתרשים הזה? על ה-image? על ה-container?".
המטרה: להפוך את 5 הפקודות שתשתמשו בהן ביומיום לכרטיסייה ויזואלית אחת שתוכלו להדפיס ולשים ליד המקלדת.
מה תעשו:
- קחו פיסת נייר (או פתחו Mac Notes, Google Keep, Notion).
- רשמו 5 שורות, אחת לכל פועל:
docker build— יוצר image מ-Dockerfile.docker run— יוצר container מ-image.docker push— מעלה image ל-registry.docker pull— מוריד image מ-registry.docker exec— נכנס לתוך container רץ.
- בצד השני של הכרטיסייה רשמו: "build = image, run = container, push/pull = registry, exec = live container".
- שימו ליד המקלדת. תסתכלו עליה בכל פעם שאתם לא זוכרים מה פקודה עושה.
תוצאה צפויה: כרטיסייה אחת פיזית (או דיגיטלית) שתחזיק אתכם לכל 6 הפרקים. כל אימת שתרגישו "רגע, מה הולך כאן", תסתכלו — וב-90% מהמקרים היא תספיק.
זו הטעות הראשונה שכמעט כל מי שמתחיל עושה, והיא המזיקה ביותר. הסימפטום: אתם אומרים "הרצתי image של postgres" כשאתם בעצם הרצתם container. או "מחקתי את ה-image הזה" כשאתם בעצם עצרתם container. ההשלכה: כל פקודה אחר כך מרגישה אקראית, כי אתם לא יודעים אם docker rm מוחק image או container (תשובה: רק container — docker rmi מוחק image), אם docker push שולח image או container (תשובה: רק image), וכו'.
התיקון: בפעם הראשונה שאתם כותבים "image" או "container" באפליקציית ההערות — עצרו לרגע. שאלו את עצמכם: "אני מדבר על הקובץ הקפוא, או על המופע הרץ?" אם אתם לא בטוחים — חזרו לסעיף 4 וקראו שוב. נעילת ההבחנה כאן חוסכת שעות תסכול בפרקים הבאים — זו לא הגזמה, זו עובדה שרוב הקורסים מדלגים עליה ומשלמים מאוחר יותר.
תופעה נפוצה: מישהו שמע על "Kubernetes" (או "K8s", או "Helm", או "operators") והחליט ש-Docker זה "אותו דבר, רק יותר קל". הוא פותח קורס Docker, רואה את המילה "container", ומיד מדמיין 200 pods, 50 deployments, ו-cluster עם 3 masters. הוא סוגר את הקורס ועובר לוויזואל בלוגרים (או, גרוע יותר, מוותר על deploy לגמרי).
המציאות: Docker ו-Kubernetes הם שני דברים שונים לחלוטין. Docker עוטף אפליקציה אחת ומריץ אותה. Kubernetes מנהל אלפי אפליקציות כאלו במקביל. לארוז אפליקציה אחת ולהריץ אותה על VPS לא דורש שום orchestration. זה כמו להפחד מללמוד נהיגה כי "מכוניות מירוץ מסובכות". אתם לא נוהגים במכונית מירוץ. אתם נוהגים במכונית משפחתית. אותו עיקרון, פחות features, מתאים בדיוק למה שאתם צריכים.
התיקון: אם אתם רואים את המילים pod, replica, deployment, service mesh, או sidecar — סגרו את המדריך הזה. זה לא בשבילכם עכשיו. חזרו לקורס הזה, שמלמד את הדבר המצומצם שאתם כן צריכים.
טעות שמייצרת תסכול מיותר בפעמים הראשונות: מי שמכיר VM רק רואה את המילה "container" וחושב שזה "VM קל". הוא מצפה שהריצה תיקח 30 שניות, שה-image ישקול 3-5 GB, ושתהיה הפרדה ברמת מערכת הפעלה בין ה-container למארח. כל אלה לא נכונים.
ההפתעות: container עולה בשנייה, לא בדקה. image שוקל 200 MB, לא 3 GB. ה-container לא מבודד ברמת מערכת הפעלה — הוא משתף kernel עם המארח. אם אתם רוצים בידוד של VM, תצטרכו לרוץ בתוך VM (למשל, Colima על Mac, או WSL2 על Windows). זה לגיטימי, אבל זה שכבה נוספת.
התיקון: קבלו ש-container זה container, לא "VM קל". זה קטגוריה אחרת לגמרי. זה מהיר, זה קל, זה זול — אבל הוא לא מציע את אותו סוג של בידוד. ברוב המקרים של Vibe Coder, זה יותר מספיק — ואם יום אחד תצטרכו VM, תדעו את זה.
יומי (10 דקות, 14 ימים ראשונים):
- 5 דקות — חזרה על ההבחנה image/container. פתחו את ה-Doc שלכם, הסתכלו על התרשים מתרגיל 1, ובקול רם הסבירו לעצמכם מה ההבדל. אם זה לא זורם — חזרו לסעיף 4.
- 5 דקות — סריקת האפליקציה שלכם לסודות. הריצו
grep -r "API_KEY\|SECRET\|PASSWORD\|TOKEN" .בתיקיית הפרויקט. אם מצאתם משהו — הוציאו ל-.envוהוסיפו ל-.gitignore. אל תיקחו סיכון.
שבועי (30 דקות, יום ראשון בערב): חזרה על 3 הרשימות (3-In, 3-Out, Mental Model Map). האם הן עדיין משקפות את הבנתכם? עדכנו אם צריך. קראו את ה-mental model map בקול רם — אם מילה כלשהי לא זורמת, זה הסימן שצריך לחזור לסעיף המתאים לפני פרק 2.
לפני פרק 2 (סוף שבוע שני): ודאו שיש לכם 4 דברים מוכנים: (1) Mac או Windows עם WSL2; (2) חיבור אינטרנט יציב (image של nginx הוא ~50 MB, לא נורא, אבל docker desktop הוא כבר GB בודדים); (3) ה-Doc שלכם עם התרשים מתרגיל 1 פתוח לצד; (4) סקרנות. אין צורך בשום דבר אחר.
ברגע שתסיימו את הפרק הזה ותרגישו שה-mental model ברור — אתם מוכנים לפרק 2. אם משהו עדיין מרגיש ערפילי, עצרו וחזרו. אין בושה; רוב האנשים צריכים 2-3 קריאות של ההבחנה image/Container עד שזה נכנס.
- "רץ אצלי במחשב" הוא לא באג; זה פער מבני. האפליקציה שלכם נשברת במקום אחר בגלל גרסאות שפה, dependencies חסרים, או OS שונה. 82% מהכשלים הם dependencies, 60-70% סביבה, 48% סודות. Docker סוגר את כל השלושה.
- container ≠ VM. container חולק את ה-kernel של המארח, שוקל MB, ועולה בשניות. VM מריץ OS אורח שלם, שוקל GB, ועולה בדקות. אותו שרת מחזיק 100-200 containers או 10-15 VMs. ל-Vibe Coder, container הוא הברירה.
- image ≠ container. image = המתכון הקפוא. container = התבשיל הרץ.
docker buildעושה image.docker runעושה container. מ-image אחד מריצים הרבה containers. מחיקת container לא מוחקת image. - build ו-run הן הפקודות הבסיסיות.
docker build -t myapp:v1 .הופך Dockerfile ל-image.docker run -p 8080:80 nginxהופך image ל-container שמגיש דף ב-browser. זה הבסיס לכל השאר. - OCI הופך את ה-image לנייד. תקן פתוח שמבטיח שה-image ירוץ באותה צורה ב-Docker, ב-Podman, ב-Kubernetes, בענן. אתם לא נעולים על Docker.
- registry = הגשר מהלפטופ לשרת. Docker Hub ו-ghcr.io הם שני הרלוונטיים.
docker pushמעלה,docker pullמוריד. בפרק 6 תדחפו image ל-ghcr.io ותמשכו אותו על VPS. - ה-Vibe Coder צריך בדיוק 4 דברים: לארוז אפליקציה, לשמר נתונים, להעביר config ב-runtime, ולהריץ על שרת. לא Kubernetes, לא Swarm, לא CI/CD מלא. ב-6 פרקים תסגרו את כל ה-4, וזה הבסיס לקורס ה-production.
אם תצאו מהפרק הזה עם דבר אחד בראש, שיהיה זה: image הוא המתכון הקפוא, container הוא התבשיל הרץ. docker build עושה image. docker run עושה container. כל פקודה אחרת בקורס — push, pull, exec, logs, stop, rm — משנה אחת מהשתיים. אם אתם יודעים איזו מהשתיים אתם משנים, אתם יודעים מה הפקודה עושה. זה ההבדל בין מי שמסיים את הקורס ומרגיש "אני יודע" לבין מי שמסיים ומרגיש "אני רק חוזר על מה שהמדריך אמר לי". בלי ההבחנה הזו, כל פקודה תרגיש אקראית. איתה — הכל הגיוני.
- שאלה: האפליקציה שלכם רצה על הלפטופ עם
npm run dev, אבל כשאתם שולחים את הריפו לחבר, הוא מקבל "Module not found" על חבילה שעובדת אצלכם. איזה משלושת הכשלים המתוארים בסעיף 2 זה, ולמה Docker פותר את זה?
תשובה: זה כשל של dependencies: החבילה מותקנת אצלכם ב-node_modulesהמקומי, אבל לא תועדה ב-package.jsonאו לא נכללה ב-lockfile. Docker פותר את זה כי ה-image הקפוא כולל בדיוק את ה-dependencies שעבדו (כולל גרסאות מדויקות), בלי תלות במה שמותקן על המכונה המקומית. - שאלה: מה ההבדל הקריטי בין container ל-Virtual Machine, ולמה הוא חשוב ל-Vibe Coder שרוצה להריץ את האפליקציה על VPS של 4$?
תשובה: container חולק את ה-kernel של המארח (MB, עולה בשניות, 100-200 נכנסים בשרת); VM מריץ OS אורח שלם (GB, עולה בדקות, 10-15 בשרת). ל-VPS של 4$, container מאפשר להריץ את האפליקציה + מסד + cache על אותו שרת; VM היה דורש 3 שרתים. - שאלה: אתם מריצים
docker run nginx, ואז מוחקים את ה-container עםdocker rm <id>. האם ה-image של nginx עדיין קיים? האם תוכלו להריץdocker run nginxשוב בלי להוריד שוב?
תשובה: כן.docker rmמוחק רק את ה-container (המופע הרץ), לא את ה-image (המתכון הקפוא).docker run nginxבלי--pullישתמש ב-image המקומי בלי להוריד מחדש.docker rmi nginxהיא הפקודה שמוחקת image. - שאלה: למה OCI חשוב, ואיזו השלכה יש לזה על הבחירה שלכם ב-Docker?
תשובה: OCI הוא תקן פתוח שמבטיח שה-image ו-container runtime מתנהגים באותה צורה בכל כלי תואם (Docker, Podman, containerd, Kubernetes). ההשלכה: אתם לא נעולים על Docker. אם מחר תרצו לעבור ל-Podman, או להעלות image ל-Kubernetes בענן — אותו image יעבוד. Docker הוא הכלי הנוח ביותר היום, לא כלא טכנולוגי. - שאלה: רשמו 3 דברים ש-Docker כן יעשה לכם בקורס הזה, ו-3 שהוא לא. איזה פריט ברשימת ה-Out הכי מפתה אתכם ללמוד עכשיו, ולמה לא כדאי?
תשובה: דוגמה לתשובה: In — לארוז אפליקציה, לשמר נתונים, להעלות לשרת. Out — Kubernetes, CI/CD, monitoring. הפריט הכי מפתה הוא כנראה CI/CD (לראות איך "דוחפים ל-GitHub והכל מתעדכן אוטומטית"). הסיבה שלא כדאי: בלי שיש לכם image שרץ ובלי שאתם מבינים deploy ידני, CI/CD אוטומטי רק יסתיר תקלות. קודם הבסיס, אחר כך האוטומציה.
- ☐ כתבתי ב-Doc משפט אחד שמסביר למה האפליקציה שלי נשברת ("רץ אצלי בגלל ___").
- ☐ מילאתי את 3-In / 3-Out האישי שלי (מה Docker כן יפתור לי, מה לא).
- ☐ אני יכול להסביר בקול רם, בלי להציץ: מה ההבדל בין image לבין container.
- ☐ אני יכול למלא בלי להציץ את הטבלה של container מול VM (גודל, זמן, kernel, density).
- ☐ בחרתי אנלוגיה אישית (תבנית/מתכון/class) להבחנה image/Container וכתבתי אותה ב-Doc.
- ☐ עברתי על 5 המשפטים בתרגיל "Find the Wrong Verb" וסימנתי נכון/שגוי ב-5/5.
- ☐ עשיתי audit סודות על האפליקציה שלי (
grep -r "API_KEY\|SECRET\|PASSWORD\|TOKEN" .) וטיפלתי בכל מה שמצאתי. - ☐ ציירתי את התרשים מתרגיל 1 (4 ריבועים: לפטופ → image → registry → VPS) ושמרתי אותו ליד המקלדת.
- ☐ ציירתי את התרשים מתרגיל 2 (image ← run ← container, עם הסברים) ותליתי ליד המסך.
- ☐ הכנתי את כרטיסיית 5 הפעלים (build/run/push/pull/exec) מתרגיל 3.
- ☐ הכנתי 6 flash cards (image/container/Dockerfile/registry + build/run) ועברתי עליהן בהצלחה.
- ☐ אני מרגיש/ה שאני מוכן/ה לפרק 2 (התקנה והרצה ראשונה). אם לא — חוזר/ת לסעיף 4.
- משפט עוגן אישי ב-Doc: "האפליקציה שלי היום רצה רק על הלפטופ שלי בגלל [X], ואחרי הקורס היא תרוץ בכל מקום". ציטוט של הגורם העיקרי שבגללו היא נשברת (גרסת שפה, dependency חסר, OS שונה, או סוד שנחשף).
- כרטיסיית 6 מונחי יסוד (image, container, Dockerfile, registry, build, run) — פיזית (sticky notes) או דיגיטלית (Notes/Keep). זמינה לצד המקלדת לכל 6 הפרקים.
- תרשים "המסע של image" — 4 ריבועים (לפטופ → image → registry → VPS) עם 4 פקודות מתויגות על החיצים (
build,push,pull,run). ממופה לאפליקציה הספציפית של הלומד/ת. - מסמך scope אישי: 3-In / 3-Out — רשימה של 3 דברים ש-Docker יעשה לי בקורס, ו-3 שלא (Kubernetes/Swarm/CI-CD מלא). נכתב לפני פרק 2 ומשמש כמגן מפני scope creep.
- דוח audit סודות — פלט של
grepעל האפליקציה עם סימון V על כל פריט שטופל (הועבר ל-.env, הוסר, או לא רלוונטי). אם האפליקציה שלכם נקייה — גם זו תוצאה לתעד. - טבלת container-vs-VM משלכם — מולאה בלי להציץ, ואז הושוותה עם הטבלה בסעיף 3. אם 4/4 נכון — אתם מוכנים לפרק 2. אם פחות — חוזרים לסעיף 3.
בפרק 2 (התקנה והרצה ראשונה — Desktop, ה-CLI, וה-container הראשון שלך) נעבור מהתיאוריה לעשייה: נתקין את Docker Desktop על Windows (עם WSL2) או על Mac, נוודא שהוא עובד עם docker run hello-world, ואז נריץ container אמיתי — docker run -p 8080:80 nginx — ונפתח אותו ב-browser. תוך 20 דקות תראו בעיניים את ההבדל בין "לקרוא על Docker" לבין "להריץ container". ה-mental model מהפרק הזה הוא הבסיס; פרק 2 הוא הרגע שבו הוא הופך לפקודות.