על מנת להתמודד עם בעיית התחזוקה השוטפת והעדכונים של סביבות העבודה תחת Linux, הוכנסה לשימוש במעבדה תשתית בשם SIPLDocker אשר משמשת לניהול סביבת העבודה. במדריך זה הסבר קצר על docker ואיך להריץ אותו מתוך המחשבים במעבדה או לאחר התחברות מרוחקת אליהם באמצעות תוכנות כגון NoMachine.
מדריך זה מלווה בסקט הדגמה קצר. מומלץ לקרוא קודם כל את ההסבר ואז לצפות בסרט:
הרצת SIPLDocker
לפני הרצת sipldockr בפעם הראשונה, יש ליצור תיקייה (במקרה זה MyContainer שנמצאת ב-“/~”) אשר תשמש לתכולת הדוקר על כל תכניו, לרבות הגדרות ופרוייקטים שמורים.
SIPLDocker מאפשר שימוש במערכת בהרצת שורת פקודה אחת פשוטה בטרמינל:
sipldocker run –f {path_to_my_folder} {command}

כאשר:
{path_to_my_folder} – כתובת לתיקיה אשר תשמש אתכם להרצה של SIPLDocker.
{command} – הפקודה אותה רוצים להריץ בתוך ה-container. לדוגמה pycharm. במידה ומשאירים שדה זה ריק, יפתח ה -console (שורת הפקודה של-Linux).
כעת הינכם נמצאים בתוך ה-docker, או לחילופין אם זו ההפעלה הראשונה, ה-docker מבצע הורדה לגרסה העדכנית של ה-sipldocker.
חישבו על המחשבים במעבדה ככלי לחישוב. יש להימנע מלשמור על המחשבים חומרים לא מגובים.
התיקייה שיצרנו, הינה התיקייה שממנה ה-docker יקרא ויכתוב את השינויים שנבצע בתוך ה-docker, שם תוכלו למצא למשל את הפרויקטים שכתבתם ב-PyCharm.
הסבר על הפעולות אותן פקודה זו מבצעת:
- במידת הצורך, הורדה למחשב של ה-image העדכני.
- יצירת container (סביבה וירטואלית) אשר מכיל את התוכנות מהרשימה למעלה.
- יצירת משתמש חדש בתוך ה-container הזהה למשתמש שהריץ את הפקודה על המחשב.
- מיפוי של התיקייה מהשדה {path_to_my_folder} לשמש כתיקיית הבית של המשתמש בתוך ה-container, (הנמצאת ב /home/{user_name}).
- מיפוי של מערכת הקבצים של המחשב המארח (תיקיית ה-/) לתקייה /host בתוך ה-container.
- אתחול תיקיית הבית במידה והיא ריקה.
- הרצה של הפקודה מהשדה {command}.
קיימות שתי דרכים לעבודה במעבדה עם SIPLDocker:
הדרך הראשונה היא עם כונן חיצוני שעליו תהיה התיקיה {path_to_my_folder}. כך ניתן להתנייד בקלות ממחשב למחשב. ניתן לקבל ממהנדסי המעבדה דיסק-קשיח חיצוני לצורך זה. כדי לעבוד עם הכונן החיצוני באופן תקין, יש קודם להיעזר בצוות המעבדה כדי לפרמט אותו למערכת הקבצים ext4 של Linux. באופן רגיל, לא ניתן לקרוא דיסק בפורמט ext4 ב-Windows. אם אתם רוצים לעשות זאת, אפשר להשתמש למשל בתכנה החינמית Linux Reader המותקנת במחשבי המעבדה. בדרך עבודה זו, יש ליצור תיקיה חדשה בתוך תיקיית המשתמש אשר נמצא בתיקיה media. לדוגמה, עבור משתמש בשם user ותיקיה חדשה בשם folder, יש לרשום את הפקודה:
sipldocker run -f /media/user/folder/ pycharm
דרך שניה לעבודה במעבדה עם SIPLDocker היא ליצור את התיקיה {path_to_my_folder} בדיסק המקומי של המחשב ללא צורך להגיע פיזית למעבדה. החסרונות של דרך זו הם שקשה יותר להתנייד ממחשב למחשב ושהדיסק המקומי של המחשב מוגבל יותר במקום. לכן, יש להקפיד לא למלא את הדיסק הקשיח (זה עלול לגרום למערכת לקרוס), לנקות את התיקיה אחרי שאתם מסיימים ולגבות לשירות ענן (למשל OneDrive) לא ניתן בשום שלב להניח כי המידע ישמר בדיסק המקומי. בדרך זו, יש ליצור תיקיה חדשה בתוך תיקיית המשתמש אשר נמצא בתיקיה home. לדוגמא, עבור משתמש בשם user ותיקיה חדשה בשם folder, יש לרשום את הפקודה:
sipldocker run -f /home/user/folder/ pycharm
שימו לב:
יש לרשום את הפקודה מתיקיית ה-home. במידה ותיכנסו לתיקיה החדשה שיצרתם ותרשמו: sipldocker run -f pycharm, ההגדרות עבור הפרויקט שלכם לא ישמרו.
במידה והתיקייה {path_to_my_folder}
אינה קיימת, היא תיווצר ע”י המערכת על כל תכולתה. בשימוש הראשון, יש לאפשר למערכת
ליצור תיקיה זו, כלומר יש לתת כתובת לתיקיה שאינה קיימת.
בסיום העבודה, ה-container נמחק ואתו כל מערכת הקבצים שלו. הקבצים יחידים שאינם נמחקים הינם הקבצים
אשר נמצאים בשתי התיקיות שמופו מהמחשב המארח /host ו-home/{username}/ (תיקיית הבית של המשתמש).
בתוך ה-container, מוגדרת סביבת Python המכילה את מרבית הספריות הנפוצות בפרויקטים במעבדה. ההתקנות וההגדרות של סביבה זו נמצאת בתיקיית הבית של המשתמש תחת השם dockvenv (בתיקיה home/{username}/dockvenv/ בתוך ה-container), המשמעות היא שחבילות שתתקינו בסביבה זו (לדוגמה בעזרת pip install) ישמרו בתיקיית הבית שלכם לפעמים הבאות.
הגדרת הסביבה של dockvenv ב-pycharm
כאשר פותחים פרויקט חדש ב-PyCharm, יש לבחור באיזו סביבת Python ברצוננו להשתמש. בשלב זה עלינו להפנות את התוכנה לתיקיה home/{username}/dockvenv/ אשר צוינה בסעיף הקודם. יש לעשות זאת באופן הבא (הוראות אלו מניחות כי זו הפעם הראשונה שאתם מריצים את PyCharm עם תיקיית הבית הנוכחית):
- Run PyCharm inside a container (for example by running “sipldocker run -f /my_folder pycharm”)
- In the first dialog box select “Do not import settings” and press OK
- Select “I confirm ….” and press “Continue”
- Select the “Don’t send..” button
- Select a theme according to your preference and select “Skip Remaining …”
- Select “+ New Project”
- Select a location which is either in your home folder (/home/{your username}) or on a remote device, i.e in /host/media/… – Don’t press Create yet
- Mark the checkbox next to “Inherit global site-packages”
- Mark the checkbox next to “Make available to all projects”
- Press “Create”
- Uncheck the “Show tips on startup” in the “Tip of the Day” window and press close
- At the status bar in the bottom of the window there will a progress bar of PyCharm indexing the available installed packages (this should take about 15-20 min)
תמיד ניתן לשנות את סביבת ה-Python של הפרויקט דרך:
File->Settings->Project:{project name}->Project Interpreter
בכל מקרה, בכל שאלה או בעיה אתם מוזמנים לפנות לצוות המעבדה.
לינוקס וטרמינל
פקודות בסיסיות בלינוקס – http://www.danzig.us/unix_class/hebcommands.html
התמצאות בסיסית באובונטו – https://www.geektime.co.il/ubuntu-101-basic-orientation/
מה זה docker? (מומלץ לקרוא)
docker הוא פלטפורמת תוכנה שמאפשרת לבנות, לשתף ולהריץ יישומים בתוך מיכלים (Containers).
חשוב להדגיש: ה-docker כבר יושב על המחשבים במעבדה ומותקן על המערכת.
בשביל להבין טוב יותר למה צריך פלטפורמה כזאת, בואו נניח שיש לכם מערכת שמורכבת ממספר רכיבים: בסיס נתונים, שרת רשת, שרת יישום, שירותים קטנים שעוזרים ליישום לרוץ ועוד. בלי docker אתם עלולים להיתקל במספר בעיות בעבודה עם מערכת כזאת. קודם כל בסביבת הפיתוח:
- יכול להיות שתרצו לנסות לפתח גרסה חדשה של המערכת מול גרסה חדשה יותר של בסיס הנתונים, אבל עדיין לשמור על בסיס הנתונים הישן מותקן על המחשב כדי לתקן באגים בגרסת ה-production.
- ובעצם אותה הבעיה קיימת עם כל רכיב תשתית שבחרתם – שדרוג של השרת, או של גרסת שפת התכנות או ספריות מסביב. כל אלה יכולים ליצור התנגשויות כשמנסים לשלב מספר גרסאות על אותה מכונת פיתוח.
- כשנכנס מפתח חדש לצוות הוא עלול למצוא את עצמו מבלה יום שלם בהתקנות. התקנת כל החלקים והתשתיות של המערכת על מכונה חדשה נהיית מורכבת יותר ככל שיש יותר רכיבים.
ובאותו האופן בשלב המעבר לייצור אתם עשויים להיתקל במספר בעיות:
- קושי להוסיף או להוריד “שרתים” מהרשת – מאחר וכל שרת צריך להחזיק את כל רכיבי התשתית כדי להריץ את המערכת.
- בעיית ניצול של השרתים הקיימים בגלל התקנות גלובליות – יכול להיות שהשרת שלכם מספיק “פנוי” רוב הזמן כדי להריץ עוד רכיב במערכת, אבל הרכיב הזה דורש גרסv אחרת של בסיס הנתונים ואתם לא רוצים ליצור התנגשות.
docker יודע לפתור חלק גדול מהבעיות האלה באמצעות שימוש במיכלים. כל מיכל מחזיק בתוכו אפליקציה אחת או יותר וה-docker יודע “להפעיל” מיכלים כאלה בתוך סביבה חצי מבודדת. זה לא מכונה וירטואלית נפרדת אלא משהו הרבה יותר קליל. התהליכים והקבצים נשמרים ישירות על המכונה הנוכחית, אבל בנפרד מהמערכת הראשית ובעצם אנחנו נותנים ליישום הרגשה שהוא רץ לבד, למרות שהוא בעצם רץ עם עוד הרבה יישומים אחרים.
חשוב לציין, שבגלל שאין פה הפרדה מוחלטת בין המיכלים, אם מיכל מסוים ירצה לשבור לכם את השרת או להאזין למיכלים אחרים הוא יוכל לעשות את זה. לכן חשוב לזכור שדוקר אינו מכונה וירטואלית וחשוב להריץ רק מיכלים שאתם סומכים עליהם.
מה זה containers ו-images? (מומלץ לקרוא)
לפני שנתחיל לדבר על containers, צריך לדבר על images. image היא חבילה שכוללת את כל מה שיישום צריך כדי לרוץ: הקוד, ספריות בהן הוא תלוי, הגדרות, משתני סביבה וכן הלאה. ה-image נשמר על המחשב ואתם יכולים ליצור ממנו container. ה-container משתמש ביכולות של ה-kernel, הליבה של מערכת ההפעלה ,בכדי לגרום לתהליך להרגיש כאילו הוא רץ לבדו במערכת ההפעלה עם משאבים שמוקצים אך ורק לו.
במעבדה הכנו עבורכם image המכיל מגוון רחב של ספריות הנמצאות בשימוש בפרויקטים במעבדה. image זה, מכיל בין היתר:
- The basic Ubnutu development packages: build-essentianl, cmake, etc.
- Common management tools: git, curl, rsync, etc.
- Terminal based develop tools: vim, tmux, zsh, tig, etc.
- GUI based IDE / editors: PyCharm: and VSCode
- Basic scientific Python packages: NumPy, SciPy, Pandas, etc.
- Python plotting packages: Matplotlib, Plotly, Seaboarn, etc.
- Computer vision and machine learning packages: OpenCV, SciKit-Image, SciKit-learn, etc.
- Deep learning frameworks: Tensorflow and Torch (+ TorchVision)
- Jupyter notebook and JupyterLab
בעיות נפוצות ופתרונן
אם משתמש נוסף נמצא עם חשבון פתוח במחשב ומשתמש ב-docker, יכולה להיווצר בעיית הרשאות. לפני השימוש ב-SIPLDocker יש לוודא שכל המשתמשים במחשב יצאו מהחשבון שלהם (למשל על ידי אתחול המחשב).
לעתים נדרשות גרסאות של הספריות שהן ישנות יותר מאלה שנמצאות ב-SIPLDocker. לשם כך, ניתן לחזור ל-image ישן של SIPLDocker שמכיל את הגרסאות המתאימות, באופן הבא (למשל עבור חזרה לגרסה 0.4):
sipldocker run –f /home/user/folder/ –v v0.4 pycharm
במידה ומתקבלת הודעת שגיאה ב-docker של out of shared memory, ניתן להגדיל את כמות הזיכרון המשותף המוקצה ל-docker ע”י הוספת פרמטרים באופן הבא:
sipldocker run -e “–shm-size=2gb” -f {path_to_my_folder} {command}
תוספות למתקדמים
“/~” לוקח אותנו ישר לתיקיית הבית במחשב המקומי (home/user).
אם ניתן לפקודת הפעלה של docker כתובת לתיקייה שלא קיימת, היא תיווצר באופן אוטומטי.
ניתן להשתמש בתשתית הSIPLDocker על כל מחשב עם GPU עדכני מספיק של NVIDIA. ניתן להוריד אותה מהכתובת הבאה:
https://github.com/jackfeld/sipldocker
את רשימת הארגומנטים ניתן לראות ע”י הרצה של הפקודות:
sipldocker –h
sipldocker run –h