שבוע טוב!
זה נושא ענק, ואפשר להרחיב עליו להרבה כיוונים, אנסה להסביר בתמצות מה שלכאורה יעזור לצרכים שלך.
דוקר היא מעיין תמונה של מכונה וירטואלית שיודעת להריץ ״מצב מסויים״ (לא בדיוק, זה יותר תהליך שרץ בסביבה מבודדת אבל זה עוזר להבנה)
ישנם תמונות מוכנות שאנשים העלו כבר לרשת בדרך כלל אל 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