איחסון קבצים ותיקיות מחוץ לקונטיינר
פוסט זה כולל טיפ קצר על Docker. אם אתם רוצים ללמוד יותר לעומק על פיתוח עם Docker, Docker Compose או Kubernetes תשמחו לשמוע שבניתי קורס וידאו מקיף בנושא זה.
למידע נוסף והצטרפות לקורס בקרו בדף קורס Docker כאן באתר.
אנחנו ממשיכים ברצף של דוקר והפעם נרצה להכיר את הפקודה volume ואיך היא עוזרת לנו בבניית אימג'ים גנריים.
הרבה פעמים אנחנו רוצים להשתמש באותו אימג' למספר מטרות, לדוגמא נרצה לבנות אימג' גנרי של שרת Nginx, ולהשתמש באותו אימג' בכמה מערכות או לכמה אתרים.
באמצעות שמירת הקונפיגורציה וקבצים חשובים מחוץ לאימג' נוכל לבנות אימגים גנריים ולהשתמש בהם בהקשרים שונים. זה הרבה יותר נוח מאשר להכין אימג' שונה לכל סביבה.
בנוסף נוכל לשמור מידע במנותק מהקונטיינר כך שהמידע יהיה זמין גם אחרי שהקונטיינר יימחק או יהיה משותף במקביל למספר קונטיינרים.
1. איך זה עובד
הפקודה:
$ docker volume create
יוצרת Volume - שזה כמו תיקיה שאפשר לחבר לקונטיינר. אותה תיקיה נשמרת מחוץ לקונטיינר ולכן שומרת על תוכנה כשהקונטיינר יימחק, ויכולה לשמש כדי להעביר מידע לקונטיינר.
ניצור Volume לדוגמא בשם test עם:
$ docker volume create test
עכשיו נפעיל busybox כדי לערוך קבצים ותיקיות בתוך ה Volume הזה:
$ docker run -it --rm --mount source=test,target=/mnt busybox
בתוך המסוף שנפתח נוכל ליצור קובץ בתיקייה mnt עם קצת טקסט באמצעות vi או כל כלי אחר, ואחרי זה אפשר לצאת מהמסוף עם:
$ exit
צרו קונטיינר חדש וכנסו אליו, בדיוק עם אותה הפקודה שכתבנו קודם. מתוך הקונטיינר תוכלו להציג את הקובץ שיצרתם. לדוגמא אני קראתי לקובץ שלי hello.txt
ולכן אוכל להפעיל:
# cat /mnt/hello.txt
ולראות את התוכן שכתבתי בקונטיינר הקודם.
2. דוגמא: שימוש בקבצי HTML מ Volume חיצוני לשרת Nginx
הרבה אימג'ים מוכנים משתמשים ב Volumes כדי להשאיר את האימג' גנרי. כך לדוגמא האימג' של Nginx שנמצא ב Dockerhub יאפשר לכם להגדיר את קבצי ה HTML הדיפולטיים שישלחו ללקוח באמצעות חיבור Volume לאימג'.
אני חוזר ל Volume שיצרתי ובאמצעות vi יוצר בתוכו את הקובץ index.html עם התוכן הבא:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
נפעיל את האימג' של Nginx עם הפקודה:
$ docker run --mount type=volume,source=test,target=/usr/share/nginx/html -d -p 8080:80 nginx
וכשנגלוש ל localhost:8080
נוכל לראות את קובץ ה HTML שיצרנו נשלח לדפדפן. המיפוי שיצרנו השפיע על ההתנהגות של האימג' של Nginx. נקודת הממשק היחידה שחשוב לזכור היא שם התיקיה מבחינת ה Nginx - כלומר nginx תמיד יסתכל על התיקיה /usr/share/nginx/html
ויצפה למצוא שם את ה HTML-ים להגשה.
3. שימו לב להבדל בין Volumes ל Bind Mounts
ה Volume שיצרנו שמור אצל Docker במנותק מהקונטיינרים שלנו באמצעות דרייבר שנקרא local. זה אומר שכל הקבצים נשמרו בצורה מקומית על המכונה שלנו במקום פנימי לדוקר וחוברות לקונטיינרים. הדבר הזה קצת מזכיר פיצ'ר אחר של דוקר שנקרא Bind Mount, בו דוקר ממפה תיקיה על המכונה שלכם לקונטיינר שרץ על אותה המכונה.
ההבדל הגדול אני חושב בין שני הפיצ'רים הוא שבעבודה עם Volumes אנחנו לא חייבים לחבר תיקיה מהמחשב שלנו. בעת יצירת Volume אנחנו יכולים לבחור דרייבר שינהל את כל האחסון. הדרייבר הדיפולטי נקרא local, אבל אנשים כבר הרחיבו את דוקר עם המון דרייברים אחרים ואפשר למצוא רשימה ארוכה בקישור כאן:
https://docs.docker.com/engine/extend/legacy_plugins/
בגדול תמצאו שם דרייברים ליצירת ווליום על Azure, לעבודה עם NFS ו SSH, לשמירה על Digital Ocean, על NetApp וכמובן על S3.
ייתרון נוסף של Volumes הוא שאנחנו יכולים ליצור אותם באופן אוטומטי מתוך ה Dockerfile, כלומר אפשר לבנות אימג' שכל פעם שניצור ממנו קונטיינר הוא יבדוק אם ה Volume קיים ואם לא ייצור אותו עם מידע ראשוני. זה עוזר כשאתם רוצים ליצור אימג' ולאפשר למשמשים של האימג' להתאים חלק מההגדרות לצרכים שלהם בכל קונטיינר.
מצד שני החיסרון של Volume הוא שעדיין אי אפשר לייצא או לייבא Volume, ולכן בשביל לגשת או לשנות את הקבצים שבתוך ה Volume צריך להצמיד את ה Volume הזה למכונה. בדוגמאות כאן הצמדתי אותו למכונת busybox אותה מחקתי אוטומטית כשסיימתי את השינוי.
4. עוד כמה רעיונות לסיום
האימג' של Nginx מחפש את קבצי הקונפיגורציה שלו בתיקיה /etc/nginx/conf.d/
. אנחנו יכולים ליצור Volume עם קבצי קונפיגורציה ולהעביר אותו ל Nginx בשביל לשלוט בכל ההיבטים של ריצת השרת והגדרות האתרים שעליו.
בעבודה עם בסיסי נתונים הרבה פעמים נרצה שבסיס הנתונים יכתוב ל Volume חיצוני, וכך אם הקונטיינר מתרסק או נמחק תמיד יישאר לנו המידע. לדוקר יש גם אפשרות ליצור Volume חיצוני שיישמר באופן אוטומטי בענן (למשל על S3 או על מכונה אחרת).
וכמובן גם אפליקציות שלנו יכולות להנות מהפיצ'ר הזה. כשאתם כותבים Web Application תוכלו לחפש קבצי קונפיגורציה בתיקייה ידועה, ולטעון את התיקיה הזאת דרך Volume. כך אפשר יהיה להשתמש ב Web Application שלכם בכמה מקומות פשוט על ידי מיפוי Volume אחר לכל אימג'.