מדריך Docker עבור Java

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

במאמר זה נסתכל על עוד ממשק API ספציפי מבוסס פלטפורמה מבוסס - לקוח Java API עבור Docker.

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

2. תלות של Maven

ראשית, עלינו להוסיף את התלות העיקרית שלנו pom.xml קוֹבֶץ:

 com.github.docker-java docker-java 3.0.14 

בזמן כתיבת המאמר, הגרסה האחרונה של ה- API היא 3.0.14. ניתן לצפות בכל מהדורה מדף השחרור של GitHub או ממאגר Maven.

3. שימוש בלקוח Docker

DockerClient זה המקום בו אנו יכולים ליצור קשר בין מנוע / דמון של Docker ליישום שלנו.

כברירת מחדל, ניתן לגשת לדמון ה- Docker רק ב- יוניקס: ///var/run/docker.sock קוֹבֶץ. אנחנו יכולים לתקשר מקומית עם מנוע ה- Docker מאזין בשקע Unix אלא אם הוגדר אחרת.

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

DockerClient dockerClient = DockerClientBuilder.getInstance (). Build ();

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

DefaultDockerClientConfig.Builder config = DefaultDockerClientConfig.createDefaultConfigBuilder (); DockerClient dockerClient = DockerClientBuilder .getInstance (config) .build ();

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

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

DockerClient dockerClient = DockerClientBuilder.getInstance ("tcp: //docker.baeldung.com: 2375") .build ();

שימו לב שאנחנו צריכים לתמוך מחרוזת החיבור עם יוניקס: // אוֹ tcp: // תלוי בסוג החיבור.

אם נלך צעד אחד קדימה, נוכל לקבל תצורה מתקדמת יותר באמצעות ה- DefaultDockerClientConfig מעמד:

DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder () .withRegistryEmail ("[email protected]") .withRegistryPassword ("baeldung") .withRegistryUsername ("baeldung") .withDockerCertPath ("/ home /. /. "/home/baeldung/.docker/") .withDockerTlsVerify ("1") .withDockerHost ("tcp: //docker.baeldung.com: 2376") .build (); DockerClient dockerClient = DockerClientBuilder.getInstance (config) .build ();

כמו כן, אנו יכולים לבצע את אותה גישה באמצעות נכסים:

מאפייני מאפיינים = מאפיינים חדשים (); properties.setProperty ("registry.email", "[מוגן בדוא"ל]"); properties.setProperty ("registry.password", "baeldung"); properties.setProperty ("registry.username", "baaldung"); properties.setProperty ("DOCKER_CERT_PATH", "/home/baeldung/.docker/certs"); properties.setProperty ("DOCKER_CONFIG", "/home/baeldung/.docker/"); properties.setProperty ("DOCKER_TLS_VERIFY", "1"); properties.setProperty ("DOCKER_HOST", "tcp: //docker.baeldung.com: 2376"); DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder () .withProperties (מאפיינים) .build (); DockerClient dockerClient = DockerClientBuilder.getInstance (config) .build ();

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

ייצא DOCKER_CERT_PATH = / home / baeldung / .docker / certs ייצא DOCKER_CONFIG = / home / baeldung / .docker / export DOCKER_TLS_VERIFY = 1 יצוא DOCKER_HOST = tcp: //docker.baeldung.com: 2376

4. ניהול מכולות

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

4.1. רשימת מיכלים

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

רשימת מכולות = dockerClient.listContainersCmd (). Exec ();

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

במקרה זה אנו מציגים מכולות עם הסטטוס "יציאה":

רשימת מכולות = dockerClient.listContainersCmd () .withShowSize (true) .withShowAll (true) .withStatusFilter ("יצאה"). Exec ()

זה שווה ערך ל:

$ docker ps -a -s -f status = יציאה מס 'או $ docker container ls -a -s -f status = יציאה

4.2. צור מיכל

יצירת מיכל מוגשת עם ה- createContainerCmd שיטה. אנו יכולים להכריז על הכרזה מורכבת יותר באמצעותהשיטות הזמינות החל מ-עם" קידומת.

נניח שיש לנו a העגינהלִיצוֹר פקודה המגדירה מיכל תלוי-מארח של MongoDB המאזין באופן פנימי ביציאה 27017:

$ docker create --name mongo \ --hostname = baeldung \ -e MONGO_LATEST_VERSION = 3.6 \ -p 9999: 27017 \ -v / Users / baeldung / mongo / data / db: / data / db \ mongo: 3.6 --bind_ip_all

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

מיכל CreateContainerResponse = dockerClient.createContainerCmd ("mongo: 3.6") .withCmd ("- bind_ip_all") .withName ("mongo") .withHostName ("baeldung") .withEnv ("MONGO_LATEST_VERSION = 3.6". parse ("9999: 27017")) .withBinds (Bind.parse ("/ Users / baeldung / mongo / data / db: / data / db")). exec ();

4.3. התחל, עצור והרג מיכל

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

dockerClient.startContainerCmd (container.getId ()). exec (); dockerClient.stopContainerCmd (container.getId ()). exec (); dockerClient.killContainerCmd (container.getId ()). exec ();

4.4. בדוק מיכל

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

ContainerContainerResponse מיכל = dockerClient.inspectContainerCmd (container.getId ()). Exec ();

4.5. תצלם מיכל

דומה ל לוגן להתחייב אנו יכולים ליצור תמונה חדשה באמצעות ה- commitCmd שיטה.

בדוגמה שלנו, התרחיש הוא, אנו מריצים בעבר מיכל אלפיני: 3.6 שהזיהוי שלו הוא “3464bb547f88” והותקן git על גבי זה.

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

מחרוזת snapshotId = dockerClient.commitCmd ("3464bb547f88") .withAuthor ("Baeldung <[email protected]>"). WithEnv ("SNAPSHOT_YEAR = 2018") .withMessage ("הוסף תמיכה ב- git") .withCmd ("git", " גרסה ") .withRepository (" אלפיני ") .withTag (" 3.6.git "). exec ();

מאז התמונה החדשה שלנו יחד עם git נשאר במארח, נוכל לחפש אותו במארח Docker:

$ docker image ls alpine --format "table {{.Repository}} {{.Tag}}" תג מיקום אלפיני 3.6.git

5. ניהול תמונות

יש כמה פקודות ישימות שקיבלו לנו לניהול פעולות תמונה.

5.1. רשימת תמונות

כדי לרשום את כל התמונות הזמינות כולל תמונות משתלשלות במארח Docker, עלינו להגיש בקשה ל- listImagesCmd שיטה:

תמונות רשימה = dockerClient.listImagesCmd (). Exec ();

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

$ docker image ls - format "table {{.Repository}} {{.Tag}}" תג מיקום אלפיני 3.6 מונגו 3.6

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

רשימת תמונות = dockerClient.listImagesCmd () .withShowAll (true) .exec ();

אם רק הצגת התמונות המשתלשלות היא המקרה, withDanglingFilter יש להתחשב בשיטה:

רשימת תמונות = dockerClient.listImagesCmd (). WithDanglingFilter (true) .exec ();

5.2. בנה תמונה

בואו נתמקד בדרך של בניית תמונה באמצעות ה- API. ה buildImageCmd השיטה בונה תמונות Docker מקובץ Docker. בפרויקט שלנו, יש לנו כבר Dockerfile אחד שנותן תמונה אלפינית עם git מותקן:

מאת אלפיני: 3.6 RUN apk - עדכן הוסף git openssh && \ rm -rf / var / lib / apt / lists / * && \ rm / var / cache / apk / * ENTRYPOINT ["git"] CMD ["- עזרה "]

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

מחרוזת imageId = dockerClient.buildImageCmd () .withDockerfile (קובץ חדש ("path / to / Dockerfile")) .withPull (true) .withNoCache (true) .withTag ("alpine: git") .exec (BuildImageResultCallback חדש ()) .awaitImageId ();

5.3. בדוק תמונה

אנו יכולים לבדוק את המידע ברמה הנמוכה אודות תמונה בזכות ה- inspectImageCmd שיטה:

תמונה InspectImageResponse = dockerClient.inspectImageCmd ("161714540c41"). Exec ();

5.4. תייג תמונה

הוספת תג לתמונה שלנו היא די פשוטה באמצעות העגינהתָג פקודה, כך שה- API אינו יוצא מן הכלל. אנו יכולים לבצע את אותה הכוונה עם ה- tagImageCmd שיטה גם כן. לתייג תמונה של Docker עם מזהה 161714540c41 למאגר baeldung / alpine עם git:

מחרוזת imageId = "161714540c41"; מאגר מחרוזות = "baeldung / alpine"; תג מחרוזת = "git"; dockerClient.tagImageCmd (imageId, מאגר, תג) .exec ();

נרשום את התמונה החדשה שנוצרה, והנה:

$ docker image ls - פורמט "טבלה {{.מאגר}} {{.Tag}}" תג מיקום baeldung / alpine git

5.5. דחוף תמונה

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

מכיוון שאנחנו מניחים שהלקוח הוגדר עם Docker Hub, אנו יכולים לדחוף את ה- ביילדונג / אלפיני תמונה לחשבון DockerHub של baeldung:

dockerClient.pushImageCmd ("baeldung / alpine") .withTag ("git") .exec (PushImageResultCallback חדש ()) .awaitCompletion (90, TimeUnit.SECONDS);

עלינו לציית למשך התהליך. בדוגמה, אנחנו מחכים 90 שניות.

5.6. משוך תמונה

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

dockerClient.pullImageCmd ("baeldung / alpine") .withTag ("git") .exec (PullImageResultCallback חדש ()) .awaitCompletion (30, TimeUnit.SECONDS);

כדי לבדוק אם התמונה שהוזכרה קיימת במארח Docker לאחר משיכתה:

$ docker images baeldung / alpine --format "table {{.Repository}} {{.Tag}}" תג מאגר baeldung / alpine git

5.7. הסר תמונה

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

dockerClient.removeImageCmd ("beaccc8687ae"). exec ();

5.8. חפש ברישום

כדי לחפש תמונה מ- Docker Hub, הלקוח מגיע עם ה- searchImagesCmd שיטת לקיחת ערך מחרוזת המציין מונח. כאן נחקור תמונות הקשורות לשם המכיל 'Java ' ב- Docker Hub:

פריטי רשימה = dockerClient.searchImagesCmd ("Java"). Exec ();

הפלט מחזיר 25 תמונות קשורות ראשונות ברשימה של פריט חיפוש חפצים.

6. ניהול נפח

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

6.1. רשימות כרכים

כל הכרכים הזמינים כולל שמות ללא שם רשומים עם:

ListVolumesResponse volumesResponse = dockerClient.listVolumesCmd (). Exec (); רשימות כרכים = volumesResponse.getVolumes ();

6.2. בדוק נפח

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

נפח InspectVolumeResponse = dockerClient.inspectVolumeCmd ("0220b87330af5"). Exec ();

6.3. צור נפח

ה- API משרת שתי אפשרויות שונות ליצירת אמצעי אחסון. הלא-ארג createVolumeCmd השיטה יוצרת אמצעי אחסון שבו השם ניתן על ידי דוקר:

CreateVolumeResponse ללא שםVolume = dockerClient.createVolumeCmd (). Exec ();

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

CreateVolumeResponse בשםVolume = dockerClient.createVolumeCmd (). WithName ("myNamedVolume"). Exec ();

6.4. הסר אמצעי אחסון

אנו יכולים למחוק באופן אינטואיטיבי אמצעי אחסון ממארח ​​Docker באמצעות ה- removeVolumeCmd שיטה. מה חשוב לציין שלא נוכל למחוק אמצעי אחסון אם הוא נמצא בשימוש ממיכל. אנחנו מסירים את עוצמת הקול, myNamedVolume, מרשימת הכרכים:

dockerClient.removeVolumeCmd ("myNamedVolume"). exec ();

7. ניהול רשת

החלק האחרון שלנו עוסק בניהול משימות רשת באמצעות ה- API.

7.1. רשתות רשימה

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

רשימת רשתות = dockerClient.listNetworksCmd (). Exec ();

7.2. צור רשת

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

CreateNetworkResponse networkResponse = dockerClient.createNetworkCmd () .withName ("baeldung") .withDriver ("bridge"). Exec ();

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

CreateNetworkResponse networkResponse = dockerClient.createNetworkCmd () .withName ("baeldung") .withIpam (Ipam חדש () .withConfig (חדש Config () .withSubnet ("172.36.0.0/16"). WithIpRange ("172.36.5.0/24) ))). withDriver ("גשר"). exec ();

אותה פקודה שאנחנו יכולים להריץ עם ה- העגינה הפקודה היא:

רשת docker $ create \ --subnet = 172.36.0.0 / 16 \ --ip-range = 172.36.5.0 / 24 \ baeldung

7.3. בדוק רשת

הצגת הפרטים ברמה הנמוכה של רשת מכוסה גם בממשק ה- API:

רשת רשת = dockerClient.inspectNetworkCmd (). WithNetworkId ("baeldung"). Exec ();

7.4. הסר רשת

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

dockerClient.removeNetworkCmd ("baeldung"). exec ();

8. מסקנה

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

את כל הדוגמאות המוצגות במאמר זה ניתן למצוא באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found