יצירת תמונת Docker מ- Scratch

Creating Docker Image From Scratch



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

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







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



אנטומיה של תמונת Docker

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



יישומים עשויים משכבות של תוכנות. תמונת מכולה של וורדפרס נבנית באמצעות תמונת מיכל httpd אשר, בתורו, בנויה על גבי תמונת אובונטו. התמונה שעליה בנויה תמונה חדשה יותר ידועה בשם PARENT IMAGE במינוח Docker. ב- Dockerfile (נגיע למה שפירושו Dockerfile, קצת מאוחר יותר), תמונת האב הזו מוזכרת בחלק העליון של הקובץ כפי שמוצג להלן:





מתוך אובונטו: 18.04
## שאר קובץ ה- Docker

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

אולי שמת לב לזה כשאתה מנסה למשוך תמונת עגינה חדשה.



יצירת תמונת Docker מגרסה

זה מראה כמה שכבות נמשכות לפני הכנסת היישום בפועל (שעשוי להיות בגודל של כמה מגה בייט בלבד בלבד).

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

מאפס
## שאר קובץ ה- Dcoker

תחילה ניצור אפליקציה פשוטה של ​​עולם שלום ולאחר מכן נגלה מה יהיה שאר ה- Dockerfile. המערכת המארחת היא אובונטו: 18.04 LTS ואנו משתמשים בגרסת Docker 17.12.1-ce לניסוי.

יצירת בינארי סטטי

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

אך רוב היישומים ברמה גבוהה תלויים בהרבה ספריות מערכת (כמו glibc, musl, klibc וכו ' ) והרבה תלות בזמן ריצה כמו Python או Node.js או Java Runtime. בינארי היישומים אינו כולל את כל הספריות הזמינות בתוכו, אך כאשר הוא מתחיל לבצע הוא קורא לספריות אלה ממערכת ההפעלה המארחת.

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

נתחיל ביצירת תיקיה בשם MyDockerImage וליצור בתוכה קובץ hello.cc.

$mkdirMyDockerImage
$CDMyDockerImage
$לגעתhello.cc

פתח את hello.cc באמצעות עורך הטקסט האהוב עליך והוסף בתוכו את השורות הבאות.

#לִכלוֹל
באמצעות מרחב שמות std;
intרָאשִׁי(){
עֲלוּת<< 'שלום! הודעה זו מגיעה ממיכל n';
לַחֲזוֹר 0;

}

זוהי תוכנת C ++ פשוטה שמדפיסה שלום! ההודעה הזו …

מסיבות שנדונו קודם לכן, נאסוף זאת באמצעות הדגל הסטטי. המהדר הנמצא בשימוש הוא g ++ (אובונטו 7.3.0-16ubuntu3) 7.3.0.

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

$ גרם++ -הו שלום-סטָטִישלום.זֶרֶם יָשָׁר

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

$./שלום

כעת אנו מוכנים לאכלס את התוכנית הפשוטה הזו.

Dockerfile

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

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

$לגעתDockerfile

פתח אותו בעזרת עורך הטקסט האהוב עליך, וכתוב אליו את השורות הבאות:

מאפס
ADD שלום/
CMD['/שלום']

שריטה אינו דימוי הורה. במקום זאת הוא מצביע על Docker שהתמונה אינה בנויה על גבי תמונה אחרת. הוא בנוי מאפס. הפקודה ADD תיקח את הבינארי הסטטי בשם | _+_ | מהספרייה הנוכחית ותוסיף אותו לספריית השורש של קובץ התמונה. כאשר סוף סוף היינו מפעילים מיכל המבוסס על תמונה זו, ההפעלה שלום תראה בתוך ספריית השורש עצמה בכתובת | _+_ |

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

בואו לבנות את התמונה על ידי הפעלת בניית עגינה פקודה שתעבור על תוכן ה- Dockerfile ותייצר את התמונה. הפעל את הפקודה הבאה באותה ספרייה כמו ה- Dockerfile והבינארי ההפעלה.

$בניית עגינה--תָגשלום .

ה -תייג שלום flag מגדיר את שם התמונה שלום והנקודה ( . ) בסוף מספר בניית עגינה כדי לבדוק את הספרייה הנוכחית של Dockerfile ותכנים קשורים.

הפעלת מיכל הדוקר

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

$תמונות docker

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

$docker run שלום

זהו זה! יצרת את המיכל המינימליסטי הראשון שלך מאפס.

אפשרויות אחרות

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

שימוש בהם כתמונת האב שלך באמצעות מ- alpine: האחרונה יביא לתמונות קטנות יותר גם כן. כיוון שתמונות הבסיס הן בגודל 2-5 מגה-בתים בלבד. הודע לנו אם יש נושא הקשור ל- Docker שאולי תרצה שנדון בהמשך. תוכל להגיע אלינו ב טוויטר , פייסבוק או הירשם אלינו באמצעות הדוא'ל.