WEBA

Docker למתחילים: מה זה קונטיינר, למה כל פרויקט צריך Dockerfile, והפקודות הראשונות

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

804 מילים3 מקורות

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

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

זה חוסך משאבים רבים.

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

המבנה הפנימי של המערכת

המבנה כולו עובד לפי מודל של לקוח מול שרת. הלקוח הוא שורת הפקודה שנקראת docker, או ממשק גרפי, והוא שולח הנחיות ישירות אל daemon שנקרא dockerd. מנהל המערכת dockerd מקשיב לבקשות דרך ממשק REST API באמצעות שקעי UNIX או רשת, והוא מנהל בפועל אובייקטים כמו קונטיינרים, תמונות, רשתות פנימיות ונפחי אחסון. לקוח אחד יכול לתקשר גם עם כמה שרתי dockerd שונים במקביל.

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

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

למה צריך קובץ Dockerfile

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

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

זה מסמך חובה בכל פרויקט.

רכיבתפקיד מרכזי במערכתמצב פעולה
Imageתבנית לקריאה בלבד הכוללת את כל ההוראותקובץ סטטי
Containerמופע פעיל שרץ ומבודד מתוך התמונהתהליך מעבד
Dockerfileקובץ טקסט עם שלבי יצירת התמונההוראות בנייה
Docker Hubמאגר ציבורי ברשת לשיתוף קבצי תמונהשרת אחסון
Docker Composeכלי להגדרת אפליקציות מרובות שירותיםקובץ yaml

הרצת פקודות ראשונות

התפעול השוטף מתבצע בעזרת סט מצומצם של פקודות בשורת הפקודה. לצורך הדוגמה, פתחו טרמינל והפעילו פקודת ריצה אינטראקטיבית: docker run -i -t ubuntu /bin/bash. המנוע בודק תחילה אם קובץ תמונת ubuntu נמצא בדיסק המקומי, ואם הוא חסר, הוא מוריד אותו עצמאית מתוך Docker Hub בדיוק כמו ביצוע ידני של docker pull.

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

כאשר מריצים שרת אינטרנט תרצו שהוא ימשיך לפעול ברקע בלי לתפוס לכם את הטרמינל. לשם כך משתמשים בפקודה docker run עם דגל ההרצה detach יחד עם מיפוי שערים publish. לדוגמה, הפקודה docker run --detach --name welcome --publish 8080:80 docker/welcome-to-docker מורידה את תמונת ההדגמה ומחברת את פורט 80 הפנימי של השרת לפורט 8080 במחשב שלכם. ברגע שהתהליך התחיל, פותחים דפדפן בכתובת המקומית ורואים את העמוד הראשי.

רצף פקודות להקמת תוכנה ראשונה

  1. התקנת חבילת Docker Desktop
  2. הורדת תמונה עם docker pull
  3. הרצת קונטיינר בפקודת docker run
  4. בדיקת סטטוס באמצעות docker ps
  5. עצירת הפעולה בעזרת docker stop

ניהול מערכות מרובות שירותים

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

הכלי מרכז את כל ההגדרות בתוך קובץ שנקרא compose.yaml, ומפעיל את כל המערך בפקודה אחת בלבד: docker compose up. בפרויקט ניהול משימות רשמי שמפורסם בחשבון GitHub של החברה, הקובץ הזה מתאם בין חמישה שירותים שונים שרצים במקביל: ממשק משתמש קדמי, שרת API, מסד נתונים, ממשק ניהול נתונים ייעודי ושרת פרוקסי. הפקודה מורידה את התמונות הדרושות, בונה את הקוד המקומי ומחברת את כל הרכיבים לאותה רשת פנימית.

כדי לבדוק מה רץ על המחשב מריצים את הפקודה docker ps, אשר מציגה טבלה עם מזהה הקונטיינר, שם התמונה, הפורטים הפעילים ושם השירות. אם תרצו לראות גם מופעים שכבר עברו עצירה, תוסיפו את הדגל a לפקודה. בסיום הבדיקות ניתן למחוק קונטיינר בודד בעזרת docker rm --force, או לכבות את כל התשתית שהוקמה יחד בפקודת docker compose down בלי להשאיר שאריות תוכנה בדיסק.

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

מקורות

  • docs.docker.comhttps://docs.docker.com/get-started/docker-overview/
  • docs.docker.comhttps://docs.docker.com/get-started/introduction/
  • docs.docker.comhttps://docs.docker.com/get-started/docker-concepts/the-basics/what-is-a-container/

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