במאמר הקודם למדנו על קונטיינר ודוקר והראנו איך אני יכול להריץ קונטיינר שמריץ PHP. ראינו גם שקונטיינר הוא כמו סרוויס, אני יכול להרים כמה כאלו לפי רצוני לפי תבנית מסוימת. במאמר הזה אנו נלמד מעט יותר על תפעול קונטיינרים.
הפעם אנו נלמד באמצעות שימוש בקונטיינר של MySQL. מדובר במסד נתונים שלפי דעתי הוא הכי פופולרי ואני יכול להריץ אותו גם כקונטיינר. כמו בדוגמת ה-PHP, גם כאן אני יכול להשתמש בקובץ הגדרות או להעזר בקובץ הרשמי של MySQL בלי צורך ליצור קובץ הגדרות משלי. כיוון שאנחנו עדיין לא לימדנו על קובץ הגדרות, נלך על קובץ ההגדרות הרשמי שמופיע בדוקר.
כפי שבאתר של דוקר מצוין, חייבים ליצור את הקונטיינר כך:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.6
בואו ונעבור שוב על הפקודה הזו:
docker run –name mysql – הפקודה של docker run היא יצירת הקונטיינר, מה שמגיע אחרי הפלאג של name הוא השם שאנו בוחרים לקונטיינר הזה.
e- זה פלאג שלא הכרנו, הוא מאפשר להכניס משתני סביבה לתוך הקונטיינר עם יצירתו. במקרה הזה אני מכניס את משתנה הסביבה MYSQL_ROOT_PASSWORD. איך אני יודע שאני חייב להשתמש בו? כי כתוב את זה בדוקומנטציה של קובץ ההגדרות הרשמי:
MYSQL_ROOT_PASSWORD
This variable is mandatory and specifies the password that will be set for the MySQL root superuser account
d- אומר שהקונטיינר ירוץ ברקע.
mysql:5.6 השם הרשמי של הקונטיינר, מה שמגיע אחרי הנקודתיים הוא הגרסה. במקרה הזה השתמשתי ב-5.6 אבל בדוקומנטציה יש עוד גרסאות ושמות. השם הזה והגרסאות מופיעות בדוקומנטציה.
אחרי שהרצתי את הפקודה, אני יכול להריץ את
docker ps -a
ולראות שהקונטיינר הזה פעיל!
עכשיו מה? בניגוד ל-PHP, למסד נתונים אני צריך להתחבר. יש כמה דרכים להתחבר למסד נתונים אבל הדרך הפשוטה ביותר היא דרך שורת הפקודה. כן, בדיוק כמו MySQL שמותקן בלינוקס אני יכול להכנס אל הקונטיינר ולהריץ שאילתה! איך עושים את זה? פשוט וקל! הכירו את פקודת docker exec מדובר בפקודה שיכולה להריץ דברים על הקונטיינר. במקרה הזה אני רוצה להריץ את ה-bash שיש בקונטיינר של MySQL. מה זה bash? זה הטרמינל של הקונטיינר. זה הכל.
docker exec -it mysql bash
אז מה יש לנו פה? docker exec היא הפקודה
it- זה פלאגים (נפרדים) שבגדול גורמים לפקודה לפתוח shell משלה.
mysql זה השם של הקונטיינר. שימו לב שזה השם שלו – mysql כפי שהגדרתי עם docker run.
bash זו הפקודה שאני רוצה להריץ.
ברגע שאני עושה את זה אני נכנס לתוך המכונה. אפשר לראות את השם שלה שהוא בעצם hash. אני יכול לשוטט במכונה ולהריץ פקודות כרצוני, אפילו ls -al שמשמעותו בלינוקסית (למי שלא יודע) זה הצגת כל הקבצים והספריות במקום הנוכחי.
עכשיו אני יכול ליצור מסדי נתונים, טבלאות ולהריץ שאילתות ממש כמו בלינוקס.
מי שמכיר קצת יותר לינוקס בטח מבין שאני בכלל לא חייב חלעבור דרך ה-bash, למה לא להגיע מייד אל הסרוויס של MySQL עם docker exec? באופן עקרוני אין שום בעיה לעשות את זה, במקום לקרוא ל-bash, אני אקרא ל-mysql ולא אשכח להכניס את הסיסמה כדי שאני לא אצטרך להקליד אותה כמו ליימעך.
docker exec -it mysql mysql -pmy-secret-pw
אבל ברוב הפעמים יש לי כבר קובץ SQL שאני רוצה להכניס אותו למסד הנתונים שלי. איך אני עושה את זה? גם כאן docker exec בא לעזרתי. אם אני עובד בלינוקס, אז MySQL מאפשר לי בקלות לייבא או לייצא נתונים. הדבר היחידי שאני צריך זה ליצור מסד נתונים. בדוגמה הזו יצרתי מסד נתונים (באמצעות CREATE DATABASE) בשם internet ואני מייבא אליו את מסד הנתונים של האתר הזה.
cat il.sql | docker exec -i mysql /usr/bin/mysql -pmy-secret-pw internet_il
זה הכל. יש כאן קצת סינטקס לינוקסי אבל לא צריך להבהל – בגדול:
cat il.sql – אני לוקח את קובץ il.sql. שימו לב שהוא חייב להיות במקום שבו אני מריץ את הפקודה. באופן דיפולטיבי, ה-shell של דוקר נפתח בחלונות בתיקית המשתמש.
docker exec – אנחנו מכירים
i- פלאג של אינטראקטיביות, מונע מהחיבור להסגר עד סוף הפעולה.
mysql – השם של הקונטיינר
/usr/bin/mysql -pmy-secret-pw internet_il – זו הפקודה שאני מריץ בלינוקס על מנת לייבא נתונים כאשר אני משתמש בסיסמה ובשם מסד הנתונים. זה הכל.
ייצוא הוא פשוט אף יותר עם השורה הזו אני מבצע ייצוא של internet_il לקובץ backup.sql.
docker exec mysql /usr/bin/mysqldump -u root -p=my-secret-pw internet_il > backup.sql
והנה סרטון שבו אני מסביר איך זה עובד:
2 תגובות
כנראה פיספסתי משהוא.
לא מבין מה ההגיון להכניס מסד נתונים לתוך קונטיינר, הרי ברגע שתיצור את הקונטיינר מחדש, כל העדכונים שעשית בנתונים נעלמו?
צודק. בדרך כלל משתמשים בדאטה קונטיינר. אבל יש אפליקציות קטנות שפשוט מרימים אותן ככה. בכל מקרה, זו דרך טובה ללמוד איך להכנס לקונטיינר ולדבג אותו.