מה זה docker ולמה זה מגניב לאללה

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

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

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

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

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

היתרונות שדוקר מביא הן:

כלי הגדרה פשוט לייצרת image של המערכת. קובץ ההגדרה של דוקר מאוד פשוט להגדרה. הגדרה של מערכת יכולה לכלול הורדה של כלי תצורה כגון capisrano או ansible, והגדרות ספציפיות לאפליקציה (באמצעות משתנה סביבה, למשל). לאחר שנוצר ה- image ניתן להעלות אותו אל מאגר (repoistory) ומשם להוריד אותו אל מערכות הייצור. אם בעבר, היינו צריכים לגשת לכל מכונה ולבצע את ההגדרות, הרי עכשיו מעלים את האפליקציה "הארוזה". כל מה שנשאר, זה להוריד את הקבצים העדכניים אל המכונות ולהפעיל אותם.

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

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

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

במכונות לינוקס, כאשר מעלים, לדוגמא, מספר מופעים של אפליקציית java, למשל tomcat, שכל אחד מהם לוקח 1gb של זכרון, הרי הצריכה הכללית לא תהיה 10Gb אלא עשויה להיות הרבה פחות, מה שמבטיח יעילות שימוש בחשמל וגם חסכון ניכר בעלויות השימוש בזכרון. אך במקרה של docker, מאחר שהמכונות לא שומרות מידע, מקבלים הלכה למעשה מספר מופעים של אותה אפליקציה, העושים שימוש באותו זכרון, אך מספקים שירות בנפרד.

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

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

ניתן לראות ב- docker מעין נגזרת של git אך במקום לאחסן קוד, מאחסנים אפליקציות, תהליכים. כאשר מבצעים שינוי ב- image, מה שעולה אל ה- repository הוא רק ההבדלים. כך שמובטחת יעילות גבוהה, ובנוסף, ניתן לחזור בקלות אל גירסה קודמת (rollback).

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

אך הבעיה העיקרית היא ניהול הרשתות. אנחנו מעוניניים לדעת בדיוק אילו docker הוזנקו ולהפנות אליהם תעבורה. המרוץ לבניית מערכת התשתית שתיתן פתרון מלא לניהול הנושא נמצא בעיצומו, אך נכון לרגע זה ועד כמה שיודע לי, אין עדיין אף מערכת הנותנת פתרון מלא, למרות שיש כנראה כמה פתרונות טובים מאוד. אני משער שזה עניין של זמן, ולא הרבה. (גוגל ואחרים לוקחים חלק במירוץ). חברות כמו google מדווחות על הזנקה של מאות אלפי dockers כל יום.

לא מדובר על מהלך צדדי של התקדמות טכנולוגית, אלא משהו הנוגע לבסיס התפיסה של האופן שבו מספקים שירות. המשמעות היא כה נרחבת, שנראה שזו אחת הסיבות שמיקרוסופט החליטה לפתוח את מערכות זמן הריצה של טכנולוגיית dotnet כך שהן יוכלו לרוץ תחת לינוקס בעזרת mono. אם בעבר, כדי להריץ אפליקציות dotnet היית צריך שרת חלונות, עם כל הסיבוכיות בניהול מערכות אלו, באמצעות docker ניתן יהיה להזניק בקלות ולנהל צביריים של dotnet הרצים תחת לינוקס. יש גם איזו טענה שטכנולוגיה דומה ל-docker תרוץ תחת חלונות. אך  נראה שבשל חוסר הגמישות של המערכת בנוסף למגבלות ניהול הזכרון (אין shared memory, רק shared library) זו טכנולוגיה שאם תתפתח, תהיה מוגבלת בביצועים וביכולות. יחד עם זה, נראה שמגבלות של מערכות חלונות לבצע עבודה בעומסים גבוהים היא כבר נתון שספק אם ישתנה אי פעם.

 

תגובה אחת בנושא “מה זה docker ולמה זה מגניב לאללה”

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *