מכונות דוקר שאתם יכולים לקחת

24/04/2019

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

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

1. אובונטו

דוקר מאפשר לכם להתחיל לעבוד על מכונת לינוקס Ubuntu ולהתאמן על פקודות בצורה המהירה ביותר שאפשר להעלות על הדעת. האימג' ubuntu כוללת מכונת אובונטו מלאה ואפשר להפעיל אותה ולקבל משתמש root על המכונה עם הפקודה:

$ docker run -it --rm ubuntu

התוספת -it היא שהופכת את המכונה לאינטרקטיבית: כלומר המכונה משתלטת על הטרמינל ממנו הרצתם את הפקודה ונותנת לכם סביבת עבודה משורת הפקודה על Ubuntu. התוספת --rm גורמת לדוקר למחוק את כל העבודה שלכם ברגע שתסיימו ותצאו מהמכונה. כך תוכלו להפעיל שוב ושוב את המכונה ולא לדאוג ממקום על הדיסק שמתבזבז.

וזה רק משתפר: אתם יכולים להכניס כל תיקיה על המחשב שלכם למכונה הוירטואלית כך שהקבצים על המחשב הרגיל יהיו נגישים מתוך Ubuntu. הפקודה הבאה לוקחת את התיקיה /Users/ynonperek מהמחשב שלי והופכת אותה על המכונה הוירטואלית ל /home/ynon:

$ docker run -it --rm -v /Users/ynonperek:/home/ynon ubuntu

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

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

$ docker ps -a

ואחרי שלקחתם את המזהה שלה תוכלו להפעיל אותה שוב עם (תחליפו את המזהה האחרון במזהה המכונה אצלכם):

$ docker start -a 77ee2a6970eb

בונוס למטיבי לכת: אימג׳ נוסף בשם busybox ייתן לכם סביבת יוניקס הרבה יותר רזה. ביזיבוקס משמש בעיקר ל Embedded Linux אבל אם כל מה שאתם צריכים זה מקום לנסות פקודות לינוקס בסיסיות אולי זה יספיק.

2. נוד ושפות דינמיות

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

נניח שיש לנו סקריפט לנוד עם התוכן הבא בקובץ ששמו demo.js:

console.log('Hello World');

אז מסתבר שגם בלי להתקין את Node עדיין אפשר להריץ את הסקריפט הזה מתוך דוקר. וזה אפילו די קל:

$ docker run -it --rm --name my-running-script -v "$PWD":/usr/src/app -w /usr/src/app node node demo.js

בואו נראה מה עשינו כאן:

  1. הפעלנו מכונה אינטרקטיבית וחד פעמית עם it ו rm, כפי שכבר ראינו עם Ubuntu.

  2. נתנו למכונה שם. זה לא הכרחי אבל נוח כדי לזהות אותה ב docker ps.

  3. מיפינו את התיקיה הנוכחית לתיקיה בשם /usr/src/app בתוך המכונה.

  4. ביקשנו מהמכונה להתחיל לרוץ מתוך התיקיה /usr/src/app כך שהקובץ demo.js יהיה מנקודת המבט שלהם בתיקיה הנוכחית.

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

אגב את הטריק של העברת הפקודה אפשר ליישם גם במכונת Ubuntu, כך שהפקודה הבאה גורמת למכונת האובונטו להידלק, להדפיס hello world על המסך ואז לצאת ולמחוק את עצמה:

$ docker run -it --rm -v /Users/ynonperek:/home/ynon ubuntu echo hello world

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

$ docker run -it --rm -v "$PWD":/usr/src/app -w /usr/src/app python python demo.py

ואם כל מה שאתם צריכים זה סביבה אינטרקטיבית לנסות כמה פקודות נוד - נו מה הבעיה? הנה הפקודה שלכם:

$ docker run -it --rm node node

3. רדיס

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

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

$ docker run -d -v $(realpath ./redis-data):/data -p 6379:6379 redis redis-server --appendonly yes

נראה מה היה לנו כאן:

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

  2. את התוספת -v ראינו כבר בפקודות קודמות, והיא שאחראית על מיפוי התיקיה redis-data מהמכונה שלי למכונה הוירטואלית.

  3. התוספת -p היא חדשה והיא אחראית על חשיפת ה Port. שרת רדיס מקשיב בדרך כלל לחיבורים בפורט 6379, אבל כשהוא רץ על מכונה וירטואלית היחידים שיוכלו להתחבר אליו יהיו יישומים נוספים שרצים על אותה המכונה. בעצם דוקר חוסם לי את הגישה לפורטים הפנימיים של המכונה. העברת המתג -p מבצעת מיפוי של הפורטים, כך שפורט 6379 על המכונה הפנימית יוכר לעולם החיצון בתור פורט 6379 של המכונה החיצונית שלי. זה מה שמאפשר לי להתחבר לשרת ה Redis מתוך המכונה שלי.

  4. את הרעיון של לכתוב פקודה אחרי שם המכונה אנחנו מכירים. כאן שם המכונה הוא redis והפקודה שמפעילה את השרת היא:

redis-server --appendonly yes

4. אנג'ין אקס

המכונה האחרונה לסקירה זו היא שרת Web שמפעיל את Nginx. ניצור קובץ index.html בתיקיה הנוכחית עם התוכן הבא:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Hello World</title>
  </head>
  <body>
    <h1>Hello from Docker</h1>
  </body>
</html>

ונצא לדרך:

$ docker run -v $(realpath .):/usr/share/nginx/html:ro -d -p 8080:80 nginx

הפעם המיפוי הוא לא לאותו פורט כי פורט 80 אצלי על המחשב תפוס - אז בחרתי למפות מפורט 8080 שלי לפורט 80 של המכונה. זה לא מפריע לדוקר ואני יכול לראות את האתר שלי אם אגלוש ל:

http://localhost:8080/

חוץ מזה התיקיה ממופה במצב Read Only בגלל ש Nginx לא צריך לכתוב לתיקיה ממנה הוא מגיש את ה HTML-ים.

5. עכשיו אתם

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

https://hub.docker.com/search/?q=&type=image