JavaRush /בלוג Java /Random-HE /היכרות ראשונה עם דוקר
Viacheslav
רָמָה

היכרות ראשונה עם דוקר

פורסם בקבוצה
מיכליות הוא מנגנון המשמש לעתים קרובות בפועל. לדוגמה, כאשר תחפשו ב-headhunter, תמצאו 477 משרות פנויות נכון להיום שמזכירות את Docker. לכן, זה לא יהיה רעיון רע להכיר את עצמך מה זה. אני מקווה שסקירה קצרה זו תעזור לגבש רעיון ראשון. ובכן, הוא יגבה את זה בחומרים נוספים, כמו קורסים על Udemy. היכרות ראשונה עם Docker - 1

מבוא

בסקירה קצרה זו ברצוני לגעת בנושא כגון קונטיינריזציה. ואתה צריך להתחיל בהבנה מהי בעצם קונטיינריזציה. לפי ויקיפדיה, " Containerization " היא וירטואליזציה ברמת מערכת ההפעלה (כלומר לא חומרה) שבה ליבת מערכת ההפעלה שומרת על מספר מופעים מבודדים של שטח משתמש במקום אחד בלבד. " מרחב משתמש " הוא שטח הכתובות של הזיכרון הוירטואלי של מערכת ההפעלה השמור לתוכניות משתמש. מופעי מרחב משתמש (הנקראים בדרך כלל קונטיינרים) זהים לחלוטין למופע יחיד של מערכת הפעלה מנקודת מבטו של המשתמש. הקרנל מבטיח בידוד מיכל מלא, כך שתוכניות ממכולות שונות לא יכולות להשפיע אחת על השנייה. מסתבר שהקונטיינריזציה היא וירטואליזציה של תוכנה, כלומר וירטואליזציה ברמת מערכת ההפעלה, שעליה אחראי ליבת מערכת ההפעלה. אחד המאפיינים האופייניים לגישה זו הוא שכל הקונטיינרים משתמשים בליבה משותפת, זהה למערכת ההפעלה המארחת (כלומר, זו שעליה נמצאים הקונטיינרים). זה מאפשר לך להיפטר מהתקורה של חיקוי חומרה וירטואלית והשקת מופע מלא של מערכת ההפעלה. אנו יכולים לומר שזו וירטואליזציה "קלת משקל". הקרנל הוא החלק המרכזי של מערכת ההפעלה המספקת ליישומים גישה מתואמת למשאבי מחשב, כגון זמן מעבד, זיכרון, חומרה חיצונית והתקני קלט ופלט חיצוניים. הקרנל גם מספק בדרך כלל שירותי מערכת קבצים ופרוטוקול רשת. באופן כללי, זה הלב של המערכת כולה. למידע נוסף, ייתכן שיהיה שימושי לעיין בחומר " מידע כללי על מכולות ". ועוד כמה מילים כדי להשלים את ההקדמה. כעת יש לנו הבנה שלמערכת הפעלה יש ליבה. זה מספק בידוד עבור מופעי מרחב משתמש. בהקשר זה, אתה עשוי להיתקל במונח " cgroups ". זהו שמו של מנגנון ליבת לינוקס שמאפשר לך להשיג זאת. לכן, אנו יכולים לומר שדרך הקונטיינריזציה התחילה במערכות לינוקס. עם זאת, החל מ- Windows 10, הופיעה גם תמיכה ב-containization. כדי לעבוד עם וירטואליזציה, עליך להגדיר תמיכת וירטואליזציה ב-BIOS של המחשב שלך. איך לעשות זאת תלוי במחשב. לדוגמה, זה עשוי להיראות כך:
היכרות ראשונה עם Docker - 2
ב-Windows אתה יכול לבדוק זאת בדרכים שונות. לדוגמה, אתה יכול להוריד כלי שירות מיוחד מאתר מיקרוסופט: כלי זיהוי וירטואליזציה בעזרת חומרה . ובכן, כדאי להזכיר מושג חשוב נוסף - Hypervisor. Hypervisor הוא צג מכונה וירטואלית, תוכנית להבטחת ביצוע מקביל של מספר מערכות הפעלה על אותו מחשב. ה-Hypervisor מבטיח שמערכות הפעלה מבודדות זו מזו ומשתף משאבים בין מערכת הפעלה פועלת. Hypervisor אחד כזה הוא Oracle VirtualBox .
היכרות ראשונה עם Docker - 3

דוקר

אז מהי וירטואליזציה ברור. אבל איך להשתמש בו? והנה דוקר בא לעזרתנו. Docker היא תוכנה לאוטומציה של פריסה וניהול של יישומים בסביבות מכולות. כדאי להתחיל עם העובדה ש-Docker מיוצג על ידי מושג כמו Docker Enginge. וכדאי להתחיל באתר האינטרנט הרשמי של Docker ובקטע " סקירת Docker ".
היכרות ראשונה עם Docker - 4
התיעוד אומר שדוקר מורכב מ:
  • שרת Docker בשם Docker Daemon process (docerd).
  • ממשק שורת הפקודה, הידוע גם בשם CLI (דוקר).
  • REST API שמתאר כיצד תוכנות יכולות "לדבר" עם השד ולומר לו מה לעשות.
לפני שנצלול לעומק, בואו נתקין את docker, כלומר, נתקין את ה-docer daemon. באתר Docker יש הוראות להתקנת " Docker for Windows ". מעניין, ל-Docker יש דרישות מערכת משלה. ואם יש לך, כמוני, Windows ישן, למשל ווינדוס 7, אז אתה צריך להשתמש ב-Docker Toolbox.
היכרות ראשונה עם Docker - 5

ארגז הכלים של Docker

כדי להתקין את Docker על מכונות ישנות שאינן עומדות בדרישות המערכת. האתר אומר כך, "פתרון שולחן עבודה מדור קודם". בוא נלך לדף " Docker Toolbox " ונורד אותו. סט זה שוקל כ-211 מגה בייט. נתקין אותו כברירת מחדל, כלומר, פשוט נסכים בהכנעה עם הכל מבלי לארגן מחדש את הדגלים. לאחר ההתקנה נבדוק שהכל תקין. בעתיד, שדה הקרב שלנו יהיה שורת הפקודה. אני ממליץ לא להשתמש בשורת הפקודה של Windows, כי עלולות להיות בעיות בלתי ברורות בה. עדיף להשתמש ב-bash shell. בווינדוס, הדרך המומלצת ביותר להשיג את זה היא להתקין את מערכת בקרת גרסאות git , זה עדיין יהיה שימושי. כי "מצורף" איתו יהיה הבאש שאנחנו צריכים. עבור סקירה זו אשתמש ב-git bash. אתה יכול גם להתקין bash עם CYGWIN . בואו נשיק את bash או git bash. בואו נוודא שהתקנו את ה-Docker Machine, הידועה גם בשם Docker Machine: docker-machine -version מהי Docker Machine? Docker Machine הוא כלי עזר לניהול מארחים מעובדים (אלה מארחים שעליהם מותקן Docker Engine). אם מיד לאחר התקנת Docket Toolbox נצפה במכונות docker באמצעות הפקודה docker-machine ls, נראה רשימה ריקה:
היכרות ראשונה עם Docker - 6
בואו ניצור מכונה חדשה. לשם כך, עלינו להפעיל את הפקודה create :: docker-machine create -- driver virtualbox javarushאנו נראה את יומן היצירה של מכונת ה- Docker:
היכרות ראשונה עם Docker - 7
מה שמעניין אותנו כאן זה הדברים הבאים. מה זה Boot2Docker? זוהי הפצת לינוקס מינימליסטית להפעלת Docker Engine (אנחנו מבינים ש-Docker עובד הודות לכלי וירטואליזציה של לינוקס, וב-Windows המנגנון הדרוש הופיע רק החל מ-Windows 10). הפצה זו מבוססת על הפצת " Tiny Core Linux ". הוזכר גם לגבי VirtualBox VM. זה בגלל שציינו --driver virtualbox. מכונה וירטואלית חדשה נוצרה ב-VirtualBox מתוך תמונת Boot2Docker. לאחר היצירה, נוכל להפעיל את VirtualBox (מאחר ו- VirtualBox מותקן עם Docker Toolbox) ולראות את המכונה הווירטואלית שנוצרה עבור מכונת ה- Docker:
היכרות ראשונה עם Docker - 8
לאחר היצירה, נתבקש להפעיל את הפקודה " docker-machine env " כדי לקבל את משתני הסביבה שיש להגדיר כדי להתחבר למחשב הדוק:
היכרות ראשונה עם Docker - 9
לאחר ביצוע פקודה זו באמצעות docker-machine, אנו מתחברים למארח מרוחק (במקרה זה, וירטואלי המתארח ב-Virtual Box) ויכולים לבצע פקודות docker באופן מקומי כאילו אנו מבצעים אותן במארח מרוחק. כדי לבדוק, אנחנו יכולים להפעיל את הפקודה " docker info ". אם החיבור למכונת הדוקר לא נוצר, נקבל שגיאה. ואם הכל בסדר, מידע על הדוקר במכונת הדוקר. עכשיו זה הזמן להבין איך Docker עובד בדרך כלל וכיצד להשתמש בו.
היכרות ראשונה עם Docker - 10

דוקר מכולות

אז יש לנו דוקר. מה זה הדוקר הזה בכלל? התיעוד של Docker והקטע " התחלה " יעזרו לנו להבין זאת . החלק המבוא של סעיף זה מציג את ה-Docker Concepts . הוא קובע כי Docker היא פלטפורמה לפיתוח, איתור באגים והרצת יישומים בקונטיינרים. לכן, הדבר העיקרי עבור Docker הוא מכולות. גם אם מסתכלים על הלוגו של דוקר, מדובר בלווייתן שמחזיק מכולות על גבו. אבל מה זה מיכל? בשלב הבא בקטע " תמונות ומכולות " כתוב שמיכל הוא מופע פועל של תמונה. ותמונה היא "חבילה" המכילה את כל הדרוש לאפליקציה (קוד, סביבה, ספריות, הגדרות וכו'). עכשיו בואו ננסה את זה בעצמנו. באתר Docker יש קטע בשם " דוגמיות Docker " הכולל את " Docker for Beginners ". הדוגמאות מכאן נראות לי יותר מעניינות. אז פתאום רצינו להכיר את Alpine Linux ואנחנו יכולים לעשות זאת באמצעות קונטיינרים של Docker. כדי לקבל תמונה, עלינו "למשוך" או "לשלוף" אותה החוצה. לכן, אנו מבצעים את פקודת ה- docker pull :docker pull apline
היכרות ראשונה עם Docker - 11
כפי שאנו יכולים לראות, אנו מורידים מאיפשהו. כברירת מחדל, Docker מסתכל על המאגר שלו ברשת https://hub.docer.com . לאחר אחזור מוצלח של התמונה, נוכל לבדוק את רשימת התמונות הזמינות על ידי הפעלת פקודת docker images :
היכרות ראשונה עם Docker - 12
עכשיו יש לנו תמונת אפליין. מכיוון שהמכולה היא מופע פועל של תמונה, בואו נשיק את התמונה הזו. בואו נפעיל את המכולה באמצעות הפקודה docker run alpine. כפי שאנו רואים, שום דבר לא קרה. אם נבצע את הפקודה docker psלהצגת כל הקונטיינרים הפעילים, גם לא נקבל כלום. אבל אם נבצע, docker ps -aנראה את כל המיכלים:
היכרות ראשונה עם דוקר - 13
העניין הוא שלא הפעלנו את Docker במצב אינטראקטיבי. לכן, הוא ביצע את הפקודה והפסיק. הפקודה הייתה לפתוח את הטרמינל. בואו נעשה את אותו הדבר, אבל באופן אינטראקטיבי (עם דגל -it ):
היכרות ראשונה עם Docker - 14
כפי שאתה יכול לראות, לאחר שהתגברנו על טעות אחת והשתמשנו ברמז, הגענו למיכל ויכולנו לעבוד בו! כדי לצאת מהמיכל מבלי להפסיק את פעולתו, ניתן ללחוץ על Ctrl + p + q. אם נריץ עכשיו docker ps, נראה מיכל פעיל אחד. כדי להיכנס למיכל שכבר פועל, הפעל את פקודת docker exec :
היכרות ראשונה עם דוקר - 15
אני ממליץ לקרוא את התיאור של מדגם Docker לקבלת תיאור מצוין של איך כל זה קורה: " 1.0 הפעלת המכולה הראשונה שלך ". אני אוהב את זה כי הכל כתוב שם בצורה מאוד נגישה ומובנת. כדי לנסח מחדש בקצרה, אנו מחוברים באמצעות docker-machine למכונה וירטואלית המריץ את Docker Daemon. באמצעות CLI על REST API, אנו מבקשים להפעיל את התמונה האלפינית. Docker מוצא אותו ולכן אינו מוריד אותו. Docker יוצר קונטיינר חדש ומפעיל את הפקודה שציינו במיכל זה. וכל זה, כמובן, טוב. אבל למה אנחנו צריכים את כל זה? וכאן אנחנו צריכים להבין איך docker יוצר תמונה. והוא יוצר אותם על סמך ה-docerfile.
היכרות ראשונה עם Docker - 16

Dockerfile

כפי שנאמר בהפניה של Dockerfile , dockerfile הוא קובץ טקסט המכיל את כל הפקודות להשגת תמונה. למעשה, כל התמונות שאנו מקבלים (אפילו Alpine, מהדוגמה למעלה) נוצרו מקובץ dockerfile. בואו נבנה את התמונה שלנו עם יישום Java. וקודם כל אנחנו צריכים את יישום הג'אווה הזה. אני מציע להשתמש במערכת הבנייה של Gradle, עליה תוכל לקרוא עוד בסקירה קצרה זו: " מבוא קצר ל-Gradle ". יעזור לנו ביצירת הפרויקט " תוסף Gradle Build init ". בואו ניצור יישום Java חדש באמצעות Gradle: gradle init --type java-application פקודה זו יוצרת פרויקט Java תבנית. זוהי אפליקציה עצמאית, אך אנו רוצים ליצור יישום אינטרנט. בואו נסיר את מחלקות האפליקציה וה-AppTest (הן נוצרו אוטומטית על ידי תוסף Gradle Build Init). כדי ליצור במהירות יישום אינטרנט, נשתמש במדריך של Gradle: " בניית יישומי אינטרנט של Java ". לפי המדריך, בוא נעשה: אתה צריך להיות זהיר כאן. כמו תמיד, עשויות להיות שגיאות בדוגמאות. הנה זה:
היכרות ראשונה עם Docker - 17
כעת, כדי לבדוק זאת, בואו נוסיף את התוסף gretty ל-build.gradle, כפי שמצוין בסעיף " הוסף את הפלאגין של gretty והפעל את האפליקציה ":
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
מעניין שגרטי לא רואה את השגיאה ב- HelloServlet, המתוארת למעלה. זה מוכיח שאפליקציה יכולה להתנהג אחרת בסביבות שונות. גרטי יכולה לעבוד במקום שבו שרת עצמאי רגיל יזרוק שגיאה. כל שנותר הוא לבדוק שהאפליקציה פועלת כהלכה. בא נעשה:gradle appRun
היכרות ראשונה עם דוקר - 18
אם הכל בסדר, השתמש בפקודה gradle warכדי לאסוף ארכיון עם מלחמת ההרחבה (ארכיון אינטרנט). כברירת מחדל, gradle בונה אותו ב- \build\libs. כעת, אנחנו מוכנים לכתוב את ה-docerfile שלנו. באמצעות " הפניה של Dockerfile " ניצור Dockerfile. בואו ניצור קובץ בשם "Dockerfile" בשורש פרויקט הג'אווה שלנו (באותו מקום כמו סקריפט ה-build). בואו נפתח אותו לעריכה. לקובץ זה יש פורמט משלו, המתואר בסעיף " הפניה ל-Dockerfile: פורמט ". כל dockerfile מתחיל במשפט FROM, המציין את "תמונת הבסיס". אפשר לומר שזוהי תמונת האב שעל בסיסה אנו יוצרים את התמונה שלנו. קל לנו מאוד לבחור תמונת הורה. יישום אינטרנט צריך שרת אינטרנט. לדוגמה, אנו יכולים להשתמש בשרת האינטרנט של Tomcat. אנחנו הולכים למאגר הדוקר הרשמי, שנקרא docker hub . אנחנו מסתכלים שם כדי לראות אם התמונה שאנחנו צריכים נמצאת שם:
היכרות ראשונה עם דוקר - 19
כדאי גם להבין שתמונת החתול נקראת. אבל חוץ מהשם יש לו תג. תג הוא כמו גרסה. תמונות Tomcat של גרסאות שונות שונות באיזו גרסה של Tomcat משתמשים, באיזו גרסה של jre ואיזו תמונת בסיס. לדוגמה, אנו יכולים לקבל תמונה. docker pull tomcat:9-jre8-alpine היא משתמשת בגרסה 9 של tomcat, בגרסה 8 של jre ובתמונה האלפינית כבסיס. זה יכול להיות חשוב כדי להקטין את גודל התמונה שלנו:
היכרות ראשונה עם דוקר - 20
כפי שאנו יכולים לראות, ההבדל הוא עצום. אם נבנה את התמונה שלנו על בסיס tomcata alpine, נתחיל עם 100 מגה בייט בלבד, ולא עם 600. בהתאם, נוסיף את התוכן הבא לקובץ dockerfile שנוצר בעבר:
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
ועכשיו בואו נבצע את הפקודה לבניית התמונה: docker build -t jrdocker ..
היכרות ראשונה עם דוקר - 21
-t- זה תג, כלומר איך לקרוא לתמונה המורכבת. המשמעות של הנקודה בסוף היא שאנו מוסיפים את הספרייה הנוכחית (הספרייה שבה נמצא ה-docerfile וממנה הרצנו את הפקודה) אל Build context. Build context- זהו ההקשר של אותם קבצים הזמינים בעת יצירת dockerfile. כפי שאתה יכול לראות, הודות לכך הצלחנו להעתיק את קובץ המלחמה המורכב לתמונה שלנו, לתוך ספריית שרת האינטרנט. עכשיו בואו נריץ את התמונה שלנו:docker run -d --rm -p 8888:8080 jrdocker
היכרות ראשונה עם דוקר - 22
כדי להבין אם השרת התחיל, אתה יכול להסתכל על היומן מהקונטיינר. ניתן להשיג את היומן באמצעות פקודת docker logs, תוך ציון המיכל לפי המזהה או השם שלו. לדוגמה:
היכרות ראשונה עם דוקר - 23
ובכן, אל תשכח שתמיד נוכל ללכת לקונטיינר פועל לפי שם עם הפקודה: winpty docker exec -it NameКонтейнера sh עכשיו כל מה שנותר הוא להתחבר. בעבר, ציינו את EXPOSE , כלומר אפשרנו גישה לפורט 8080 מתוך הקונטיינר. כשהשקנו את הקונטיינר עצמו, ציינו את התג -p ( incoming ports ), ובכך עשינו קורלציה לפורט 8080 בקונטיינר (שרת האינטרנט של Tomcat מחכה לחיבורים שם) עם היציאה 8888 במחשב עם דמון docker. כזכור, השקנו את דמון הדוקר לא ישירות, אלא דרך docker-machine. לכן, בואו נבקש שוב נתונים על מכונות ה-docer שלנו באמצעות הפקודה docker-machine ls וניצור קשר עם השרת במיכל:
היכרות ראשונה עם Docker - 24
לפיכך, אתה ואני בדיוק השקנו את אפליקציית האינטרנט שלנו במיכל Docker! ) ברצוני לציין גם את הדברים הבאים. במקרה של בעיות גישה, כדאי לזכור שמכונת ה-Docker היא בראש ובראשונה מכונה וירטואלית של Virtual BOx. ייתכנו בעיות בהגדרות הרשת של המחשב הווירטואלי. תצורת VMBox עובדת עשויה להיראות כך:
היכרות ראשונה עם דוקר - 25
היכרות ראשונה עם דוקר - 26

שכבות

כבר הבנו שתמונות נוצרות מ-docerfiles וש-docerfiles הם קבוצה של פקודות. הבנו גם שלקובץ dockerfile יש הורה. ושגודל התמונות שונה. מעניין, אתה יכול לראות את ההיסטוריה של איך נבנתה התמונה באמצעות פקודת docker history . לדוגמה:
היכרות ראשונה עם דוקר - 27
חשוב לומר זאת כדי להבין שבעצם כל תמונה היא אוסף של תמונות. כל שינוי תמונה (כל פקודה חדשה בקובץ docker) יוצר שכבה חדשה שיש לה מזהה משלה. תוכל לקרוא עוד על שכבות בתיעוד " Docker: Images and Layers ". אני גם ממליץ בחום לקרוא את המאמר על Habré: " דוקר תמונות ומיכלים בתמונות ."

סיכום

אני מקווה שסקירה קצרה זו הספיקה כדי לגרום לך להתעניין בקונטיינריזציה. להלן קישורים לחומר נוסף שעשוי להיות שימושי: #ויאצ'סלב
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION