Docker 101: יסודות ותרגול

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

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

דוקר

הנה ההגדרה של דוקר, על פי ויקיפדיה:

Docker היא תוכנית מחשב המבצעת וירטואליזציה ברמת מערכת ההפעלה.

די פשוט, נכון? ובכן, לא בדיוק. בסדר, הנה ההגדרה שלי למה זה דוקר:

דוקר הוא פלטפורמה ליצירה והפעלת מכולות מן התמונות .

עדיין אבוד? אין דאגות, זה בגלל שאתה כנראה לא יודע מה זה מכולות או תמונות .

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

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

חלק 1. "שלום עולם!" מתמונת פיתון

נניח שאין לך פייתון מותקן במחשב שלך - או לפחות לא הגרסה האחרונה - ואתה צריך פיתון כדי להדפיס "שלום, עולם!" במסוף שלך. מה אתה עושה? אתה משתמש ב- docker!

המשך והפעל את הפקודה הבאה:

docker run --rm -it python:3 python

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

זה אומר שאנחנו נמצאים כרגע בתוך מיכל עוגן שנוצר מתמונת עגינה של פייתון 3 ומריץ את pythonהפקודה. לסיום הדוגמא, הקלד print("Hello, World!")וצפה בזמן שהקסם קורה.

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

מפרק את זה

בוא נתחיל מההתחלה. docker runהפקודה הוא כלי סטנדרטי הסוור כדי לעזור לך להתחיל ולהפעיל מכולות שלך.

--rmהדגל הוא שם כדי לספר את הדוקר Daemon לנקות את המכל ולהסיר את מערכת הקבצים לאחר יציאת המכולה. זה עוזר לך לחסוך מקום בדיסק לאחר הפעלת מיכלים קצרי מועד כמו זה, שהתחלנו להדפיס רק "שלום עולם!".

-t (or --tty)דגל מספרת דוקר להקצות בהפעלת מסוף וירטואלי בתוך המכולה. זה משמש בדרך כלל עם -i (or --interactive)האפשרות, אשר שומרת על STDIN פתוח גם אם פועל במצב מנותק (עוד על כך בהמשך).

הערה: אל תדאג יותר מדי מהגדרות אלה כרגע. רק דע שתשתמש -itבדגל בכל עת שתרצה להקליד כמה פקודות במכולה שלך.

לבסוף, python:3היא תמונת הבסיס בה השתמשנו עבור מיכל זה. כרגע, תמונה זו מגיעה בין היתר עם גרסת פיתון 3.7.3. עכשיו, אולי אתה תוהה מאיפה התמונה הזו, ומה יש בתוכה. אתה יכול למצוא את התשובות לשתי השאלות האלה כאן, יחד עם כל שאר תמונות הפיתון שיכולנו להשתמש בדוגמה זו.

אחרון חביב, pythonהייתה הפקודה שאמרנו לדוקר לבצע בתוך python:3התמונה שלנו , שהפעילה מעטפת פיתון ואפשרה print("Hello, World!")לקריאה שלנו לעבוד.

עוד דבר אחד

כדי לצאת מפייתון ולסיים את המכולה שלנו, אתה יכול להשתמש ב- CTRL / CMD + D או exit(). קדימה ועשה את זה עכשיו. לאחר מכן, נסה לבצע docker runשוב את הפקודה שלנו ותראה משהו קצת שונה, והרבה יותר מהיר.

הסיבה לכך היא שכבר הורדנו את python:3התמונה, כך שהמכולה שלנו מתחילה הרבה יותר מהר עכשיו.

חלק 2. אוטומטי "שלום עולם!" מתמונת פיתון

מה יותר טוב מלכתוב "שלום עולם!" פעם אחת במסוף שלך? הבנת את זה, כותב את זה פעמיים!

מכיוון שאנחנו לא יכולים לחכות לראות את "שלום עולם!" מודפס במסוף שלנו שוב, ואנחנו לא רוצים לעבור את ההמולה של פתיחת פיתון והקלדה printשוב, בואו נמשיך ונבצע אוטומטית את התהליך הזה. התחל ביצירת hello.pyקובץ בכל מקום שתרצה.

# hello.py
print("Hello, World!")

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

docker run --rm -it -v $(pwd):/src python:3 python /src/hello.py

זו התוצאה אותה אנו מחפשים:

הערה: השתמשתי lsלפני הפקודה כדי להראות לך שאני נמצאת באותה תיקייה בה יצרתי את hello.pyהקובץ.

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

מפרק את זה

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

-v $(pwd):/srcהאפשרות מספרת את הדוקר Daemon לפתוח עימו i נפח n מיכל שלנו . כרכים הם הדרך הטובה ביותר לנהל נתונים ב- Docker. בדוגמה זו אנו אומרים לדוקר שאנחנו רוצים שהספרייה הנוכחית - שתאוחזר ממנה $(pwd)- תתווסף למכולה שלנו בתיקיה /src.

הערה: אתה יכול להשתמש בכל שם או תיקיה אחרים שאתה רוצה, לא רק/src

אם ברצונך לבדוק /src/hello.pyשקיים בפועל בתוך המכולה שלנו, תוכל לשנות את סוף הפקודה שלנו מ- python hello.pyל- bash. פעולה זו תפתח מעטפת אינטראקטיבית בתוך המכולה שלנו, ותוכל להשתמש בה בדיוק כמו שהיית מצפה.

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

החלק האחרון של הפקודה שלנו הוא python /src/hello.pyההוראה. על ידי הפעלתו אנו אומרים למכולה שלנו להביט /srcבתיקיה ולבצע את hello.pyהקובץ באמצעות python.

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

חלק 3. הכי קל "שלום, עולם!" אפשרי מתמונת פייתון באמצעות Dockerfile

נמאס לכם להגיד שלום לכוכב הלכת היפה שלנו, עדיין? זה חבל, כי אנחנו הולכים לעשות את זה שוב!

הפקודה האחרונה שלמדנו הייתה מעט מילולית, ואני כבר רואה את עצמי נמאס להקליד את כל הקוד הזה בכל פעם שאני רוצה לומר "שלום עולם!" בואו נבצע דברים אוטומטיים עוד קצת עכשיו. צור קובץ בשם Dockerfileוהוסף אליו את התוכן הבא:

# Dockerfile
FROM python:3
WORKDIR /src/app
COPY . .
CMD [ "python", "./hello.py" ]

כעת הפעל פקודה זו באותה תיקיה שיצרת את Dockerfile:

docker build -t hello .

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

docker run hello

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

מפרק את זה

החל מה- Dockerfile שלנו, השורה הראשונה FROM python:3אומרת ל- Docker להתחיל הכל עם תמונת הבסיס שאנחנו כבר מכירים python:3,.

השורה השנייה,, WORKDIR /src/appמגדירה את ספריית העבודה בתוך המכולה שלנו. זה עבור כמה הוראות שנבצע אחר כך, כמו CMDאו COPY. אתה יכול לראות את שאר ההוראות הנתמכות WORKDIRכאן.

השורה השלישית, COPY . .בעצם אומרת ל- Docker להעתיק הכל מהתיקיה הנוכחית שלנו (ראשונה .), ולהדביק אותה /src/app(השנייה .). מיקום ההדבקה הוגדר עם WORKDIRהפקודה ממש מעליו.

הערה: נוכל להשיג את אותן התוצאות על ידי הסרת WORKDIRההוראה והחלפת COPY . .ההוראה ב COPY . /src/app. במקרה כזה נצטרך לשנות את ההוראה האחרונה CMD ["python", "./hello.py"]ל- CMD ["python", "/src/app/hello.py"].

לבסוף, השורה האחרונה CMD ["python", "./hello.py"]מספקת את פקודת ברירת המחדל עבור המכולה שלנו. זה בעצם אומר שבכל פעם שאנחנו runמכולים מתצורה זו, הוא צריך לפעול python ./hello.py. זכור שאנחנו רצים במרומז /src/app/hello.pyבמקום רק hello.py, מכיוון שזה המקום אליו הצבענו WORKDIR.

הערה:CMD ניתן להחליף את הפקודה בזמן הריצה. למשל, אם תרצה לרוץ bashבמקום זאת, תעשה זאת docker run hello bashלאחר בניית המכולה.

עם סיום Dockerfile שלנו, אנו ממשיכים ומתחילים buildבתהליך שלנו . docker build -t hello .פקוד קוראה כל התצורה שהוספנו Dockerfile שלנו ויוצרת תמונת סַוָר ממנו. נכון, בדיוק כמו python:3התמונה בה השתמשנו לכל המאמר הזה. .בסוף מספרת הדוקר כי אנחנו רוצים להריץ Dockerfile במיקום הנוכחי שלנו, ואת -t helloהאפשרות נותנת תמונה זו בשם hello, כדי שנוכל להתייחס אלי בקלות בזמן הריצה.

אחרי כל זה, כל מה שאנחנו צריכים לעשות זה להפעיל את docker runההוראות הרגילות , אבל הפעם עם helloשם התמונה בסוף השורה. זה יתחיל מיכל מהתמונה שבנינו לאחרונה ולבסוף ידפיס את הטובה "שלום, עולם!" במסוף שלנו.

הרחבת תמונת הבסיס שלנו

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

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

# Dockerfile
FROM python:3
# NEW LINERUN pip3 install numpy
WORKDIR /src/app
COPY . .
CMD [ "python", "./hello.py" ]

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

הערה: עבור אפליקציית פיתון אמיתית, סביר להניח שתוסיף requirements.txtלקובץ את כל התלות שאתה צריך , העתק אותו למיכל ואז עדכן את RUNההוראות RUN pip3 install -r requirements.txt.

חלק 4. "שלום עולם!" מתמונת Nginx באמצעות מיכל מנותק ארוך טווח

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

צור index.htmlקובץ בתיקיה חדשה עם התוכן הבא.

# index.html

Hello, World!

עכשיו, בואו ניצור קובץ Docker חדש באותה תיקייה.

# Dockerfile
FROM nginx:alpine
WORKDIR /usr/share/nginx/html
COPY . .

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

docker build -t simple_nginx .

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

docker run --rm -d -p 8080:80 simple_nginx

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

docker psמופעים הפקודה כל מכולות פועל המחשב שלך. כפי שניתן לראות בתמונה לעיל, יש לי מכיל בשם simple_nginxשמופעל במכונה שלי עכשיו. בוא נפתח דפדפן אינטרנט ונראה אם nginxהוא עושה את העבודה שלו באמצעות גישה localhost:8080.

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

מפרק את זה

אני הולך לדלג על ההסבר Dockerfile מכיוון שכבר למדנו את הפקודות האלה בחלק האחרון. הדבר "החדש" היחיד בתצורה זו הוא nginx:alpineהתמונה, אותה תוכלו לקרוא עליה עוד כאן.

מלבד מה חדש, תצורה זו פועלת מכיוון nginxשמשתמש usr/share/nginx/htmlבתיקיה כדי לחפש index.htmlקובץ ולהתחיל לשרת אותו, ולכן מכיוון שקראנו לקובץ שלנו index.htmlוהגדרנו אותו WORKDIRכך usr/share/nginx/html, הגדרה זו תעבוד מייד מהקופסה.

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

עכשיו לחלק הכיף, docker run --rm -d -p 8080:80 simple_nginxההוראה. כאן יש לנו שני דגלים חדשים. הראשון הוא -dהדגל המנותק ( ), כלומר אנו רוצים להפעיל את המכולה הזו ברקע, ולכן אנחנו חוזרים למסוף שלנו מיד לאחר השימוש docker runבפקודה, למרות שהמכולה שלנו עדיין פועלת.

הדגל החדש השני הוא -p 8080:80האופציה. כפי שאולי ניחשתם, זה portהדגל, והוא בעצם ממפה את הנמל 8080מהמכונה המקומית שלנו לנמל 80בתוך המכולה שלנו. היית יכול להשתמש בכל יציאה אחרת במקום 8080, אך אינך יכול לשנות את היציאה 80מבלי להוסיף הגדרה נוספת nginxלתמונה, שכן 80היציאה הסטנדרטית nginxשהתמונה חושפת.

הערה: אם ברצונך לעצור מיכל מנותק כמו זה, תוכל להשתמש docker psבפקודה כדי לקבל את שם המכולה (לא תמונה), ואז להשתמש docker stopבהוראות עם שם המיכל הרצוי בסוף השורה.

חלק 5. הסוף

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

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

אם יש לך שאלות, אנא יידע אותי.

לחיים!