שמירת המידע של בסיס הנתונים ב Volume
כל כתיבה על מערכת הקבצים של קונטיינר תימחק כשהקונטיינר ייסגר. בשביל לשמור מידע גם להפעלות הבאות של הקונטיינר אנחנו משתמשים ב Volumes.
1. איפה שומרים את המידע
נחזור לחלון הראשון שמריץ את שרת בסיס הנתונים ונסגור את הקונטיינר עם לחיצה על Ctrl+C. אחרי זה נריץ אותו מחדש וננסה שוב להתחבר לבסיס הנתונים ולשלוף את המידע שהיה עליו. התוצאה עשויה להפתיע:
helloworld=# select * from test;
ERROR: relation "test" does not exist
כל המידע שיצרתי בקונטיינר בסיס הנתונים נמחק ברגע שסגרתי את הקונטיינר. ובאמת קונטיינר לא נועד כדי לשמור מידע ואנחנו חושבים על קונטיינרים בתור משהו שיכול כל הזמן להימחק ולהיווצר מחדש מתוך האימג'.
כדי להתגבר על מגבלה זו וכן לאפשר לבסיס נתונים לשמור את המידע בצורה קבועה אנחנו נצטרך למפות "תיקיית עבודה" מהמחשב החיצוני לקונטיינר, כך שהקונטיינר יכתוב את המידע שלו לאותה תיקיה והתיקיה תישאר ושתמור את הקבצים גם כשהקונטיינר ייסגר. דוקר מאפשר לנו שני מנגנוני מיפוי, באחד דוקר שומר אצלו את כל הקבצים ובשני הוא פשוט ממפה תיקיה קיימת על הדיסק. בהמשך הקורס יהיה לנו שיעור ספציפי בנושא זה ובינתיים בואו נראה איך להיעזר במנגנון המובנה של דוקר כדי לשמור את המידע גם אחרי שהקונטיינר נסגר.
תחילה אני יוצר Volume שישמור את המידע וישרוד אחרי הקונטיינר עם:
$ docker volume create pgdata
השם pgdata הוא שם "אזור האחסון" ואני יכול לבחור שם כל שם שארצה. אני יכול גם לראות את כל אזורי האחסון שדוקר כבר יצר עם הפקודה:
$ docker volume ls
ולמחוק אחד עם docker volume rm
.
לאחר היצירה אני מעביר את ה volume לקונטיינר וממפה אותו לתיקיה ספציפית ש Postgres יודע לכתוב אליה:
$ docker run -v pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=ninja -e POSTGRES_USER=ynon -e POSTGRES_DB=helloworld postgres
את התיקיה /var/lib/postgresql/data
לקחתי מהתיעוד של האימג'. רק האימג' יודע לאיזה תיקיות הוא כותב ואיזה תיקיות צריכות להישמר בין הפעלות.
נסו עכשיו שוב את אותו המשחק:
- כניסה מחלון אחר.
- יצירת טבלה והוספת ערכים.
- סגירת הקונטיינר עם בסיס הנתונים והפעלה מחדש.
- כניסה נוספת מהקונטיינר השני כדי לראות שהטבלה והנתונים נשמרו.
פקודות מרכזיות שראינו בפרק:
# Run a DB with persistent volume
$ docker run -d \
-e POSTGRES_PASSWORD=mysecretpassword \
-v volumename:/var/lib/postgresql/data \
postgres
# List all volumes
$ docker volume ls
# Create a volume
$ docker volume create volumename
# Delete a volume
$ docker volume rm volumename