כהמשך למאמר על Containerization, היום נדבר על docker.
מה זה docker?
Docker היא פלטפורמה עבור קונטיינריזציה. היא מאפשרת לארוז את האפליקציה עם התלויות שלה ב-container ולהנגיש אותו בצורה נוחה עם פיצ’רים רבים. כך, נוכל להפחית את כמות “הבאגים המייאשים” ולעזור לאפליקציה לרוץ בצורה חלקה בכל סביבה.
איך מתקינים?
מתקינים בעזרת קובץ התקנה עבור windows, וב-linux, ניתן להריץ כמה פקודות שיעשו את זה.
יש תיעוד מלא וברור באינטרנט אז אני מרגיש בנוח לדלג על החלק הזה. כן אגיד שב-windows צריך להיכנס ל windows features ולסמן את Hyper-V ו-Containers.
הסבר על הכוח של container-ים
ראשית, אפשר להסתכל על container כ-process מופרד משאר מערכת ההפעלה ברמת ה-kernel.
אני רוצה להציג בפניכם דוגמא שממחישה את כמות ה-ram המיותרת ש-vm צורך לעומת container.
למי שלא מכיר, ram הוא זיכרון נדיף ויחסית קטן שיש לכל מחשב. הוא עוזר לתוכנות לפעול במהירות המירבית שכן הוא יעיל מאוד מבחינת זמן הגישה לזיכרון.
הסבר לגבי התמונה
ראשית,חשוב לדעת שכאשר מקימים VM, חייבים לקבוע מראש את כמות ה-ram שהוא מקבל. נתחיל מהצד השמאלי של התמונה: ל-VM 1 הקצינו 6GB של ram, לשני הקצינו 4GB ולשלישי 6GB. רק חלק מהזיכרון הזה נמצא בשימוש. מתוך סך הזיכרון שהוקצה (16GB) רק 9GB נמצא בשימוש.
למה זה בעייתי?
ישנם 7GB “תפוסים” שלא ניתן להשתמש בהם מחוץ ל-VM – הזיכרון הזה לא יכול להיות מוקצה מחדש דינמית. זה עלול להיות בעייתי ולבזבז כסף רב כיוון שמשאבים זה דבר יקר, במיוחד כשמדובר בכמות גדולה של שרתים.
איך אפשר להימנע מהבעיה הזאת?
כשמשתמשים ב-docker, כל container מקבל בדיוק את אותה כמות ram שהוא זקוק לה. כך אפשר לחסוך משאבים רבים. לאלו מכם שחושבים “מה אם ה-container יזלול את כל ה ram?” התשובה היא שיש אפשרות להגביל את ניצול המשאבים ב-container.
אם בתוך container נבדוק מה מגבלת ניצול ה-ram, לא נקבל את ניצול ה-ram של ה-container, אלא של ה-host os. בלינוקס, הפיתרון הוא בדיקת תוכן הקובץ /sys/fs/cgroup/memory/memory.limit_in_bytes בתוך ה-container.
משהו חשוב שיכול לחסוך לכם זמן יקר הוא ש-container יכול לעקוף את מגבלת ה-ram שרשומה בקובץ הזה. אסביר עם דוגמא, השורה הבאה מריצה container עם מגבלת זיכרון של 50m:
docker run --memory 50m ubuntu:latest
אם בתוך ה-container נריץ תהליך שטוחן את ה-ram, יכול להיות שה-container ישתמש ב-ram גדול יותר מ-50m. איך אוכפים את זה באמת? לפי התיעוד הרשמי באתר של docker, יש להגדיר גם את ה memory-swap כדי שה-container לא יוכל להוסיף לעצמו ram מה-swap memory. כלומר:
docker run --memory 50m --memory-swap 50m ubuntu:latest
memory swap הוא זיכרון וירטואלי שיושב על הדיסק. משתמשים בו כשה-ram נגמר. הוא איטי יותר כיוון שה-ram הוא זיכרון פיזי שאינו דורש קריאה מהדיסק. על כן, זה עלול להאט את ה-container.
היתרונות הבולטים של docker
- אינטגרציה נוחה עם כלי DevOps אחרים (CI/CD, CM, Monitoring, Testing).
- אפשר להגדיר קובץ שיכניס לי בקלות את כל התלויות למערכת ההפעלה שעליה מבוסס ה-container.
מה יש ב-docker שמנהל container-ים ועוד?
Docker engine
זה בעצם מה שאנחנו מתקינים כדי לגרום ל-docker לעבוד, והוא עובד בתצורת client server application:
- יש רכיב שישמש כשרת. קוראים לו docker daemon, זה process
- cli – דרכו נוכל להריץ פקודות ב-command line ולנהל מגוון של דברים. זה הלקוח
- REST API כדי לאפשר את התקשורת בין שניהם.
ב-Windows או MacOS, כשמתקינים docker, יש Toolbox נוסף שמקבלים. הוא מאפשר להתקין כמה תוכנות נוספות מובנות שב-Linux היו צריכות להיות מותקנות בנפרד (לדוגמא docker-compose):
שני מושגי בסיס חשובים:
Docker image – טמפלייט שממנו אפשר ליצור container-ים.
Container – זה בעצם instance רץ של docker image.
בהמשך נסביר על מושגים מתקדמים יותר. כמו כן, מתוכנן demo שבו נבנה docker image בעצמנו ונריץ אותו.