אהלן לכולם, וברוכים הבאים לחלק השישי והאחרון במדריך "דוקר למתחילים בעברית"!
בפרק הזה נכיר את אחד הכלים הכי חשובים ואהובים על כל מי שעובד עם Docker – כלי בשם Docker Compose.
נלמד איך אפשר להפעיל כמה קונטיינרים ביחד בצורה חכמה דרך קובץ אחד, איך לבנות פרויקטים שלמים בצורה אוטומטית, לשתף תיקיות ופורטים, לשלב Dockerfile בתוך Compose, לנהל משתנים עם קובץ .env, ולשלוט באיך ומתי קונטיינרים יופעלו מחדש.
נסיים את הסדרה עם כלים שהופכים את העבודה עם Docker להרבה יותר נוחה, מקצועית, ומוכנה לפרויקטים אמיתיים בעולם האמיתי.
שימו לב ! לפני שאתם ממשיכים לעבור על החלק האחרון, תעברו על חמשת החלקים הראשונים כדי שתבינו על מה מדובר מאחר ובמקרה של דוקר, חשוב מאוד להבין את המושגים ומה בדיוק אנחנו עושים כי הדברים יכולים להיות מבלבלים.
ניתן לעבור על כל החלקים בעמוד המיועד לדוקר בבלוג: מדריך דוקר למתחילים בעברית - כל החלקים
1) מה זה Docker Compose ולמה להשתמש בו?
2) מה זה קובץ docker-compose.yml ואיך הוא בנוי?
3) איך מריצים פרויקט עם docker compose up?
4) איך מכבים ומנקים פרויקט עם ? docker compose down
5) איך מפעילים כמה שירותים (קונטיינרים) ביחד?
6) איך מחברים Volume לקונטיינר דרך Compose?
7) איך לפתוח פורטים דרך Compose?
8) איך משלבים Dockerfile בתוך Compose?
9) איך משתמשים בקובץ .env לשמירת משתנים?
10) איך לגרום לקונטיינרים לעלות אוטומטית אחרי קריסה או הפעלה מחדש?
1.מה זה Docker Compose ולמה להשתמש בו?
אז מה זה בעצם Docker Compose?
מדובר על כלי שמאפשר להריץ כמה קונטיינרים ביחד בצורה קלה ופשוטה, בעזרת קובץ אחד – שלרוב נקרא docker-compose.yml
, או בקיצור "קובץ יאמל".
במקום להפעיל כל פעם קונטיינר אחר באופן ידני, יש לנו אפשרות לבצע הפעלה של כמה קונטיינרים ביחד בצורה אוטומטית, ללא צורך בפקודות ארוכות, והרבה יותר נוח לכתוב הגדרות של כמה קונטיינרים אחד אחרי השני בקובץ אחד – מאשר להתחיל להגדיר כל קונטיינר בנפרד. ואם יש לכם 20 קונטיינרים שצריך להרים? הרבה יותר פשוט לעבוד עם Compose.
והכי כיף – אפשר לתת את הקובץ הזה למישהו אחר, והוא בונה לעצמו את כל הסביבה שאתם עובדים עליה. זאת אומרת שאפשר לשתף את העבודה שלכם בצורה בטוחה, מסודרת, וללא מידע מיותר.
לידע כללי: בתוך docker-compose אפשר להגדיר גם docker file.
2) מה זה קובץ docker-compose.yml ואיך הוא בנוי?
- איזה קונטיינריים להפעיל
- מאיזה אימג' לבנות אותם
- אילו פורטים לפתוח
- אילו תקיות לשתף (אם צריך)
- ועוד כל מיני דברים.
- version – גרסת הפורמט (לא חייבים לכתוב בכלל)
- services – כאן מגדירים את כל הקונטיינרים שנרצה להפעיל.
בתוך כל שירות (service) מגדירים: - image – מאיזה אימג' לבנות
- build – אם רוצים לבנות Image חדש מ-Dockerfile מקומי.
- ports – אילו פורטים לפתוח
- volumes – אילו תיקיות לשתף
- environment – אילו משתנים להעביר
- depends_on – אם יש תלות בין שירותים
ועוד פרמטרים לפי הצורך.
build:
וגם image:
באותו שירות –Docker יבנה את האימג' מה-Dockerfile ואז ייתן לו שם לפי מה שכתבת באימג'
.
משהו עם קצת יותר פרמטרים:
טבלת מפתחות נפוצים בקובץ Docker Compose (docker-compose.yml
):
מפתח | שייך ל... | תיאור קצר |
---|---|---|
version |
רמה עליונה | גרסת הפורמט של הקובץ (למשל: '3.8' ) |
services |
רמה עליונה | רשימת הקונטיינרים שאתה רוצה להרים |
networks |
רמה עליונה | הגדרת רשתות מותאמות אישית |
volumes |
רמה עליונה | הגדרת Volumes לשיתוף קבצים |
configs |
רמה עליונה (Swarm) | קבצי קונפיגורציה למצב swarm |
secrets |
רמה עליונה (Swarm) | קבצי סוד לשימוש מאובטח |
בתוך כל service
מפתח | תיאור קצר |
---|---|
image |
שם ה־Image שממנו נבנה הקונטיינר |
build |
הגדרות לבניית Image מקובץ Dockerfile |
container_name |
שם מותאם אישית לקונטיינר |
command |
פקודה שתורץ בתוך הקונטיינר |
entrypoint |
פקודת כניסה (לפני command ) |
environment |
משתני סביבה (ENV ) |
env_file |
קובץ .env חיצוני |
volumes |
חיבור תיקיות בין הקונטיינר למחשב שלך |
ports |
פתיחת פורטים (למשל 80:80 ) |
networks |
לאיזו רשת הקונטיינר שייך |
depends_on |
אילו שירותים חייבים לרוץ לפניו |
tty |
מדמה מסך (כדי שתוכל להיכנס עם bash ) |
stdin_open |
מאפשר לשלוח קלט (למשל מקלדת) |
restart |
מתי להפעיל מחדש את הקונטיינר (למשל always ) |
healthcheck |
בדיקת תקינות של הקונטיינר |
labels |
תגים מותאמים (לניהול, סינון וכו') |
בתוך networks
מפתח | תיאור קצר |
---|---|
driver |
סוג הרשת (bridge , host , overlay ) |
external |
האם הרשת כבר קיימת מחוץ לקובץ |
name |
שם מותאם אישית לרשת |
ipam |
הגדרת טווחי כתובות IP |
בתוך volumes
מפתח | תיאור קצר |
---|---|
driver |
סוג ה־Volume (לרוב local ) |
external |
האם ה־Volume כבר קיים |
name |
שם מותאם אישית ל־Volume |
3. איך מריצים פרויקט עם Docker Compose (docker compose up)?
לאחר שיצרנו את הקובץ docker-compose.yaml, שלנו, אנחנו נרצה להריץ אותו, בשביל להריץ נרשום:
- -f - לציין נתיב ל Compose אחר במקום ברירת מחדל (docker-compose.yml)
- דוגמה: docker compose -f my-compose-file.yml up
- -d - להפעיל את הקונטיינרים ברקע (Detached mode)
- דוגמה: docker compose up -d
- --build - לבנות מחדש את ה-Images גם אם קיימים כבר
- דוגמה: docker compose up --build
- --force-recreate - להכריח יצירת קונטיינרים חדשים גם אם קיימים קונטיינרים ישנים
- דוגמה: docker compose up --force-recreate
- -d --force-recreate - להרים קונטיינרים חדשים בכוח וגם להריץ אותם ברקע
- דוגמה: docker compose up -d --force-recreate
- -d --build --force-recreate - גם לבנות את ה-Images מחדש, גם להכריח יצירת קונטיינרים חדשים, וגם להריץ ברקע
- דוגמה: docker compose up -d --build --force-recreate
- --remove-orphans - למחוק קונטיינרים "יתומים" שלא מוגדרים יותר בקובץ Compose הנוכחי
- דוגמה: docker compose up -d --remove-orphans
4. איך מכבים ומנקים פרויקט עם docker compose down?
- -v - מוחק גם את ה-Volumes שנוצרו על ידי ה-Compose
- דוגמה: docker compose down -v
- --rmi all - מוחק את כל ה-Images שקשורים לפרויקט (גם אלה שנמשכו וגם אלה שנבנו)
- דוגמה: docker compose down --rmi all
- --rmi local - מוחק רק את ה-Images שנבנו מקומית (לא את ה-Images שנמשכו מהאינטרנט)
- דוגמה: docker compose down --rmi local
- --remove-orphans - מוחק קונטיינרים "יתומים" (קונטיינרים שלא קיימים יותר בקובץ Compose אבל עדיין רצים)
- דוגמה: docker compose down --remove-orphans
- --timeout <seconds> - קובע כמה שניות לחכות לפני שהקונטיינרים ייהרגו בכוח
- דוגמה: docker compose down --timeout 10
5. איך מפעילים כמה שירותים (קונטיינרים) ביחד?
6. איך מחברים Volume (משתפים תיקייה מהמחשב לקונטיינר) ב Docker compose?
וככה זה נראה בתוך קובץ docker-compose:
יש כאן משהו מאוד מוזר (זה יעשה לכם קצת סדר בראש מבחינת איך הדברים עובדים) - איך יכול להיות שקודם מבצעים מיפוי ורק לאחר מייצרים תיקייה?, אני אסביר, כי בתהליך היצירה של הקונטיינר, הדבר האחרון שהמערכת עושה, זה לבצע את השיתוף של התיקייה ולכן כשהשיתוף מתבצע, התיקייה כבר קיימת.
נמשיך, עכשיו נשאר לבנות את הקונטיינרים:
7. איך לפתוח פורטים ב Docker Compose?
תקחו בחשבון שאם אתם לא פותחים פורטים, לא תוכלו לגשת לקונטיינר בשום צורה, הוא יהיה מנותק מהעולם החיצון.
8.איך משלבים Dockerfile בתוך Docker Compose?
נגיד (ומסיבה לא ברורה בעליל) החלטנו לקרוא ל dockerfile שלנו בשם i_love_alpacot_and_docker ואנחנו רוצים לשלב את זה ב docker-compose, וכל זה ירוץ על קונטיינר בשם shnitzel זה יראה ככה:
9.איך משתמשים בקובץ .env לשמירת משתנים?
- משתנים - age=18
- סיסמאות - db_pass=123456
- פורטים - http_port=8080
- כתובת של שרת - server_name=blublu אפשר לשים גם כתובות - server_ip=192.168.1.1
- נתיבים למיניהם - path = /Desktop/shnitzel
- ואם רוצים לראות יותר מידע אודות התהליך מפעילים דיבאג - DEBUG=True
- פקודות דוקר - `docker build -t myapp
- פקודות התקנה - `apt update && apt install nginx`
- תכנים של דוקרפייל - `FROM ubuntu:20.04`
- לוגיקה/תנאים - `if [ $PORT -eq 8080 ]; then echo OK; fi`
- מערכים/אובייקטים - `PORTS=[8080,9090]`
- חישובים מתמטיים -`PORT=8000+1`
- הגדרות של Volume או Network - אסור - `volume_name: myvolume`
הקובץ חייב להיות באותו המקום שבו נמצא ה docker-compose, אחרת המערכת לא תדע להשתמש בו.
10.איך לגרום לקונטיינרים לעלות אוטומטית אחרי קריסה או הפעלה מחדש ב Docker compose?
- `no` - (ברירת מחדל) – לא מנסה להפעיל מחדש בכלל
- `always` - תמיד מנסה להפעיל מחדש – גם אחרי הפעלה מחדש.
- `on-failure` - יפעיל מחדש רק אם הקונטיינר נפל\קרס (Exited עם קוד שגיאה)
- `unless-stopped` - יפעיל מחדש כל עוד לא עצרת אותו בעצמך
אין תגובות:
הוסף רשומת תגובה
מגיב\ה יקר\ה תגובה היא דבר מקובל ביותר, ביקורת בונה גם כן, אם בכוונתך לפרסם, או לקלל, או סתם להגיב ולפוגע באחד ממבקרי הבלוג או כותב הבלוג, אתה מוזמן לחסוך ממני את ביזבוז הזמן במחיקת ההודעה שלך, ופשוט לא לכתוב אותה.
תודה :)