Docker Compose - גבולות זיכרון

Docker Compose Memory Limits



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

אנו מסובבים מיכלים שונים כדי להתמודד עם עומסי עבודה שונים של יישום ואנו משתמשים ב- Docker Compose לשם כך בקלות. כל עומס עבודה שונה מבחינה לוגית מופיע בתור שונה שֵׁרוּת . לדוגמה, שרת ה- http הקדמי שלך יופיע כשירות חזית המריץ אפאצ'י או תמונת Nginx כמכולה.







ניתן לציין את כל השירותים, צרכי הרשת שלהם, דרישות האחסון וכו 'בקובץ docker-compose.yml. נתמקד כאן בציון ניצול הזיכרון.



תזדקק לכלים הבאים בארסנל שלך כדי לעקוב אחר:



  1. הבנה בסיסית של Docker
  2. Docker עבור Windows או Mac או אם אתה מפעיל לינוקס, DockerCE עבור לינוקס
  3. קובץ בינארי של Docker Compose y (משתמשי Windows ו- Mac כבר יתקינו את זה)

אנו נדבק לגרסה 2.4 עבור קבצי docker-compose.yml שלנו שכן היא תומכת בגרסה 17.12 ומעלה של Docker Engine ומעלה. יכולנו ללכת עם גרסה 3 שהיא עדכנית יותר אך היא אינה תומכת בתחביר הגבלת זיכרון ישן. אם אתה מנסה להשתמש בתחביר החדש יותר, הוא מתעקש להשתמש ב- Docker במצב נחיל, במקום זאת. אז כדי לשמור על עניין פשוט עבור משתמשי Docker רגילים אני אעמוד בגרסה 2.4





רוב הקוד יעבוד בדיוק אותו דבר עבור גירסה 3, ובמקום שיהיה הבדל, אזכיר את התחביר החדש יותר עבור משתמשי Docker Swarm.

יישום לדוגמא

ננסה להריץ שירות Nginx פשוט ביציאה 80 באמצעות תחילה CLI ולאחר מכן docker-compose.yml פשוט. בחלק הבא, נחקור את מגבלות הזיכרון והשימוש בו ונשנה את docker-compose.yml שלנו כדי לראות כיצד מוטלות המגבלות המותאמות אישית.



נתחיל שרת nginx פשוט באמצעות Docker-CLI:

$ docker run -d -name my -nginx -p80:80nginx: האחרונה

אתה יכול לראות את שרת nginx פועל על ידי ביקור http: // localhost או להחליף lcoalhost

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

$ docker stats my-nginx

שם מזהה מיכל מעבד % MEM שימוש/LIMIT MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 my-nginx0.00% 2.133MiB / 1.934GiB0.11% 3.14kB / 2.13kB 0B / 0B2

ה- MEM USAGE/LIMIT עומד על 2.133MiB מתוך 1.934GiB הכולל. הבה נסיר מיכל זה ונתחיל לכתוב סקריפטים של חיבור docker.

$ docker stop my-nginx
$ docker rm my-nginx

קובץ ym שווה ערך

ניתן ליצור את המיכל המדויק כאמור לעיל אם נבצע את השלבים הבאים:

$ mkdir my-compose
$ cd my-compose
$ vim docker-compose.yml

אנו יוצרים ספרייה ריקה חדשה ויוצרים בה קובץ docker-compose.yml. כאשר נריץ docker-compose מספרייה זו, הוא יחפש את הקובץ הספציפי הזה (יתעלם מכל השאר) וייצור את הפריסה שלנו בהתאם. הוסף את התוכן הבא בתוך קובץ .yml זה.

גִרְסָה:'3'
שירותים:
my-nginx:
תמונה: nginx: האחרונה
יציאות:
-'80: 80 '

$ docker -compose up -d

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

סטטיסטיקות $ docker -all

שם מזהה מיכל מעבד% MEM שימוש/LIMIT MEM% NET I/O BLOCK I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_10.00% 2.25MiB/1.934GiB0.11% 1.65kB/0B 7.35MB/0B2

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

$docker-compose down

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

מגבלות זיכרון ושמורות זיכרון

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

בגדול, Memory Limit מטיל גבול עליון לכמות הזיכרון שיכולה לשמש מיכל Docker. כברירת מחדל, מיכל Docker, כמו כל תהליך מערכת אחר, יכול להשתמש בכל הזיכרון הזמין של מארח Docker. הדבר עלול לגרום לחריגה מחוץ לזיכרון והמערכת שלך עלולה מאוד לקרוס. גם אם זה אף פעם לא מגיע לזה, זה עדיין יכול להרעיב תהליך אחר (כולל מכולות אחרות) ממשאבים יקרי ערך, ופוגע שוב בביצועים. מגבלות הזיכרון מבטיחות שמכלים רעבים למשאבים לא יעלו על גבול מסוים. זה מגביל את רדיוס הפיצוץ של יישום כתוב גרוע לכמה מכולות, לא למארח כולו.

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

לסכם:

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

אם שמירת הזיכרון גדולה ממגבלת הזיכרון, מגבלת הזיכרון עדיפה.

ציון מגבלות זיכרון ושמורות

גרסה 2

נחזור ל- docker-compose.yml שכתבנו קודם לכן ונוסיף לו מגבלת זיכרון. שנה את הגירסה ל- 2.4 מסיבות שנדונו בסעיף התנאים המוקדמים.

גִרְסָה:'2.4'
שירותים:
my-nginx:
תמונה: nginx: האחרונה
יציאות:
-'80: 80 '
mem_limit: 300 מ '

השורה האחרונה קובעת את הגבול לשירות my-nginx ל- 300MiB. אתה יכול להשתמש ב- k עבור KiB, ו- g עבור GiB ו- b עבור בתים בלבד. עם זאת, המספר לפניו חייב להיות מספר שלם. אינך יכול להשתמש בערכים כמו 2.4m, במקום זאת תצטרך להשתמש ב- 2400k. עכשיו אם אתה רץ:

$ docker stat --all

שם מזהה מיכל מעבד % MEM שימוש/LIMIT MEM % NET I/O BLOCK I/O PIDS
44114d785d0a my-compose_my-nginx_10.00% 2.141MiB/300MiB0.71% 1.16kB/0B 0B/0B2

תבחין שמגבלת הזיכרון מוגדרת ל- 300 MiB. הגדרת הזמנת זיכרון היא קלה לא פחות, פשוט הוסף שורה mem_reservation: xxx בסוף.

גִרְסָה:'2.4'
שירותים:
my-nginx:
תמונה: nginx: האחרונה
יציאות:
-'80: 80 '
mem_limit: 300 מ '
mem_reservation: 100m

גרסה 3 (אופציונלי)

כדי להשתמש בגירסה שלוש עליך להפעיל את Docker במצב נחיל. עבור Windows ו- Mac אתה יכול להפעיל אותו באמצעות תפריט ההגדרות של Docker. משתמשי לינוקס יצטרכו להפעיל את init נחיל docker. מידע נוסף על כך ניתן למצוא פה . עם זאת זה לא צעד הכרחי, ואם לא הפעלת אותו, זה גם בסדר. סעיף זה מיועד לאנשים כְּבָר פועל במצב נחיל ויכול לעשות שימוש בגרסה החדשה יותר.

גִרְסָה:'3'
שירותים:
my-nginx:
תמונה: nginx: האחרונה
יציאות:
-'80: 80 '
לפרוס:
אֶמְצָעִי:
גבולות:
זיכרון: 300 מ '
הזמנות:
זיכרון: 100 מ '

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

מידע נוסף

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

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