วิธีเชื่อมต่อแอปบู๊ตสปริงด้วย Jib ของ Google

Image 1: รูปภาพ java docker ที่ไม่เสียดสีกับ Jib!

สวัสดี! ในขณะที่ทำงานบนแพลตฟอร์มแบบสปริงเมื่อเร็ว ๆ นี้ฉันกำลังพิจารณาวิธีการเชื่อมต่อบริการไมโครสโคป ดังนั้นฉันจึงได้พบกับ Jib ซึ่งเป็นแนวทางใหม่ในการพัฒนาโดย Google

โพสต์นี้เกี่ยวกับการใช้ Jib และอื่น ๆ โดยเฉพาะ jib-maven-plugin เพื่อสร้างแอปพลิเคชั่นบู๊ทสปริง

โครงการตัวอย่างที่ใช้ในโพสต์นี้สามารถพบได้ที่นี่:

Jib คืออะไร

สิ่งที่ Jib นำมาให้กับตารางก็คือมันช่วยให้คุณสร้างคอนเทนเนอร์ได้โดยเพียงแค่เพิ่มปลั๊กอินในเครื่องมือสร้างที่คุณเลือก (Maven หรือ Gradle) ไม่มีไฟล์เพิ่มเติมเพียงไม่กี่บรรทัดของการกำหนดค่าและจัดการขั้นตอนทั้งหมดของการบรรจุแอปพลิเคชันของคุณลงในภาพคอนเทนเนอร์

ด้วยคำพูดของทีมคลาวด์ของ Google:

Jib เป็นตัวเปิด Java containerizer จาก Google ที่ให้นักพัฒนา Java สามารถสร้าง container โดยใช้เครื่องมือ Java ที่พวกเขารู้จัก มันไม่ต้องการให้คุณเขียน Dockerfile หรือติดตั้ง docker ไว้และมันจะรวมเข้ากับ Maven และ Gradle โดยตรง

ในโฟลว์การสร้างอิมเมจการสร้างอิมเมจ“ ดั้งเดิม” ของ Java to Docker เราจำเป็นต้องติดตั้ง Dockerfile และ Docker daemon ดังที่แสดงด้านล่าง:

ภาพที่ 2: ขั้นตอนดั้งเดิมในการสร้างภาพนักเทียบท่าจากแอพ Java

ดังที่แผนภาพแสดงไว้ในโฟลว์การสร้าง Jib คุณเพียงแค่ต้องใช้ปลั๊กอินไฟล์สร้างของโครงการ:

Image 3: วิธี Jib สำหรับสร้างอิมเมจ docker จากแอป Java

ติดตั้ง

มันไม่ได้อยู่ในขอบเขตของโพสต์นี้เพื่อตั้งค่าสภาพแวดล้อมการพัฒนา Java แต่ขอให้มันยิง!

  1. ตรวจสอบให้แน่ใจว่าคุณติดตั้ง Java 8+ แล้ว
  2. เราจะใช้ maven ดังนั้นหากไม่มีการติดตั้ง maven 3.5+
  3. ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งตัวเชื่อมต่อและหากคุณใช้งาน Linux ผู้ใช้ของคุณจะสามารถเข้าถึงตัวเชื่อมต่อได้
  4. ติดตั้ง IDE ที่คุณชื่นชอบ (eclipse หรือความคิด)

สร้างแอพพลิเคชันสปริงบูตพื้นฐาน

สามารถทำได้ทั้งผ่าน initializr ฤดูใบไม้ผลิหรือผ่าน IDE ที่คุณชื่นชอบ หากคุณใช้ spring initializr คุณจะต้องนำเข้าโครงการ maven ที่สร้างขึ้นใหม่ลงใน IDE ของคุณ (eclipse / idea)

เพิ่ม jib-maven-plugin ให้กับ pom.xml ของคุณ

สำหรับอิมเมจที่เก็บไว้ในเครื่องของคุณในระดับพื้นฐานให้กำหนดค่า jib-maven-plugin ใน pom.xml ของคุณดังต่อไปนี้:

รวบรวมแอพและสร้างภาพ

ตอนนี้เราสามารถสร้างแอปพลิเคชันและตรวจสอบว่าภาพถูกสร้างขึ้นในพื้นที่เก็บข้อมูลนักเทียบท่าท้องถิ่นของเรา

ไปที่โฟลเดอร์รูทของโครงการผ่านเทอร์มินัลแล้วดำเนินการ:

mvn คอมไพล์ jib: dockerBuild

บันทึกการสร้าง Maven ควรมีบรรทัดดังต่อไปนี้:

[INFO] - - jib-maven-plugin: 0.10.1: dockerBuild (default-cli) @ spring-boot-jib - -
[ข้อมูล]
[INFO] แอปพลิเคชั่นการจัดเก็บคอนเทนเนอร์ให้กับ Docker daemon เป็น springbootjib ...
[คำเตือน] ภาพพื้นฐาน ‘gcr.io/distroless/java’ ไม่ได้ใช้การแยกย่อยภาพโดยเฉพาะ - การสร้างอาจไม่สามารถทำซ้ำได้
[INFO] การรับภาพพื้นฐาน gcr.io/distroless/java ......
[INFO] เลเยอร์การพึ่งพาอาคาร ...
[INFO] การสร้างเลเยอร์ทรัพยากร ...
[INFO] การสร้างชั้นเรียน ...
[INFO] กำลังสรุป ...
[ข้อมูล]
[INFO] ตั้งค่าจุดเริ่มต้นคอนเทนเนอร์เป็น [java, -cp, / app / ทรัพยากร: / app / คลาส: / app / libs / *, com.jibdemo.SpringBootJibApplication]
[INFO] กำลังโหลดไปที่ Docker daemon ...
[ข้อมูล]
[INFO] สร้างภาพเพื่อ Docker daemon ในฐานะ springbootjib

ตราบใดที่ไม่มีข้อผิดพลาดและเราเห็นว่า maven“ สร้างอิมเมจไปที่ Docker daemon เป็น springbootjib” เราพร้อมแล้ว

เรียกใช้อิมเมจนักเทียบท่า

ณ จุดนี้เราควรมีภาพนักเทียบท่าใหม่ในพื้นที่เก็บข้อมูลท้องถิ่นของเรา เราสามารถตรวจสอบได้โดยการเรียกใช้อิมเมจ docker และเราควรเห็นภาพที่คล้ายกับสิ่งนี้:

springbootjib ล่าสุด eb4bea693650 3 ชั่วโมงที่ผ่านมา 135MB

สังเกตขนาดภาพที่เล็กมาก (135mb) ซึ่งเกิดจากภาพ gcr.io/distroless/java ที่ Jib ใช้เป็นค่าเริ่มต้น (เราจะเห็นว่าเราสามารถเปลี่ยนได้อย่างไรในภายหลัง)

ดังนั้นตอนนี้เราสามารถเรียกใช้รูปภาพตามปกติโดยพิมพ์ docker run -it springbootjib และตรวจสอบว่าแอปทำงานตามที่คาดไว้

การกำหนดค่าปลั๊กอิน Jib เพื่อปรับแต่งภาพ Docker ของเรา

เราสามารถขุดให้ลึกลงไปและกำหนดค่าปลั๊กอิน Jib ให้มากขึ้นเพื่อให้เหมาะสมกับสถานการณ์ทั่วไปหลายอย่างเช่นการเข้าสู่พื้นที่เก็บข้อมูลนักเทียบท่าการเปิดเผยพอร์ตเลือกภาพพื้นฐานที่เฉพาะเจาะจง ฯลฯ

ตัวอย่างเช่นในการกำหนดค่าภาพต่อไปนี้:

  • สร้างจากฐานของ openjdk: alpine (ดึงจาก Docker Hub)
  • ถูกส่งไปที่ localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: อัลไพน์และ localhost: 5000 / springbootjib: ล่าสุด
  • รันโดยเรียก java -Xms256m -Xdebug -cp app / libs / *: แอพ / แหล่งข้อมูล: แอพ / คลาส com.jibdemo.SpringBootJibApplication args
  • แสดงพอร์ต 8001 สำหรับ tcp (ค่าเริ่มต้น) และพอร์ต 8002 และ 8003 สำหรับ udp
  • มีป้ายกำกับ (ชื่อ: springbootjib)
  • สร้างขึ้นเป็นรูปแบบ OCI

ตอนนี้คุณสามารถสร้างภาพอีกครั้งและดูความแตกต่างในบันทึก maven:

[INFO] --- jib-maven-plugin: 0.10.1: dockerBuild (default-cli) @ spring-boot-jib ---
[ข้อมูล]
[INFO] แอปพลิเคชันการจัดวางคอนเทนเนอร์ให้กับ Docker daemon เป็น localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: อัลไพน์, localhost: 5000 / springbootjib ...
[INFO] การรับภาพพื้นฐาน openjdk: อัลไพน์ ...
[INFO] เลเยอร์การอ้างอิงอาคาร ...
[INFO] การสร้างเลเยอร์ทรัพยากร ...
[INFO] การสร้างชั้นเรียน ...
[INFO] ภาพหลักต้องการการรับรองความถูกต้อง ลองอีกครั้งสำหรับ openjdk: อัลไพน์ ...
[INFO] การดึงข้อมูลรับรองรีจิสทรีสำหรับ registry.hub.docker.com ...
[INFO] กำลังจบการทำงาน ...
[ข้อมูล]
[INFO] คอนเทนเนอร์ entrypoint ตั้งค่าเป็น [java, -Xms256m, -Xdebug, -cp, / app / ทรัพยากร: / app / คลาส: / app / libs / *, com.jibdemo.SpringBootJibApplication]
[INFO] กำลังโหลดไปที่ Docker daemon ...
[ข้อมูล]
[INFO] สร้างอิมเมจ Docker daemon เป็น localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpine, localhost: 5000 / springbootjib

โปรดสังเกตในส่วนบันทึกด้านบนว่าปลั๊กอินดึงอิมเมจ openjdk: alpine จาก Docker Hub สร้างภาพขึ้นมาเป็นเวอร์ชันที่ติดแท็กสามเวอร์ชันและเก็บไว้ในที่เก็บท้องถิ่นของเรา

ทำไมฉันถึงถ่ายรูปกับ Jib

  • คุณไม่จำเป็นต้องบำรุงรักษา Dockerfile เรียกใช้ Docker daemon หรือแม้แต่กังวลเกี่ยวกับการสร้าง JAR ที่มีการพึ่งพาทั้งหมด
  • ใช้ประโยชน์จากเลเยอร์รูปภาพและการแคชรีจิสทรีเพื่อให้เกิดการสร้างที่รวดเร็วและเพิ่มขึ้น
  • สามารถกำหนดค่าเพื่อสร้างภาพบิลด์ที่ทำซ้ำได้ตราบใดที่อินพุตของคุณยังคงเหมือนเดิม

ข้อสรุป

เมื่อใช้ปลั๊กอิน maven อื่น ๆ เช่นเดียวกับ spotify และ fabric8 เพื่อสร้างภาพนักเทียบท่าสำหรับแอป Java ฉันยินดีต้อนรับ Google ในเรื่องนี้ มันต้องการไฟล์น้อยกว่าปลั๊กอินของ fabric8 และ (ในความเห็นที่ต่ำต้อยของฉัน) รู้สึกว่ากำหนดค่าได้ง่ายกว่าปลั๊กอินของ spotify ฉันแนะนำให้ลองทำดู!

คำเตือน: นี่ไม่ใช่บทความเปรียบเทียบเพียงมุมมองของฉันในเรื่องที่ได้รับการสนับสนุนจากประสบการณ์ส่วนตัว

คุณสามารถอ่านเพิ่มเติมได้ที่ GitHub repo ของ Jib ซึ่งมีข้อมูลที่ครบถ้วนเกี่ยวกับพารามิเตอร์การกำหนดค่าทั้งหมด ขอบคุณสำหรับการอ่านที่ไกลขนาดนี้! ฉันหวังว่าคุณจะสนุกกับมัน! อย่าลังเลที่จะแสดงความคิดเห็นของคุณที่นี่

เกี่ยวกับฉัน

เฮ้ขอบคุณที่หยุดโดย ฉันเป็นวิศวกรกองซ้อนเต็มรูปแบบโดยเน้นด้านหลังและ devOps ฉันสนใจที่จะสร้างต้นแบบ / MVP และการพัฒนาแพลตฟอร์มที่ขยายในคลาวด์เลือกที่จะสร้างมูลค่าทางธุรกิจ

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับฉันและเรื่องราวของฉันได้ที่นี่ หากคุณต้องการที่จะหารือเกี่ยวกับธุรกิจหรือเพียงแค่การติดต่อส่งอีเมล: tasos.tsaousis@codedlines.com