אהלן חברים, וברוכים הבאים לחלק הרביעי במדריך "דוקר למתחילים בעברית"!
בחלק הזה נמשיך להעמיק בעבודה עם קונטיינרים ואימג'ים – נלמד איך לראות אילו תהליכים רצים כרגע בתוך קונטיינר, איך לזהות אילו שינויים קרו לו, ואיך לשדרג או לשנות את ההגדרות שלו בלי למחוק אותו.
נתקדם גם ליכולות מתקדמות יותר כמו ייצוא וייבוא של קונטיינרים, העלאה של אימג'ים ל-Docker Hub, יצירת קיצורי דרך (Aliases) שיחסכו לכם זמן, בדיקת היסטוריית שכבות של אימג', שמירת אימג'ים כקבצים ניידים, טעינת אימג'ים מגיבוי, ושימוש חכם ב-Labels לניהול מידע.
בקיצור – שלב קריטי בדרך להפוך למשתמש Docker מקצועי באמת.
שימו לב ! לפני שאתם ממשיכים לעבור על החלק הרביעי, תעברו על שלושת החלקים הראשונים כדי שתבינו על מה מדובר מאחר ובמקרה של דוקר, חשוב מאוד להבין את המושגים ומה בדיוק אנחנו עושים כי הדברים יכולים להיות מבלבלים.
ניתן לעבור על כל החלקים בעמוד המיועד לדוקר בבלוג: מדריך דוקר למתחילים בעברית - כל החלקים
1) איך לראות מה רץ בתוך קונטיינר ממש עכשיו? – docker top
2) איך לדעת אילו שינויים נעשו בקבצים בתוך הקונטיינר? – docker diff
3) איך משנים הגדרות של קונטיינר קיים בלי למחוק ולהריץ אותו מחדש? – docker update
4) איך מייצאים או מייבאים קונטיינר? – docker export ו־docker import
5) איך מעלים את ה Image שיצרנו ל־"Docker Hub" - הפקודה Docker Push
6) איך רואים את ההיסטוריה של כל שכבות ה־Image? - הפקודה docker history
7) איך שומרים Image כקובץ שאפשר להעביר או לגבות? – docker save
8) איך טוענים image תמונה מקובץ ששמרנו קודם? – docker load
9) איך משתמשים ב־Labels בתוך Docker – בשביל להוסיף מידע על קונטיינר, Image או רשת
1. איך לראות מה רץ בתוך קונטיינר ממש עכשיו? – docker top
2. איך לדעת אילו שינויים נעשו בקבצים בתוך הקונטיינר? – docker diff
קונטיינר הוא דבר "חי" ומתבצעים בו שינויים, ולא תמיד אנחנו זוכרים איזה שינויים ביצענו, בדיוק בשביל זה קיימת הפקודה docker diff, היא מראה קבצים שנוספו, קבצים שנמחקו, וקבצים שבוצע בהם שינוי על ידי סימון מיוחד, מיד נראה דוגמא ולאחר מכן אפרש את הסימונים: docker diff leidertech_host_network_test
הסימנים בתחילת השורה, אלו הסימנים שהזכרתי קודם - להלן הפרוש שלהם:
- A - קובץ שנוסף (Added)
- C - קובץ ששונה (Changed)
- D - קובץ שנמחק (Deleted)
מעבר לזה, אין שום פרמטרים נוספים, במידה ולא בוצעו שינויים לא תקבלו שום תגובה מהמערכת, כפי שניתן לראות כאן:
3. איך משנים הגדרות של קונטיינר קיים בלי למחוק ולהריץ אותו מחדש? – docker update
להלן מה ניתן לשנות:
- להגביל זכרון - דוגמא docker update --memory 512m my_container
חשוב לזכור- במידה ובזמן יצירת הקונטיינר לא הגבלתם זכרון, צריך ליצור הגבלה של זכרון וגם הגבלה של זכרון swap (מה שבוינדוס נקרא Virtual Memory) - להגדיר את כמות Swap שהקונטיינר יכול להשתמש בה דוגמא :
docker update --memory-swap 1g my_container - להגביל ליבות מעבד - דוגמא: docker update --cpus 2 my_container
- לקבוע כמות ה"קריאה\כתיבה" לדיסק- דוגמא: docker update --blkio-weight 500 my_container
- להגדיר את מדיניות הפעלה מחדש של הקונטיינר - דוגמא: docker update --restart always my_container
- להגביל את מספר התהליכים שהקונטיינר יכול להפעיל - דוגמא: docker update --pids-limit 100 my_container
- לקבוע את "המשקל" של שימוש במעבד דוגמא - docker update --cpu-shares 1024 my_container
- לקבוע את תקופת הזמן בשימוש ליחידת מעבד אחת דוגמא:
docker update --cpu-period 100000 my_container - לקבוע את המגבלה על כמות זמן המעבד שהקונטיינר יכול להשתמש בו דוגמא:
docker update --cpu-quota 50000 my_container - להפסיק את פעולתו של מנגנון ההרג אוטומטי (OOM Killer) במקרה של חריגה בזיכרון - דוגמא:
docker update --oom-kill-disable my_container
- לא ניתן לשנות את שם התמונה (Image) שהקונטיינר מבוסס עליה
- לא ניתן לשנות את הגדרות הרשת של הקונטיינר (כמו חיבור לרשת bridge או host)
- לא ניתן לשנות את הגדרות הפורטים (הגדרת -p)
- לא ניתן לשנות את הגדרות ה־volumes (הקישורים למערכת הקבצים)
- לא ניתן לשנות את הגדרות ה־mountים (מיקומים במערכת הקבצים)
- לא ניתן לשנות את הגדרות ה־log driver או את פרמטרי הלוגים
- לא ניתן לשנות את הגדרות ה־env variables של הקונטיינר
- לא ניתן לשנות את הגדרות האחסון (storage drivers)
4. איך מייצאים או מייבאים קונטיינר? – docker export ו־docker import
4.א איך מייצאים קונטיים בדוקר? docker export
לפעמים נרצה לשתף קונטיינר, להעביר אותו למחשב אחר או פשוט לגבות אותו. בדיוק בשביל זה יש את הפקודה docker export
, שמאפשרת לייצא קונטיינר לקובץ. הקובץ שנוצר הוא מסוג tar
, שזה סוג הקבצים הדחוסים שיותר נפוץ בלינוקס (כמו zip או rar). ככה אפשר לשמור את הקונטיינר כקובץ אחד מסודר, ואחר כך לייבא אותו בקלות עם docker import
.
לצורך הדוגמא נבצע יצוא של הקונטיינר לקבוץ בשם cont1 לתוך תיקייה בשם Containers על שולחן העבודה,
יצוא מתבצע בעזרת הסימן "<" מאחר והיצוא הוא לתוך קובץ ניתן גם להשתמש ב "o-" (שזה Output), כמו שמייצאים נגיד פלט משורת פקודה:
דוגמא עם הסימן של החץ -
docker export test1 > /home/lev/Desktop/Containers/cont1.tar
- בראשונה (זה עם הסימן של החץ) כותבים את שם הקונטיינר שצריכים בהתחלה:docker export container_name
- בשניה (זה עם הפרמטר o) כותבים שת שם הקונטיינר הקונטיינר שצריכים בסוף:docker export -o path/file_name.tar container_name
לאחר מכן בעזרת הפקודה ls -l ~/Desktop/Containers אציג את התוכן של התיקייה בלי באמת לעבור אליה (טריק מגניב שלינוקס יודע לעשות - למדנו על זה במדריך של לינוקס למתחילים - פה: לינק)
וכפי שניתן לראות, באמת נוצר הקובץ.
4.ב איך לבצע יבוא לקונטיינר? docker import
docker run -d --name restored_container restored_image
(החלק שהוספתי בסוף "tail -f /dev/null" הוא בשביל לגרום לקונטיינר להמשיך לרוץ ברקע ולא להכבות אתם לא חייבים להשתמש בו)
5. איך מעלים את ה Image שיצרנו ל־"Docker Hub" - הפקודה Docker Push
במידה ואנחנו רוצים להעלות את ה-Image שלנו ל DOCKER HUB או לכל ריפוסיטורי אחר, למטרה של שיתוף עם אנשים אחרים, קולגות או סתם לפרסם את ה IMAGE שלנו בעולם, נשתמש ב docker push בשביל להעלות את מה שיצרנו לאינטרנט, במקרה הזה ל Docker Hub.
חשוב לזכור - בשביל שזה יעבוד, אתם צריכים ליצור חשבון ב Docker Hub -זה בחינם.
יצירת חשבון מתבצע באתר הרשמי של Docker בכתובת הזאת: לינק
לאחר מכן בשורת הפקודה נכתוב את הפקודה docker login בשביל לבצע כניסה לחשבון שלנו.
נקבל הודעה כזאת של התחברות דרך דפדפן אינטרנט:
אם אתם לא עובדים בצורה שבה אני עובד, אתם יכולים ללחוץ על הקישור והוא יעבוד לכם בלי בעיה, במידה ואתם מחוברים עם שורת פקודה כמוני, בצעו את הפקודה הבאה: docker login -u your_dockerhub_username
ניתן להקליד את הסיסמא שלכם בלי בעיה - היא לא תופיע על מסך, במידה ועשיתם הכל נכון, תקבלו הודעה שהחיבור הצליח:
עכשיו החלק המעניין, להעלות את מה שאנחנו רוצים לדוקר האב עצמו, אז בעצם השלבים הם די פשוטים:
- בוחרים את האימג' שאנחנו רוצים:
- "מתייגים" אותו עם גירסה מתאימה, כותבים לו את השם של החשבון שלנו ב Docker Hub.
- מעלים את האימג'
- בודקים שהאימג' הגיע בשלום ליעד שלו (לך תדע אולי עשו לו בעיות בביקורת גבולות - רשעים ארורים !)
אני אבחר דווקא את האימג' השמנמן ביותר זה שנקרא nginx.
שלב שני - נצטרך להגדיר לו את כל הפרמטרים האלה בפקודה אחת - לפי הדוגמא הזאת:
- גירסה - ניתן להעלות את אותו האימג' עם כמה גירסאות שונות - זה טוב בשביל לשמור על סדר
- לאיזה חשבון האימג' יעלה
- מה שמו של האימג' שיהיה ברגע שיגיע ל Docker hub
נגיד ועשיתי שינוי לאותו אימג' ואני רוצה לתת לו עכשיו גריסה שונה, אז אני אכתוב את אותה הפקודה אבל את הסוף זאת אומרת את ה TAG אשנה : docker tag nginx leidertech/nginx-custom:leidertec_test
6.איך רואים את ההיסטוריה של כל שכבות ה־Image? - הפקודה docker history
מאחר וכל IMAGE בנוי משכבות (קבצים, הגדרות, ספריות, תוכנות וכד'), לפעמים נרצה לדעת איך האימג' נבנה – בשביל לקבל "תמונת מצב" יותר טובה: באיזה שלב נוספו הקבצים, איזו פקודה יצרה כל שכבה, וכמה מקום היא תופסת. בדיוק בשביל זה נשתמש ב־docker history, שמראה לנו את ההיסטוריה של כל שכבה ושכבה בתוך האימג'. בקיצור – אנחנו רואים את הפעולות שהריץ מי שבנה את האימג', שלב אחר שלב.
פרוש של העמודות:
- Image – מזהה של השכבה (Layer ID). אם מופיע במקום זה missing, זה פשוט אומר ש־Docker לא שומר את המידע הזה אצלך במחשב – לרוב כי השכבה הגיעה ממקום חיצוני או שהיא חלק מהבסיס של האימג'. זה לגמרי תקין ואין מה לדאוג מזה.
- CREATED – מתי השכבה נוצרה (למשל: 9 days ago)
- CREATED BY – איזו פקודה יצרה את השכבה (למשל: RUN, COPY, ENV)
- SIZE – כמה מקום תופסת השכבה (למשל: 118MB)
- COMMENT – הערה שנשמרה בשכבה (לרוב תראה buildkit.dockerfile.v0)
7. איך שומרים Image כקובץ שאפשר להעביר או לגבות? – docker save
מה נשמר כשעושים Docker save?
- שכבות (layers) – כל שלב בבנייה נשמר (כולל base image).
- קובץ manifest.json – מתאר את מבנה ה-image (שכבות, תגיות וכו').
- היסטוריית build – הפקודות מה-Dockerfile (RUN, COPY, ADD וכו').
- תגיות (tags) – כמו myimage:1.2.3.
מטא-דאטה (Meta data) - מה-Dockerfile (אנחנו נלמד מה זה DOCKER FILE בחלקים הבאים):
- CMD – מה מורץ כברירת מחדל.
- ENTRYPOINT – הפקודה הראשית.
- ENV – משתני סביבה.
- EXPOSE – פורטים פתוחים.
- VOLUME – נקודות אחסון.
- WORKDIR – תיקיית העבודה.
- LABEL – תוויות מידע (כמו יוצר ה-image).
- USER – המשתמש שבו יופעל הקונטיינר.
- SHELL – אם הוגדר shell אחר (למשל [ "bash", "-c" ]).
- config.json – הגדרות כלליות של ה-image.
- repositories file – משייך את התגיות ל־image ID.
הסינטקס של הפקודה עם נתיב:
docker save -o full-path-to-output-file.tar image-name:tag
במידה ולא תרשמו את הפרמטר -o
(שזה Output), הקובץ לא יישמר – אלא סתם תודפס לכם שגיאה. לכן צריך לכתוב נתיב. במידה ולא תרשמו נתיב, ובעצם תכתבו את הפקודה בצורה הזאת:
docker save -o myimage.tar leidertech/nginx-custom:latest
במקרה שלי, אני אשמור Image תיקייה שיצרתי על שולחן העבודה בשם Docker_images:
docker save -o /home/lev/Desktop/Docker_images/leidertech_saved_image.tar leidertech/nginx-custom:latest
8. איך טוענים מחדש Image מקובץ ששמרנו קודם? – docker load
אחרי שבסעיף הקודם שמרנו את ה Image לקובץ והעברנו את הקובץ למחשב אחר לדוגמא, נרצה לטעון אותו חזרה, בדיוק למטרה הזאת יש את הפקודה Docker Load שבעצם טוענת (עושה סוג של יבוא לקובץ) את ה Image לתוך המערכת שלנו, בפקודה הזאת יש רק שתי פרמטרים, אחד הוא "i-" (שזה בעצם "input"), שבעצם מאפשר להגיד את הנתיב המלא שבו נמצא הקובץ, במידה ולא תציינו את הנתיב של הקובץ, המערכת תתחיל לחפש אותו בתיקייה שבה אתם נמצאים, הפרמטר השני הוא פרמטר "q-" (שזה בעצם "Quite") במקום לכתוב לכם המון המון פלט ומידע, הוא יעשה את זה עם פחות פלט.
הינה דוגמא לפרמטר i-:
docker load -i [path/to/your/file.tar]
9. איך משתמשים ב־Labels בתוך Docker – בשביל להוסיף מידע על קונטיינר, Image או רשת
"Label" הוא מין תגית קטנה שאפשר להוסיף ל-Image, קונטיינר או רשת, כדי לשמור עליה מידע נוסף.
למשל: מי יצר את ה-Image, מתי הוא נוצר, ומי בכלל צריך אותו?
בקיצור – זה בשביל הידע הכללי שלנו. כי אם יש לכם 500 Images, אני בספק שבעוד חודשיים תזכרו מי מהם שייך למה.
להלן כמה דוגמאות:
- הוספת Label ל-Image בזמן בנייה (אנחנו נלמד על BUILD בחלק הבא)
docker build --label author="Lev Leider" -t myimage . - הוספת Label לקונטיינר בזמן הרצה:
docker run --label project="family_reminder_app" -d nginx - הוספת Label לרשת:
docker network create --label environment="testing" mynetwork - צפייה ב-Labels של Image:
docker inspect myimage - צפייה ב-Labels של קונטיינר:
docker inspect container_id - צפייה ב-Labels של רשת:
docker network inspect mynetwork
אין תגובות:
הוסף רשומת תגובה
מגיב\ה יקר\ה תגובה היא דבר מקובל ביותר, ביקורת בונה גם כן, אם בכוונתך לפרסם, או לקלל, או סתם להגיב ולפוגע באחד ממבקרי הבלוג או כותב הבלוג, אתה מוזמן לחסוך ממני את ביזבוז הזמן במחיקת ההודעה שלך, ופשוט לא לכתוב אותה.
תודה :)