מודול 3 · הרצה בפועל — שיעור 5 מתוך 6

פורטים, כרכים ומשתני סביבה

10 דקות קריאה

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

פורטים: שלוש דרכים לאותו דבר

docker run -p 8080:3000 myapp        # 8080 במחשב → 3000 במכולה
docker run -p 127.0.0.1:8080:3000    # רק localhost, לא מהרשת
docker run --network host myapp      # בלי בידוד רשת (לינוקס בלבד)

EXPOSE בתוך ה-Dockerfile הוא תיעוד בלבד. בלי -p (או רשת משותפת) אין גישה מהחוץ.

טעות נפוצה: האפליקציה מאזינה ל-127.0.0.1 בתוך המכולה. אז הפורט מפורסם אבל אין מה שיקשיב לו — צריך 0.0.0.0.

כרכים: מה ששורד

docker run -v mydata:/var/lib/postgresql/data postgres:16
docker run -v "$PWD/content:/app/content" myapp     # bind mount
docker run --mount type=bind,source="$PWD",target=/app,readonly myapp

שני סוגים ושימושים שונים:

  • Named volume — מנוהל בידי Docker, שורד מחיקת מכולה, לא תלוי בנתיב במחשב. נכון למידע של אפליקציה: בסיס נתונים, קבצים שהועלו.
  • Bind mount — מתלה תיקייה אמיתית. נכון לפיתוח (קוד חי) ולקבצי קונפיגורציה שמישהו עורך.

כלל: נתונים לא גרים בתוך המכולה. מכולה היא תהליך, לא דיסק.

משתני סביבה

docker run --env-file .env.production myapp
docker run -e DATABASE_URL=postgres://... myapp

אל תעתיקו .env לתוך האימג'. ההבדל בין COPY .env . לבין --env-file הוא ההבדל בין סוד שדלף לבין סוד שנשאר סוד. גם אחרי מחיקת הקובץ מהאימג' — הוא נשאר בהיסטוריית השכבות.

דיבוג מהיר

docker exec -it <container> sh          # להיכנס למכולה רצה
docker logs -f <container>              # מה התהליך מדפיס
docker inspect <container> | less       # mount-ים, env, רשת
docker stats                            # צריכת מעבד וזיכרון בזמן אמת

אם docker logs ריק אבל המכולה "עולה ונופלת" — התהליך כותב ל-stderr של תהליך אחר, או שהבחירה ב-CMD יוצרת shell שמת ולא מעביר stdout. בדקו docker inspect --format '{{.State.ExitCode}}'.