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

למזלנו, Docker מגיע להצלה. אבל ייתכן שאתם תוהים – מה זה Docker, ואיך זה עוזר? תלמדו את כל זה ועוד במדריך הזה.

אך לפני שנתחיל, הנה כמה דרישות מוקדמות:

  • ידע בפקודות Linux

  • ידע בשימוש בטרמינל

  • ידע ב-Node.js ו-Express.js

תוכן עניינים

  1. מה זה Docker?

  2. איך להתקין Docker

  3. פרויקט דמו: איך לארוז יישום Node.js

  4. סיכום

מה זה דאקר?

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

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

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

לפני שנתקדם, הנה כמה מונחים מרכזיים שתפגוש במהלך המדריך הזה:

מנוע דאקר

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

דימוי Docker

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

כמו כן, ניתן לבנות דימוי ספציפי ולארח אותו או באופן ציבורי ב-Docker hub או במאגר פרטי.

מיכלים של Docker

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

יתרונות השימוש ב-Docker

הנה כמה מהיתרונות של השימוש ב-Docker כמפתח צד שרת:

  • Docker הוא כלי מצוין ליצירת תרבות DevOps חזקה לפיתוח יישומים, שכן הוא מבהיר את התפקידים של צוותי הפיתוח וההפעלה.

  • זה גם די גמיש, ומאפשר פריסה קלה של מיקרו-שירותים ויישומי גב שכבתי מפוצלים.

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

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

איך להתקין את דוקר

דוקר הוא כלי חוצה פלטפורמות שניתן להתקין על כל מערכות ההפעלה הפופולריות (Windows, Mac OS וגרסאות Linux). למדריך הזה, אני אדגיש רק איך להגדיר את דוקר על Windows.

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

למשתמשי Windows, חשוב שהמחשב שלך יקיים את המפרטים המינימליים – אחרת ההתקנה לא תהיה מוצלחת. הדרישות המינימליות הן:

  • גרסת מערכת ההפעלה של Windows שאינה פחות מ-Windows 10 Home

  • מחשב עם WSL-2 מותקן או Hypervisor מופעל

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

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

כעכשיו נמשיך לפרויקט עצמו

פרויקט הדמו: כיצד להצפין אפליקצית Node.js

בסעיף זה, נצפין שירות צד אחורי פשוט המבוסס על Node.js עם תלותים מינימליות. זה יראה לך כיצד להצפין ולהעביר אפליקציה באמצעות טכניקת ההצפנה של יישום דוקר הידועה כ-Dockerfile. שימו לב כי אם יש לכם אפליקציה מורכבת יותר, עשוי להיות טוב יותר להשתמש ב-כלי YAML של Docker compose.

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

מהו Dockerfile?

בעצם, Dockerfile הוא מערכת תבניות המאפשרת למשתמש להזין פקודות שעשויות לייצר תמונה פונקציונלית של היישום כאשר הן מבוצעות. תמונה זו יכולה להיות מומרת למיכל.

הנה כמה פקודות הכלולות במבנה הבסיסי של Dockerfile:

  • CMD: קובע את הפקודה המחדלית להרצה אם לא צוין פקודה כאשר המיכל מתחיל. ניתן לדרוס אותה על ידי מתן פקודה כאשר מריצים את המיכל (docker run ...).

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

  • FROM: זוהי בדרך כלל ההצהרה הפותחת בקובץ Dockerfile. פקודה זו שולפת תמונת בסיס המהווה את היסוד לבניית התמונה של היישום המדובר. לדוגמה, ביישום שלנו, תמונת הבסיס עבור יישום Node.js היא להתקין את מנוע Node.js הבסיסי.
  • WORKDIR: תחביר זה מגדיר את תיקיית העבודה הפעילה שבה יימצאו קבצי היישום בתוך המיכל המוגדר. תיקייה אוטומטית תיווצר אם היא עדיין לא זמינה.
  • COPY: תחביר זה משמש כדי להבטיח שהקבצים הנדרשים ליצירת התמונה של Docker מתוך קובץ פרויקט בסיס הקוד יועתקו לתוך הקונטיינר החדש שנוצר. התיקיות של קבצים אלה מודגשות בקפידה.

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

  • ENV: תחביר זה משמש להדגשת משתני סביבה וסודות שיותקנו במהלך תהליך הרצת היישום.

  • EXPOSE: תחביר זה מגדיר את פורט הגלישה שבו היישום משמש לתקשורת עם האינטרנט החיצוני. לדוגמה EXPOSE: 3000 מגדיר את ממשק הווב של היישום לlocalhost:3000.

בהתעמקות ב-Docker, נסקור במהירות כמה פקודות חשובות של Docker שנשתמש בהן במהלך המדריך הזה:

  • Docker ps: פקודה זו מציגה את כל הקונטיינרים הרצים במסוף של Docker שלך.

  • Docker run: פקודה זו מבצעת דימוי Docker כדי להפעיל מופע של קונטיינר.

  • Docker build: פקודה זו פועלת על סמך קובץ Docker כדי לייצר דימוי של שירות או אפליקציה.

  • Docker rm: פקודה זו יכולה לשמש כדי למחוק דימוי באמצעות פרטי ההזדהות של הדימוי.

איך למקם את האפליקציה בקונטיינר

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

בעת בדיקה מקומית, היא מחזירה API מסוג CRUD שבו אתה יכול ליצור, לשלוף, לעדכן ולמחוק מוצרים כאשר זה מבוצע. נארוז את האפליקציה לפריסה קלה בענן באמצעות מנוע Docker שלנו. נוכל לעשות זאת באמצעות כלי Dockerfile שדיברנו עליו למעלה.

שלב 1: צור את ה-dockerfile

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

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

לאחר מכן הכנס את השורה הראשונה:

FROM Node:18-alpine

הפקודה הזו שולפת את התמונה הבסיסית שנשתמש בה כדי להפעיל את האפליקציה שלנו ב-Express שהיא מנוע ה-Node עצמו.

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

שלב 2: הגדר את תיקיית העבודה

WORKDIR /app

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

שלב 3: העתקת הקבצים הנדרשים

COPY package.json

פקודה זו מעתיקה את קובץ package.json שיש בו רשימה של תלויות וחבילות שיש להתקין כדי להפעיל את היישום שלנו.

שלב 4: הפעלת סקריפט התקנה

RUN npm install

פקודה זו מבטיחה שכל התלויות הנדרשות כדי להפעיל את יישומי Node.js שלנו מותקנות על הקונטיינר.

שלב 5: העתקת קבצי הקוד

COPY . .

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

שלב 6: חשיפת פורט השרת



EXPOSE 3000

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

שלב 7: הכללת הפקודה להפעיל את הקונטיינר

CMD ["npm", "run", "dev"]4

פקודה זו מופעלת בסוף כדי להפעיל את יישום Node.js. היא פשוט מריצה את הפקודה npm run dev שהיא מה שתשתמש בו בסביבת פיתוח. כדי להריץ את זה בסביבת ייצור, תשתמש בפקודת npm start במקום.

לאחר שסיימנו את התהליך הזה, כך צריכה להיראות מבנה ה-Dockerfile הסופי:

FROM Node:18-alpine
WORKDIR /app

COPY package.json

RUN npm install

COPY . .

CMD ["npm", "run", "dev"]

בדיקת הקונטיינר של Docker

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

במקרה שלנו, אנו מקצים את השם nodeapp לתמונה שניצור והתמונה תיווצר בתוך תיקיית העבודה.

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

כדי ליצור מופע עובד של התמונה שלך לצורך בדיקה, רוץ את הפקודה docker run nodeapp.

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

כדי להעביר את כתובת ה-URL של MongoDB לקונטיינר של Docker, אנו משתמשים בתגית -e כדי לוודא ש-Docker מזהה את הערך המתאים שהוזן כמשתנה סביבה.

docker run -e JWT_SECRETS={הזן את הערך שלך} -e MONGO_URL={כתובת ה-Mongo שלך} nodeapp.

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

במקרה שאין שגיאות, ניווט ל localhost:5000 אמור גם להניב משהו דומה לתמונה למטה.

סיכום

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

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

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