מבוא ל- Docker Compose

1. סקירה כללית

כאשר משתמשים בהרחבה ב- Docker, ניהול של כמה מכולות שונות הופך להיות מסורבל במהירות.

Docker Compose הוא כלי המסייע לנו להתגבר על בעיה זו ו לטפל בקלות במספר מכולות בו זמנית.

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

2. התצורה של YAML הוסברה

בקיצור, Docker Compose עובד על ידי החלת כללים רבים שהוכרזו בתוכו בודד docker-compose.yml קובץ תצורה.

כללי ה- YAML הללו, קריאים אנושיים ומותאמים למכונה, מספקים לנו דרך יעילה לצלם את כל הפרויקט מעשרת אלפים מטרים בכמה שורות.

כמעט כל כלל מחליף פקודת Docker ספציפית כך שבסופו של דבר אנחנו רק צריכים להריץ:

דוקר-להלחין

אנו יכולים לקבל עשרות תצורות המיושמות על ידי Compose מתחת למכסה המנוע. זה יחסוך לנו את הטרחה לכתוב אותם עם Bash או משהו אחר.

בקובץ זה עלינו לציין את ה- גִרְסָה של פורמט הקובץ Compose, לפחות אחד שֵׁרוּת, ובאופציה כרכים ו רשתות:

גרסה: שירותי "3.7": ... כרכים: ... רשתות: ... 

בואו נראה מהם האלמנטים הללו.

2.1. שירותים

ראשית כל, שירותים עיין בתצורת המכולות.

לדוגמה, בואו ניקח יישום אינטרנט ממוגן המורכב מממשק קצה, ממשק קצה ומסד נתונים: סביר להניח שנחלק רכיבים אלה לשלוש תמונות ונגדיר אותם כשלושה שירותים שונים בתצורה:

שירותים: חזית: תמונה: my-vue-app ... backend: image: my-springboot-app ... db: image: postgres ... 

ישנן מספר הגדרות שנוכל להחיל על שירותים, ונחקור אותן לעומק בהמשך.

2.2. כרכים ורשתות

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

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

שוב, נלמד עליהם יותר בסעיף הבא.

3. לנתח שירות

נתחיל כעת לבדוק את ההגדרות העיקריות של שירות.

3.1. משיכת תמונה

לעיתים, התמונה הדרושה לנו לשירותנו כבר פורסמה (על ידינו או על ידי אחרים) ב- Docker Hub, או ברישום אחר של Docker.

אם זה המקרה, אנו מתייחסים אליו באמצעות ה- תמונה תכונה, על ידי ציון שם התמונה והתג:

שירותים: השירות שלי: תמונה: אובונטו: האחרונה ... 

3.2. בניית תמונה

במקום זאת, ייתכן שנצטרך לבנות תמונה מקוד המקור על ידי קריאת התמונה שלה קובץ Docker.

הפעם נשתמש ב- לִבנוֹת מילת מפתח, העברת הנתיב ל- Dockerfile כערך:

שירותים: my-custom-app: build: / path / to / dockerfile / ... 

אנו יכולים גם להשתמש בכתובת אתר במקום בנתיב:

שירותים: my-custom-app: build: //github.com/my-company/my-project.git ... 

בנוסף, אנו יכולים לציין תמונה שם בשילוב עם לִבנוֹת המאפיין, אשר ייתן שם לתמונה לאחר שנוצרה, מה שיהפוך אותה לזמינה לשימוש על ידי שירותים אחרים:

שירותים: my-custom-app: build: //github.com/my-company/my-project.git image: my-project-image ... 

3.3. הגדרת תצורת הרשת

מכולות Docker מתקשרות ביניהן ברשתות שנוצרו, באופן מרומז או באמצעות תצורה, על ידי Docker Compose. שירות יכול לתקשר עם שירות אחר באותה רשת פשוט על ידי הפניה אליו לפי שם המכולה והיציאה (למשל שירות לדוגמא ברשת: 80) בתנאי שהנגשנו את הנמל דרך ה- לַחשׂוֹף מילת מפתח:

שירותים: שירות לדוגמא ברשת: תמונה: karthequian / helloworld: חשיפה אחרונה: - "80" 

במקרה זה, אגב, זה יעבוד גם בלי לחשוף את זה, כי ה לַחשׂוֹף ההנחיה כבר נמצאת בתמונה Dockerfile.

כדי להגיע למכולה מהמארח, יש לחשוף את הנמלים באופן הצהרתי באמצעות יציאות מילת מפתח, המאפשר לנו גם לבחור אם לחשוף את היציאה אחרת במארח:

שירותים: רשת לדוגמא שירות: תמונה: karthequian / helloworld: היציאות האחרונות: - "80:80" ... my-custom-app: image: myapp: היציאות האחרונות: - "8080: 3000" ... my- replica-app-replica: image: myapp: היציאות האחרונות: - "8081: 3000" ... 

יציאה 80 תיראה כעת מהמארח, ואילו יציאה 3000 משני המכולות האחרות תהיה זמינה ביציאות 8080 ו- 8081 במארח. מנגנון רב עוצמה זה מאפשר לנו להריץ מכולות שונות שחושפות את אותן יציאות ללא התנגשויות.

לבסוף, אנו יכולים להגדיר רשתות וירטואליות נוספות להפרדת המכולות שלנו:

שירותים: שירות לדוגמא ברשת: תמונה: karthequian / helloworld: הרשתות האחרונות: - הרשת המשותפת שלי ... שירות אחר-באותה-רשת: תמונה: אלפיני: הרשתות האחרונות: - המשותף שלי- רשת ... שירות אחר ברשת שלו: תמונה: אלפיני: הרשתות האחרונות: - הרשת הפרטית שלי ... רשתות: הרשת המשותפת שלי: {} הרשת הפרטית שלי: {} 

בדוגמה אחרונה זו אנו יכולים לראות זאת שירות אחר באותה רשת יוכלו לפינג ולהגיע לנמל 80 של שירות לדוגמא ברשת, בזמן שירות אחר ברשת שלו רָגִיל.

3.4. הגדרת הכרכים

ישנם שלושה סוגים של כרכים: בעילום שם, נקרא, ו מנחה יחידות.

דוקר מנהל כרכים אנונימיים ושמות כאחד, מרכיב אותם באופן אוטומטי בספריות שנוצרו באופן עצמאי במארח. אמנם אמצעי אחסון אנונימיים היו שימושיים בגירסאות ישנות יותר של Docker (טרום 1.9), אך אלה הם הדרך המומלצת כיום. נפחי מארח מאפשרים לנו גם לציין תיקיה קיימת במארח.

אנו יכולים להגדיר את אמצעי האחסון המארחים ברמת השירות ואת אמצעי האחסון הנקראים ברמה החיצונית של התצורה, כדי להפוך את האחרונים לגלויים למכולות אחרות ולא רק לאלה שהם שייכים:

שירותים: כרכים-דוגמא-שירות: תמונה: אלפיני: הכרכים האחרונים: - השם שלי-כללי-נפח: / שלי-כרכים / בשם-כללי-נפח - / tmp: / הכרכים שלי / נפח מארח - / בית / my-volumes / readonly-host-volume: ro ... אחר-כרכים-שירות לדוגמא: תמונה: אלפיני: הכרכים האחרונים: - my-called-global-volume: / path אחר / אותו-שם- נפח גלובלי ... כרכים: כינוי שלי-גלובלי-נפח: 

כאן, לשני המכולות תהיה גישה לקריאה / כתיבה ל- הכרך העולמי שלי תיקיה משותפת, לא משנה בנתיבים השונים שהם מיפו אותה אליה. שני כרכי המארח, במקום זאת, יהיו זמינים רק ל- כרכים-דוגמא-שירות.

ה / tmp תיקיית מערכת הקבצים של המארח ממופה ל- / כרכים שלי / כרך מארח תיקיית המכולה.

חלק זה של מערכת הקבצים ניתן לכתיבה, מה שאומר שהמכל יכול לא רק לקרוא אלא גם לכתוב (ולמחוק) קבצים במחשב המארח.

אנו יכולים לעלות נפח במצב קריאה בלבד על ידי הוספה : ro לכלל, כמו עבור /בית תיקיה (אנחנו לא רוצים שמכולה של Docker מוחק את המשתמשים שלנו בטעות).

3.5. הכרזת התלות

לעתים קרובות, עלינו ליצור שרשרת תלות בין השירותים שלנו, כך ששירותים מסוימים נטענים לפני (ופורקים לאחר) אחרים. אנו יכולים להשיג תוצאה זו באמצעות תלוי ב מילת מפתח:

שירותים: kafka: image: wurstmeister / kafka: 2.11-0.11.0.3 תלוי_ב: - שומר חיות ... שומר חיות: תמונה: wurstmeister / zookeeper ... 

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

4. ניהול משתני סביבה

עבודה עם משתני סביבה קלה ב- Compose. אנו יכולים להגדיר משתני סביבה סטטיים, וגם להגדיר משתנים דינמיים באמצעות ה- ${} סִמוּן:

services: database: image: "postgres: $ {POSTGRES_VERSION}" סביבה: DB: mydb USER: "$ {USER}" 

ישנן שיטות שונות לספק ערכים אלה להלחין.

לדוגמא, אחד מגדיר אותם בסימן a . env קובץ באותה ספריה, בנוי כמו .נכסים קוֹבֶץ, מפתח = ערך:

POSTGRES_VERSION = USER אלפיני = foo

אחרת, אנו יכולים להגדיר אותם במערכת ההפעלה לפני שנקרא לפקודה:

ייצא POSTGRES_VERSION = ייצוא אלפיני USER = foo docker-compose up 

לבסוף, אנו עשויים למצוא שימוש שימושי באמצעות מעטפת אחת פשוטה במעטפת:

POSTGRES_VERSION = USER אלפיני = foo docker-compose up 

אנו יכולים לערבב בין הגישות, אך בואו נזכור כי Compose משתמש בסדר העדיפויות הבא, ומחליף את הפחות חשובים עם הגבוהים יותר:

  1. חבר קובץ
  2. משתני סביבת מעטפת
  3. תיק סביבה
  4. קובץ Docker
  5. משתנה לא מוגדר

5. קנה מידה והעתקות

בגרסאות Compose ישנות יותר, התאפשר לנו לשנות את גודל המופעים של מיכל דרך ה- סולם docker-compose פקודה. גרסאות חדשות יותר פסלו אותו והחליפו אותו ב- סוּלָם אוֹפְּצִיָה.

מצד שני, אנו יכולים לנצל את Docker Swarm - מקבץ של מנועי Docker - ולשנות את המכולות שלנו באופן אוטומטי בהצהרה דרך העתקים תכונה של לפרוס סָעִיף:

שירותים: עובד: תמונה: dockersamples / examplevotingapp_worker רשתות: - frontend - backend deploy: מצב: העתקים משוכפלים: 6 משאבים: מגבלות: cpus: '0.50' זיכרון: 50M הזמנות: cpus: '0.25' זיכרון: 20M ... 

תַחַת לפרוס, אנו יכולים גם לציין אפשרויות רבות אחרות, כמו סף המשאבים. לחבר, עם זאת, שוקל את השלם לפרוס סעיף רק בעת פריסה לנחיל, ומתעלם מזה אחרת.

6. דוגמה של עולם אמיתי: זרימת נתונים של ענן אביב

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

זרימת נתונים של Spring Cloud היא פרויקט מורכב, אך פשוט מספיק כדי להיות מובן. בואו להוריד את קובץ YAML שלו ולהפעיל:

DATAFLOW_VERSION = 2.1.0.RELEASE SKIPPER_VERSION = 2.0.2.RELEASE docker-compose up 

Compose יוריד, יגדיר ויתחיל כל רכיב ואז חוצים את יומני המכולה לזרימה אחת במסוף הנוכחי.

זה גם יחול צבעים ייחודיים על כל אחד מהם לחוויית משתמש נהדרת:

אנו עשויים לקבל את השגיאה הבאה בהפעלת התקנה חדשה של Docker Compose:

בדיקת הרישום-1.docker.io: אין מארח כזה

אמנם ישנם פתרונות שונים למלכודת הנפוצה הזו, אך באמצעות 8.8.8.8 כפי ש- DNS הוא כנראה הפשוט ביותר.

7. ניהול מחזור חיים

בואו סוף סוף נסתכל מקרוב על התחביר של Docker Compose:

docker-compose [-f ...] [options] [COMMAND] [ARGS ...] 

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

7.1. סטארט - אפ

ראינו שנוכל ליצור ולהפעיל את המכולות, הרשתות והנפחים שהוגדרו בתצורה באמצעות לְמַעלָה:

דוקר-להלחין

אולם לאחר הפעם הראשונה אנו יכולים להשתמש בפשטות הַתחָלָה כדי להתחיל את השירותים:

התחל docker-compose

במקרה שלקובץ שלנו יש שם שונה מזה של ברירת המחדל (docker-compose.yml), אנו יכולים לנצל את -f ו קוֹבֶץ דגלים כדי לציין שם קובץ חלופי:

docker-compose -f custom-compose-file.yml התחל

Compose יכול לרוץ גם ברקע כדמון כאשר הוא מושק עם ה- אוֹפְּצִיָה:

docker-compose up -d

7.2. לכבות

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

תחנת דוקר-להלחין

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

docker-compose למטה

8. מסקנה

במדריך זה למדנו על Docker Compose ואיך זה עובד.

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