במאמר הקודם למדנו על איך הקובץ Dockerfile מאפשר לנו לבנות Image מקוסטם משלנו, בין אם אנחנו מתבססים על Image קיים או אם אנו רוצים לבנות Image מיוחד משלנו.

קובץ Docker Compose

קובץ Compose הוא קובץ בפורמט YAML אשר בעזרתו אנו מגדירים את תשתית האפליקציה שלנו, כלומר אילו קונטיינרים, רשתות ו-Volumes אנחנו צריכים על מנת להריץ את האפליקציה שלנו.

קובץ זה מאפשר לנו בעצם להגדיר הרצה של קונטיינר אחד או יותר ע״י פירוט השירותים השונים ופרמטרים נוספים ולהריץ אותם ע״י הרצה של פקודה אחת 💪.

Compose לעומת Dockerfile

למדנו שבעזרת Dockerfile אנו יכולים לבנות Image משלנו, אז על פניו למה אנחנו צריכים בעצם את Compose? אז התשובה פה היא שלרוב Image אמור לייצג שירות אחד בלבד.

אם ניקח לצורך העניין אחסון אתר וורדפרס, על פניו אני צריך שירות Web Server כלשהו (Apache או NGINX וכד׳) ושרת מסד נתונים נתמך כמו MySQL. נכון אני יכול לקחת Image של PHP כבסיס ולהגדיר התקנה של שני השירותים הנ״ל.

על פניו זאת פרקטיקה לא נכונה מכיוון שכמו שאמרנו כל Image אמור לייצג שירות אחד, אז אנו נצטרך פה בעצם הגדרה של שתי ה-Image-ים: Web Server ו-Database Server.

על מנת להקל עלינו לנהל את התשתית שלנו ואת ה-Image-ים שאנחנו צריכים לצורך פעולה תקינה של האפליקציה שלנו נשתמש ב-Docker Compose על מנת להגדיר ולעבוד בצורה נוחה יותר 🤓.

מבנה קובץ Docker Compose

קובץ זה לרוב יקרא compose.yml או docker-compose.yml אך ניתן לקרוא לו בכל שם שנרצה כל עוד יש לו סיומת .yml או .yaml. יש לשים לב שבמידה וניתן לו שם אחר, כאשר נרצה להריץ את הקובץ נצטרך לספק את שם הקובץ.

במידה ואתם לא מכירים את פורמט YAML, אל חשש מדובר על פורמט שמאוד קל להבין אותו. הוא בנוי בצורת הרירכייה אשר מוגדר ע״י אינדנטציה.

התוכן של הקובץ לרוב יכלול את המילה services בבסיס ותחתיו יוגדרו רשימת השירותים או הקונטיינרים אותם נרצה להריץ. מלבד לשירותים נוכל להגדיר גם ערכים נוספים, אך הם לרוב פחות שמישים כאשר אנחנו רוצים להגדיר סביבה בסיסית 💁‍♂️.

services:
  webapp:
    image: php:7.4-apache
    container_name: "WebApp"
    ports:
      - "80:80"
    volumes:
      - ./conf/webapp.apache.conf:/etc/apache2/sites-available/000-default.conf
      - ./app:/var/www/html
  database:
    image: mariadb:10.11.2
    container_name: "DatabaseServer"
    ports:
      - "3306:3306"
    environment:
      - MARIADB_USER=dorzki
      - MARIADB_PASSWORD=my_secret_password
      - MARIADB_ROOT_PASSWORD=my_super_secret_password
      - MARIADB_DATABASE=webapp
    volumes:
      - ./data/db:/var/lib/mysql

ניקח לדוגמא את הקובץ הבא, ניתן לראות שבו הגדרנו 2 שירותים אותם נרצה להריץ – webapp ו-database.
ניתן לראות שתחת כל אחד מהם יש מספר אופציות נוספות אשר כל אחת מהן מגדירה יכולת אחרת:

פרמטרהסבר
imageכשמו הוא, הוא יגדיר בעצם איזה Image השירות הנוכחי צריך. הערך יהיה מורכב משם ה-Image, סימן נקודותיים ואז את הגרסה הרצויה (במידה ואנו מעוניינים בגרסה הכי עדכנית ניתן להשמיט או לרשום latest).
container_nameהערך ישקף את שם הקונטיינר, זה מאפשר לנו לתת שם יפה יותר שמשקף את שם השירות.
portsיכול לקבל ערך אחד או מספר ערכים אשר כל אחד מהערכים מוגדר באופן הבא: CONTAINER:LOCAL, כלומר איזה פורט נרצה שהקונטיינר יחשוף ולאיזה פורט זה יהיה נגיש לנו.
environmentרשימה של משתני סביבה אותם ניתן להגדיר אשר יהיו חשופים לקונטיינר עצמו, לרוב אלו משתני סביבה שהקונטיינר צריך, לדוגמא מה הסיסמה שנרצה להגדיר למשתמש root ב-MariaDB.
volumesרשימה של mount-ים אותם נרצה לבצע, כל mount הוא בעצם מיפוי של איזה קבצים אני רוצה שיהיו נגישים לקונטיינר שלי ואיפה הם ישבו. זה יכול להיות גם הפוך, כלומר אלו קבצים אני רוצה שיהיו לי נגישים לוקלית מהקונטיינר עצמו.

כמובן שיש עוד מספר פרמטרים אופציונליים אשר מאפשרים לנו לבצע הגדרות נוספות אשר משפיעות על סדר עליית הקונטיינרים, התנהגות של התאוששות בקונטיינר במקרה של קריסה וכד׳. לרשימה מלאה של הפרמטרים אני ממליץ לעיין בתיעוד הרשמי.

הרצת קובץ Docker Compose

כעת לאחר שיצרנו קובץ את הקובץ, נוכל להריץ אותו בפשטות, כל מה שעלינו לעשות זה לפתוח את הטרמינל, לנווט לנתיב בו נמצא הקובץ ולהריץ את הפקודה הבאה:

docker compose up

לאחר הרצת הפקודה במידה וה-Image-ים לא קיימים לנו לוקלית, דוקר יתחיל להוריד אותם ולבסוף יריץ אותם. אם נכנס ל-Docker Desktop אנחנו אמורים לראות את הקונטיינרים שלנו רצים.

צילום מסך של Docker Desktop המציג את הקונטיינרים שהוגדרו בקובץ Compose

כאשר אנו מריצים את הפקודה הנ״ל כל עוד הטרמינל לא נסגר, הקונטיינרים שלנו יהיו פעילים. על מנת לעצור את הריצה של הקונטיינרים יש ללחוץ על Control + C.

על מנת למנוע מצב שאנחנו צריכים להיות תלויים בטרמינל או בסשן פתוח כדי שהקונטיינרים שלנו ירוצו, אנו יכולים להריץ את הקונטיינרים שלנו בשיטת Detached.

כדי לעשות את זה, כל שעלינו לעשות זה להוסיף -d לפקודה שלנו, ככה שהיא תראה באופן הבא:

docker compose up -d

על מנת לעצור את הקונטיינרים שלנו במידה והרצנו בשיטה הזו, עלינו להריץ את הפקודה הבאה (שימו לב שצריך להיות עדיין בנתיב בו נמצא קובץ ה-Compose שלנו):

docker compose down

סיכום

אז למדנו מה זה קובץ ה-Compose, על פניו קובץ שמהווה את הליבה של עבודה עם Docker כאשר רוצים לעבוד עם דברים יותר מתקדמים.

בפרקים הבאים בסדרה נלמד על דברים מורכבים יותר בהקשר של קובץ זה, יצירת רשתות, שימוש בפרופילים ועוד.

    כתיבת תגובה

    1. נתי

      מאמר מעולה, תודה רבה

      הגב
      1. דור צוברי

        היי נתי 👋,
        שמח לשמוע, מזמין אותך להירשם לעדכונים במייל או בטלגרם.

    אפשר להציע לך עוגיות? יש גם קפה! השימוש בקוקיז עוזר לשפר את הביקור שלך באתר. המשך גלישה אומר שהסכמת למדיניות הפרטיות שלי, וגם לקפה.

    שתפו