פיתוח אפליקציית אנטרנט + מסד נתונים בדוקר
-
קבלתי כאן המלצות על דוקר, אשמח לקצת יותר הרחבה על איך לפתח אפליקציה (לדוגמא nodejs + phpmyadmin) ולארוז אותה בדוקר.
מפתחים אותה ואז מעבירים? כותבים בדוקר? מה עם התלויות? איך כל זה מסתדר עם השרת?
איך ניגשים אליה "מבחוץ" (מהדפדפן או כל מקום אחר)? אם צריך גישה ישירה לphpmyadmin איך ניגשים אליו?בקיצור, אשמח לקצת עזרה.
תודה
-
קבלתי כאן המלצות על דוקר, אשמח לקצת יותר הרחבה על איך לפתח אפליקציה (לדוגמא nodejs + phpmyadmin) ולארוז אותה בדוקר.
מפתחים אותה ואז מעבירים? כותבים בדוקר? מה עם התלויות? איך כל זה מסתדר עם השרת?
איך ניגשים אליה "מבחוץ" (מהדפדפן או כל מקום אחר)? אם צריך גישה ישירה לphpmyadmin איך ניגשים אליו?בקיצור, אשמח לקצת עזרה.
תודה
שבוע טוב!
זה נושא ענק, ואפשר להרחיב עליו להרבה כיוונים, אנסה להסביר בתמצות מה שלכאורה יעזור לצרכים שלך.
דוקר היא מעיין תמונה של מכונה וירטואלית שיודעת להריץ ״מצב מסויים״ (לא בדיוק, זה יותר תהליך שרץ בסביבה מבודדת אבל זה עוזר להבנה)
ישנם תמונות מוכנות שאנשים העלו כבר לרשת בדרך כלל אל https://hub.docker.com וישנם תמונות שאתה יוצר לבד
למשל את phpmyadmin תוכל להתקין ישירות מכאן.
בשביל ליצור תמונה משל עצמך, אתה יוצר קובץ בשם Dockefile ושם מגדיר לו מספר דברים.
- על בסיס של איזה מכונה לרוץ (node, python, php, ubunto וכדומה)
- איזה קבצים להכניס בפנים
- איזה תלויות להתקין
- עוד כמה הגדרות שאתה יכול להגדיר שם למשל איזה פורטים להוציא החוצה, איזה סקריפט להריץ בסיום וכדומה
ואז אתה מפעיל את התמונה
למשל במבנה תיקיות כזה
. └── mynodejscode ├── package.json ├── package-lock.json └── index.jsנניח שה index.js שלך הוא שרת אקספרסס שמאזין על פורט 8080
אנחנו נרצה להוסיף מכונה ש
- בנויה על בסיס nodejs
- תעתיק את הקובץ package.json ואת package-lock.json
- תריץ בפנים npm i
- אחרי זה תריץ את index.js כי זה תכלס הקוד שלנו
הקובץ Dockerfile שלנו יראה בערך ככה
FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . CMD ["node", "index.js"]עכשיו נעבור לדרך שבה נהוג לנהל מספר Dockerים שרצים ביחד ושייכים לאותו פרויקט (כמו אצלינו שאתה צריך שה nodejs ירוץ עם db + phpmyadmin
יש תוכנה בשם docker compose שיודעת לקחת yml מסודר ולהריץ איתו מספר פרויקטים ביחד.
(יש לה מספר מעלות נוספות חוץ מהסדר, למשל היא יוצרת להם רשת פנימית מחוברת, ואפשר להשתמש בדומיינים שלהם עצמם אבל זה כבר לפעם אחרת..)אם נחזור רגע לתמונה של phpmyadmin שיש ברשת כאן
נראה שיש שם אופציה נוחה להריץ את phpmyadmin דרך docker compose
services: db: image: mariadb:10.11 restart: always environment: MYSQL_ROOT_PASSWORD: notSecureChangeMe phpmyadmin: image: phpmyadmin restart: always ports: - 8080:80 environment: - PMA_ARBITRARY=1מאוד פשוט, מאוד קריא, להריץ את הdb + phpmyadmin דרך קובץ אחד נח
נוסיף קובץ בשם docker-compose.yml
וכרגע מבנה התיקיות שלנו יראה בערך ככה:
. ├── docker-compose.yml └── mynodejscode ├── Dockerfile ├── package.json ├── package-lock.json └── index.jsעכשיו בא נוסיף לדוקר קומפוז את הפרויקט שלנו
אנחנו נרצה שהוא יידע לגשת לdockerfile, לבנות את התמונה שם, ולהריץ אותו על פורט 8090
nodeapp: build: context: ./mynodejscode container_name: my-node-app ports: - "8090:8080"ועכשיו כשנרים אותו עם הפקודה docker compose up -d
3 השירותים שלנו יתרוממו ביחד (db, phpmyadmin, node code) ויהיו נגישים בשרת בכתובות שמיפנו להם (8080 /8090)
עכשיו נשאר להפנות דומיין לשם כדי שיהיו נגישים חיצונית לעולםעל יתר מעללי דוקר קומפוז ודוקר בכללי, ועל האופציות הנוספות שאפשר להוסיף בenv להגדיר איזה פורט ירוצו, והגדרות נוספות תוכל לקרוא ברחבי הרשת או בלינקים לעייל
עריכה: כשנופל קונטיינר (קונטיינר = תמונה שהרמת) של דוקר, הוא מתרומם בדיוק 1:1 כמו שבנית אותו בפעם הראשונה, הקבצים שאתה יוצר בפנים, השינויים שאתה משנה ברמת הdb אם הוא בדוקר, נמחקים כולם כשהוא נופלים, ולכן יש חשיבות גדולה להיכרות עם volume של דוקר, הוא מאפשר לך למפות תיקיה מהשרת, לתוך תיקיה בקונטיינר דוקר שרץ וככה אם הקונטיינר נופל, הנתונים נשמרים בשרת
למשל בפרויקט שלך אם תגדיר
volumes: - ./data:/app/dataזה ימפה את תיקיית data הנוכחית בשרת לכתובת app/data, ומכייון שהסביבת עבודה שלך רצה כבר על /app (כמו שמוגדר בdockerfile) כל מה שתשמור בקוד בתוך data יישמר גם בחוץ
מה שייצור סביבת עבודה כזאת בערך
. ├── docker-compose.yml ├── data/ -- כאן הווליום נשמר └── mynodejscode/ ├── Dockerfile ├── package.json ├── package-lock.json └── index.js -
שבוע טוב!
זה נושא ענק, ואפשר להרחיב עליו להרבה כיוונים, אנסה להסביר בתמצות מה שלכאורה יעזור לצרכים שלך.
דוקר היא מעיין תמונה של מכונה וירטואלית שיודעת להריץ ״מצב מסויים״ (לא בדיוק, זה יותר תהליך שרץ בסביבה מבודדת אבל זה עוזר להבנה)
ישנם תמונות מוכנות שאנשים העלו כבר לרשת בדרך כלל אל https://hub.docker.com וישנם תמונות שאתה יוצר לבד
למשל את phpmyadmin תוכל להתקין ישירות מכאן.
בשביל ליצור תמונה משל עצמך, אתה יוצר קובץ בשם Dockefile ושם מגדיר לו מספר דברים.
- על בסיס של איזה מכונה לרוץ (node, python, php, ubunto וכדומה)
- איזה קבצים להכניס בפנים
- איזה תלויות להתקין
- עוד כמה הגדרות שאתה יכול להגדיר שם למשל איזה פורטים להוציא החוצה, איזה סקריפט להריץ בסיום וכדומה
ואז אתה מפעיל את התמונה
למשל במבנה תיקיות כזה
. └── mynodejscode ├── package.json ├── package-lock.json └── index.jsנניח שה index.js שלך הוא שרת אקספרסס שמאזין על פורט 8080
אנחנו נרצה להוסיף מכונה ש
- בנויה על בסיס nodejs
- תעתיק את הקובץ package.json ואת package-lock.json
- תריץ בפנים npm i
- אחרי זה תריץ את index.js כי זה תכלס הקוד שלנו
הקובץ Dockerfile שלנו יראה בערך ככה
FROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm install COPY . . CMD ["node", "index.js"]עכשיו נעבור לדרך שבה נהוג לנהל מספר Dockerים שרצים ביחד ושייכים לאותו פרויקט (כמו אצלינו שאתה צריך שה nodejs ירוץ עם db + phpmyadmin
יש תוכנה בשם docker compose שיודעת לקחת yml מסודר ולהריץ איתו מספר פרויקטים ביחד.
(יש לה מספר מעלות נוספות חוץ מהסדר, למשל היא יוצרת להם רשת פנימית מחוברת, ואפשר להשתמש בדומיינים שלהם עצמם אבל זה כבר לפעם אחרת..)אם נחזור רגע לתמונה של phpmyadmin שיש ברשת כאן
נראה שיש שם אופציה נוחה להריץ את phpmyadmin דרך docker compose
services: db: image: mariadb:10.11 restart: always environment: MYSQL_ROOT_PASSWORD: notSecureChangeMe phpmyadmin: image: phpmyadmin restart: always ports: - 8080:80 environment: - PMA_ARBITRARY=1מאוד פשוט, מאוד קריא, להריץ את הdb + phpmyadmin דרך קובץ אחד נח
נוסיף קובץ בשם docker-compose.yml
וכרגע מבנה התיקיות שלנו יראה בערך ככה:
. ├── docker-compose.yml └── mynodejscode ├── Dockerfile ├── package.json ├── package-lock.json └── index.jsעכשיו בא נוסיף לדוקר קומפוז את הפרויקט שלנו
אנחנו נרצה שהוא יידע לגשת לdockerfile, לבנות את התמונה שם, ולהריץ אותו על פורט 8090
nodeapp: build: context: ./mynodejscode container_name: my-node-app ports: - "8090:8080"ועכשיו כשנרים אותו עם הפקודה docker compose up -d
3 השירותים שלנו יתרוממו ביחד (db, phpmyadmin, node code) ויהיו נגישים בשרת בכתובות שמיפנו להם (8080 /8090)
עכשיו נשאר להפנות דומיין לשם כדי שיהיו נגישים חיצונית לעולםעל יתר מעללי דוקר קומפוז ודוקר בכללי, ועל האופציות הנוספות שאפשר להוסיף בenv להגדיר איזה פורט ירוצו, והגדרות נוספות תוכל לקרוא ברחבי הרשת או בלינקים לעייל
עריכה: כשנופל קונטיינר (קונטיינר = תמונה שהרמת) של דוקר, הוא מתרומם בדיוק 1:1 כמו שבנית אותו בפעם הראשונה, הקבצים שאתה יוצר בפנים, השינויים שאתה משנה ברמת הdb אם הוא בדוקר, נמחקים כולם כשהוא נופלים, ולכן יש חשיבות גדולה להיכרות עם volume של דוקר, הוא מאפשר לך למפות תיקיה מהשרת, לתוך תיקיה בקונטיינר דוקר שרץ וככה אם הקונטיינר נופל, הנתונים נשמרים בשרת
למשל בפרויקט שלך אם תגדיר
volumes: - ./data:/app/dataזה ימפה את תיקיית data הנוכחית בשרת לכתובת app/data, ומכייון שהסביבת עבודה שלך רצה כבר על /app (כמו שמוגדר בdockerfile) כל מה שתשמור בקוד בתוך data יישמר גם בחוץ
מה שייצור סביבת עבודה כזאת בערך
. ├── docker-compose.yml ├── data/ -- כאן הווליום נשמר └── mynodejscode/ ├── Dockerfile ├── package.json ├── package-lock.json └── index.js@צבי-ש כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
תעתיק את הקובץ package.json ואת package-lock.json
בכוונה לא הוספת את index.js? לכאורה גם הוא אמור להיות בפנים, לא?
@צבי-ש כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
עכשיו נשאר להפנות דומיין לשם כדי שיהיו נגישים חיצונית לעולם
לאיפה? לכתובת הIP של השרת ואז יהיה אפשר להגיע לקבצים האלו דרך פורט 8080 ו8090?
למה צריך גם מריה וגם phpmyadmin? הphpmyadmin לא כולל גם מסד נתונים?
כל פעם שאני מוסיף קובץ ל"אפליקציה" צריך להוסיף אותו גם בcopy בdockerfile או שדרך הvolume זה מתווסף לבד?
יש הבדל בין פרודקשן לפיתוח?
תודה רבה!
-
@צבי-ש כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
תעתיק את הקובץ package.json ואת package-lock.json
בכוונה לא הוספת את index.js? לכאורה גם הוא אמור להיות בפנים, לא?
@צבי-ש כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
עכשיו נשאר להפנות דומיין לשם כדי שיהיו נגישים חיצונית לעולם
לאיפה? לכתובת הIP של השרת ואז יהיה אפשר להגיע לקבצים האלו דרך פורט 8080 ו8090?
למה צריך גם מריה וגם phpmyadmin? הphpmyadmin לא כולל גם מסד נתונים?
כל פעם שאני מוסיף קובץ ל"אפליקציה" צריך להוסיף אותו גם בcopy בdockerfile או שדרך הvolume זה מתווסף לבד?
יש הבדל בין פרודקשן לפיתוח?
תודה רבה!
@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
בכוונה לא הוספת את index.js? לכאורה גם הוא אמור להיות בפנים, לא?
בשלב מאוחר יותר ב dockerfile העתקתי אותו
COPY . .זה בעצם מעתיק את הכל,
דוקר חכם ויודע לבנות מלמעלה למטה (לפי סדר השורות) רק את החלקים שהשתנו,
ולכן קודם כל, אעתיק את הקבצים של התלויות, שמשתנים פחות, ואתקין אותם.
אחרי זה אעתיק את שאר הקוד שמשתנה יותר, והבניה תהיה חסכונית יותר@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
לאיפה? לכתובת הIP של השרת ואז יהיה אפשר להגיע לקבצים האלו דרך פורט 8080 ו8090?
אחרי שאתה מפעיל אותם, הם רצים על השרת בפורט הזה, אם אין חומת אש הם נגישים כרגע ב ip:8080 או ip:8090, אם יש חומת אש אז תפנה לפורטים האלו דומיין כדי שיוכלו להגיע מבחוץ קריאות
@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
למה צריך גם מריה וגם phpmyadmin? הphpmyadmin לא כולל גם מסד נתונים?
לא, הוא רק תצוגה
@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
כל פעם שאני מוסיף קובץ ל"אפליקציה" צריך להוסיף אותו גם בcopy בdockerfile או שדרך הvolume זה מתווסף לבד?
בעיקרון הווליום נועד יותר לחלקים בתמונה שדורשים נתונים בחוץ, למשל מיקום שמירה של קבצי הdb או הורדות או קבצים שאתה רוצה לשתף בין כמה קונטיינרים וכדומה
אפשר טכנית לא להעתיק את כל הפרויקט אלא לשים דוקר לworkfolder הראשי, אבל זה פחות מומלץ, בכל מקרה את קובץ ההרצה עצמו (index.js) ואת קבצי התלויות תצטרך להעתיק בשביל שהבניה עצמה לא תקרוס.אם אתה מוסיף קוד לאפלקיציה, נכון יותר לבדוק אותו במחשב שלך לוקאלית, ואם עובד אצלך לבנות מחדש את התמונה בשרת, להוריד את הקיימת ולהעלות חדשה
@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
יש הבדל בין פרודקשן לפיתוח?
באיזה הקשר?
-
@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
בכוונה לא הוספת את index.js? לכאורה גם הוא אמור להיות בפנים, לא?
בשלב מאוחר יותר ב dockerfile העתקתי אותו
COPY . .זה בעצם מעתיק את הכל,
דוקר חכם ויודע לבנות מלמעלה למטה (לפי סדר השורות) רק את החלקים שהשתנו,
ולכן קודם כל, אעתיק את הקבצים של התלויות, שמשתנים פחות, ואתקין אותם.
אחרי זה אעתיק את שאר הקוד שמשתנה יותר, והבניה תהיה חסכונית יותר@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
לאיפה? לכתובת הIP של השרת ואז יהיה אפשר להגיע לקבצים האלו דרך פורט 8080 ו8090?
אחרי שאתה מפעיל אותם, הם רצים על השרת בפורט הזה, אם אין חומת אש הם נגישים כרגע ב ip:8080 או ip:8090, אם יש חומת אש אז תפנה לפורטים האלו דומיין כדי שיוכלו להגיע מבחוץ קריאות
@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
למה צריך גם מריה וגם phpmyadmin? הphpmyadmin לא כולל גם מסד נתונים?
לא, הוא רק תצוגה
@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
כל פעם שאני מוסיף קובץ ל"אפליקציה" צריך להוסיף אותו גם בcopy בdockerfile או שדרך הvolume זה מתווסף לבד?
בעיקרון הווליום נועד יותר לחלקים בתמונה שדורשים נתונים בחוץ, למשל מיקום שמירה של קבצי הdb או הורדות או קבצים שאתה רוצה לשתף בין כמה קונטיינרים וכדומה
אפשר טכנית לא להעתיק את כל הפרויקט אלא לשים דוקר לworkfolder הראשי, אבל זה פחות מומלץ, בכל מקרה את קובץ ההרצה עצמו (index.js) ואת קבצי התלויות תצטרך להעתיק בשביל שהבניה עצמה לא תקרוס.אם אתה מוסיף קוד לאפלקיציה, נכון יותר לבדוק אותו במחשב שלך לוקאלית, ואם עובד אצלך לבנות מחדש את התמונה בשרת, להוריד את הקיימת ולהעלות חדשה
@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
יש הבדל בין פרודקשן לפיתוח?
באיזה הקשר?
@צבי-ש כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
באיזה הקשר?
בבניה שלו, יש תכונות שמשתמשים בהם רק לצורך פיתוח ולא בטיחותי או נכון להשאיר אותם למוצר עצמו, יש דברים כאלו?
איך מעבירים את מבנה הטבלאות, אם בעצם מורידים את המריה ישירות מהמאגר? ואם רוצים שיגיעו טבלאות עם שורות כבר?
-
@צבי-ש כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
באיזה הקשר?
בבניה שלו, יש תכונות שמשתמשים בהם רק לצורך פיתוח ולא בטיחותי או נכון להשאיר אותם למוצר עצמו, יש דברים כאלו?
איך מעבירים את מבנה הטבלאות, אם בעצם מורידים את המריה ישירות מהמאגר? ואם רוצים שיגיעו טבלאות עם שורות כבר?
@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
בבניה שלו, יש תכונות שמשתמשים בהם רק לצורך פיתוח ולא בטיחותי או נכון להשאיר אותם למוצר עצמו, יש דברים כאלו?
לא מכיר משהו ברמת הדוקר עצמו, אולי ברמת פיתוח האפליקציה עצמה למשל cors או token וכדומה שתרצה להגדיר מן הסתם בקובץ env (או בחלק env שבדוקר קומפוז) למשל
environment: DEBUG: "true"@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
איך מעבירים את מבנה הטבלאות, אם בעצם מורידים את המריה ישירות מהמאגר? ואם רוצים שיגיעו טבלאות עם שורות כבר?
אתה מוריד רק את התוכנה של הdb, בפנים אתה צריך להגדיר הכל מ0 כמו בכל db שקיים.
לגבי המבנה טבלאות, בדרך כלל כשאתה בונה אפלקיציה מסודרת יש שם חלק שנועד ליצור טבלאות בdb תואמות סכמה שאתה משתמש בה, דאטה קלאס או משהו כזה.
לרוב אם המערכת צריכה נתונים ראשוניים בשביל להעלות המפתח ייבנה סקריפט שיודע לבנות את הסכמות של הטבלאות הדרושות, ויודע להכניס לתוכם את הנתונים הבסיסיים החשובים
-
@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
בבניה שלו, יש תכונות שמשתמשים בהם רק לצורך פיתוח ולא בטיחותי או נכון להשאיר אותם למוצר עצמו, יש דברים כאלו?
לא מכיר משהו ברמת הדוקר עצמו, אולי ברמת פיתוח האפליקציה עצמה למשל cors או token וכדומה שתרצה להגדיר מן הסתם בקובץ env (או בחלק env שבדוקר קומפוז) למשל
environment: DEBUG: "true"@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
איך מעבירים את מבנה הטבלאות, אם בעצם מורידים את המריה ישירות מהמאגר? ואם רוצים שיגיעו טבלאות עם שורות כבר?
אתה מוריד רק את התוכנה של הdb, בפנים אתה צריך להגדיר הכל מ0 כמו בכל db שקיים.
לגבי המבנה טבלאות, בדרך כלל כשאתה בונה אפלקיציה מסודרת יש שם חלק שנועד ליצור טבלאות בdb תואמות סכמה שאתה משתמש בה, דאטה קלאס או משהו כזה.
לרוב אם המערכת צריכה נתונים ראשוניים בשביל להעלות המפתח ייבנה סקריפט שיודע לבנות את הסכמות של הטבלאות הדרושות, ויודע להכניס לתוכם את הנתונים הבסיסיים החשובים
-
@צבי-ש אז אם יש כמה קונטיינרים, צריך לפתוח הרבה פורטים? או שיש דרך לטפל בזה?
ומה זה ה8090:8080 שכתבת?@eido כתב בפיתוח אפליקציית אנטרנט + מסד נתונים בדוקר:
@צבי-ש אז אם יש כמה קונטיינרים, צריך לפתוח הרבה פורטים? או שיש דרך לטפל בזה?
כל שירות שמקבל קריאות, רץ על פורט אחר
ומה זה ה8090:8080 שכתבת?
בקונטיינר עצמו יש 65k פורטים אפשריים וכנ״ל בשרת החיצוני
ויש מיפוי בינהם שאומר תעביר את כל הקריאות בשרת שמגיעות אל 8090 אל הקונטיינר בפורט 8080ports: - "8090:8080"