Bagaimana cara meredam aplikasi boot musim semi dengan Jib Google

Gambar 1: Gambar java docker tanpa gesekan dengan Jib!

Halo! Saat bekerja pada platform berbasis pegas baru-baru ini, saya sedang mempertimbangkan cara untuk melakukan dockerizing sebuah layanan mikro. Jadi saya menemukan Jib, pendekatan yang cukup baru tentang masalah ini, yang dikembangkan oleh Google.

Posting ini adalah tentang menggunakan Jib, dan lebih khusus lagi jib-maven-plugin, untuk membangun aplikasi boot musim semi kemas.

Proyek demo yang digunakan dalam posting ini dapat ditemukan di sini:

Apa itu Jib

Apa yang dibawa Jib ke tabel adalah bahwa ia memungkinkan Anda membuat wadah hanya dengan menambahkan plugin ke alat bantu pilihan Anda (Maven atau Gradle). Tidak ada file tambahan, hanya beberapa baris konfigurasi dan ini menangani semua langkah pengemasan aplikasi Anda menjadi gambar wadah.

Dengan kata-kata tim Google cloud sendiri:

Jib adalah open source Java containerizer dari Google yang memungkinkan pengembang Java membangun kontainer menggunakan alat Java yang mereka tahu. Itu tidak mengharuskan Anda untuk menulis Dockerfile atau memiliki buruh pelabuhan diinstal, dan langsung terintegrasi ke Maven dan Gradle.

Dalam aliran build gambar Java ke Docker "tradisional", kita memerlukan Dockerfile dan daemon docker terpasang, seperti yang ditunjukkan di bawah ini:

Gambar 2: Langkah-langkah tradisional untuk membuat gambar buruh pelabuhan dari aplikasi Java.

Seperti yang ditunjukkan diagram, di Jib build flow Anda hanya perlu plugin file build proyek:

Gambar 3: Cara Jib untuk membuat gambar buruh pelabuhan dari aplikasi Java.

Mendirikan

Ini bukan dalam lingkup pos ini untuk menyiapkan lingkungan pengembangan Java, tapi mari kita coba!

  1. Pastikan Anda telah menginstal Java 8+.
  2. Kami akan menggunakan maven, jadi jika tidak ada instal maven 3.5+.
  3. Pastikan Anda memiliki buruh pelabuhan yang diinstal dan jika Anda menggunakan Linux, pengguna Anda memiliki akses buruh pelabuhan.
  4. Pasang IDE favorit Anda (gerhana atau ide).

Buat aplikasi boot musim semi dasar

Ini dapat dilakukan melalui spring initializr, atau melalui IDE favorit Anda. Jika Anda menggunakan initializr musim semi, Anda perlu mengimpor proyek pakar yang baru dibuat ke dalam IDE Anda (gerhana / ide).

Tambahkan jib-maven-plugin ke pom.xml Anda

Untuk gambar yang disimpan secara mendasar di aplikasi Anda, konfigurasikan jib-maven-plugin di pom.xml Anda sebagai berikut:

Kompilasi aplikasi dan bangun gambar

Sekarang kita dapat membangun aplikasi dan memeriksa apakah gambar dibuat di repositori buruh pelabuhan lokal kami.

Buka folder root proyek melalui terminal, dan jalankan:

mvn compile jib: dockerBuild

Maven build log harus berisi baris seperti berikut:

[INFO] - - jib-maven-plugin: 0.10.1: dockerBuild (default-cli) @ spring-boot-jib - -
[INFO]
[INFO] Aplikasi Containerisasi ke Docker daemon sebagai springbootjib…
[PERINGATAN] Gambar dasar ‘gcr.io/distroless/java’ tidak menggunakan intisari gambar tertentu - build mungkin tidak dapat direproduksi
[INFO] Mendapatkan gambar dasar gcr.io/distroless/java…
[INFO] Membangun lapisan dependensi ...
[INFO] Membangun lapisan sumber daya ...
[INFO] Lapisan bangunan kelas ...
[INFO] Menyelesaikan ...
[INFO]
[INFO] Entrypoint kontainer disetel ke [java, -cp, / app / resources: / app / classes: / app / libs / *, com.jibdemo.SpringBootJibApplication]
[INFO] Memuat ke daemon Docker…
[INFO]
[INFO] Bangun gambar ke daemon Docker sebagai springbootjib

Selama tidak ada kesalahan dan kita melihat bahwa pakar "Membangun image ke Docker daemon sebagai springbootjib" kita semua sudah siap.

Jalankan gambar buruh pelabuhan

Pada titik ini kita harus memiliki gambar buruh pelabuhan baru di repositori lokal kita. Kita dapat memeriksa dengan mengeksekusi gambar buruh pelabuhan ls dan kita akan melihat gambar yang mirip dengan ini:

springbootjib eb4bea693650 terbaru 3 jam yang lalu 135MB

Perhatikan ukuran gambar yang sangat kecil (135mb), yang disebabkan oleh gambar gcr.io/distroless/java yang digunakan Jib secara default (kita akan melihat bagaimana kita dapat mengubahnya nanti).

Jadi sekarang kita dapat menjalankan gambar seperti biasa dengan mengetikkan docker run -it springbootjib dan memverifikasi bahwa aplikasi berjalan seperti yang diharapkan.

Mengkonfigurasi plugin Jib untuk menyempurnakan gambar Docker kami

Kita dapat menggali lebih dalam, dan mengkonfigurasi plugin Jib lebih lanjut, agar sesuai dengan beberapa skenario umum seperti login ke repositori buruh pelabuhan, mengekspos port, memilih gambar dasar tertentu dll.

Misalnya dalam konfigurasi berikut gambar:

  • Dibangun dari basis openjdk: alpine (ditarik dari Docker Hub)
  • Didorong ke localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpine, dan localhost: 5000 / springbootjib: terbaru
  • Dijalankan dengan memanggil java -Xms256m -Xdebug -cp app / libs / *: app / resources: app / classes com.jibdemo.SpringBootJibApplication some args
  • Mengekspos port 8001 untuk tcp (default), dan port 8002 dan 8003 untuk udp
  • Memiliki label (nama: springbootjib)
  • Dibangun sebagai format OCI

Sekarang Anda dapat membangun gambar lagi, dan melihat perbedaan dalam log maven:

[INFO] --- jib-maven-plugin: 0.10.1: dockerBuild (default-cli) @ spring-boot-jib ---
[INFO]
[INFO] Aplikasi penampung ke Docker daemon sebagai localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpine, localhost: 5000 / springbootjib ...
[INFO] Mendapatkan gambar dasar openjdk: alpine ...
[INFO] Membangun lapisan dependensi ...
[INFO] Membangun lapisan sumber daya ...
[INFO] Lapisan bangunan kelas ...
[INFO] Gambar dasar memerlukan auth. Mencoba lagi untuk openjdk: alpine ...
[INFO] Mengambil kredensial registri untuk registry.hub.docker.com ...
[INFO] Menyelesaikan ...
[INFO]
[INFO] Entrypoint kontainer diatur ke [java, -Xms256m, -Xdebug, -cp, / app / resources: / app / class: / app / libs / *, com.jibdemo.SpringBootJibApplication]
[INFO] Memuat ke daemon Docker ...
[INFO]
[INFO] Membangun image ke daemon Docker sebagai localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpine, localhost: 5000 / springbootjib

Perhatikan di segmen log di atas bahwa plugin menarik gambar openjdk: alpine dari Docker Hub, membuat gambar menjadi tiga versi dengan tag berbeda dan menyimpannya di repositori lokal kami.

Mengapa saya mengambil bidikan dengan Jib

  • Anda tidak perlu memelihara Dockerfile, menjalankan daemon Docker, atau bahkan khawatir membuat JAR yang gemuk dengan semua dependensinya.
  • Mengambil keuntungan dari penataan gambar dan caching registri untuk mencapai pembangunan yang cepat dan bertahap.
  • Dapat dikonfigurasikan untuk membuat gambar bangunan yang dapat diproduksi ulang selama input Anda tetap sama.

Kesimpulan

Setelah menggunakan plugin pakar lain seperti yang berasal dari spotify dan fabric8 untuk membuat gambar buruh pelabuhan untuk aplikasi java, saya menyambut baik Google yang mengambil masalah ini. Ini membutuhkan lebih sedikit file daripada plugin fabric8, dan (menurut pendapat saya yang sederhana) terasa lebih mudah untuk dikonfigurasikan daripada plugin spotify. Saya merekomendasikan untuk mencobanya!

Penafian: Ini bukan artikel perbandingan, hanya sudut pandang saya tentang masalah yang didukung dari pengalaman pribadi.

Anda selalu dapat membaca lebih lanjut di Jib's github repo, yang memiliki informasi menyeluruh mengenai semua parameter konfigurasi. Terima kasih sudah membaca sejauh ini! Saya harap Anda menikmatinya! Jangan ragu untuk meninggalkan umpan balik Anda di sini.

Tentang saya

Hey, terima kasih sudah berkunjung. Saya seorang insinyur penuh tumpukan independen, menekankan pada bagian belakang dan pengembang. Saya tertarik untuk membuat prototipe / MVP dan mengembangkan platform yang berskala di cloud, memilih untuk menciptakan nilai bisnis.

Anda dapat membaca lebih banyak tentang saya dan kisah saya di sini. Jika Anda ingin mendiskusikan bisnis atau menghubungi kami, kirimkan saya email: tasos.tsaousis@codedlines.com.