Spring Boot Uygulamasını Dockerize Etmek ve Jib Maven Plugin’i Kullanımı
Bu yazıda Spring Boot uygulamasını dockerize etmeyi, dockerhub’a yüklemeyi ve dockerhub’a yükleme işlemlerini Maven Jib Plugin’i kullanarak otomatize etmeyi konuşacağız. Ayrıca temel docker komutlarını göreceğiz.
Bu yaz öğrenci olarak katılmış olduğum GittiGidiyor — Kodluyoruz & Patika.dev işbirliğiyle düzenlenen 113. GittiGidiyor Java Spring Bootcamp’inde öğrenmiş olduklarımı derledim. Katkılarından dolayı eğitmenimiz Koray Güney’e ve arkadaşlarımız Furkan Işıtan ile Remzi Usta’ya teşekkür ediyorum.
Docker kelimesi liman işçisi anlamına geliyor.
Wikipedia ’dan docker tanımına bakalım.
Docker, “konteynerleştirme” olarak da bilinen işletim sistemi seviyesinde sanallaştırma sağlayan bir bilgisayar programıdır. İlk sürümü 2013'te yayınlanmıştır.
Docker, “konteyner” (container) adı verilen yazılım paketlerini çalıştırmak için kullanılmaktadır. Konteynerler birbirinden izole edilmiş ve bağımsız halde çalışabilmektedir. Tüm konteynerler tek bir işletim sistemi çekirdeği üzerinde çalışır ve bu sayede sanal makinelerden daha hafiftir. Konteynerler “imaj” (image) adı verilen salt-okunur dosya sistemlerinden oluşturulur.
Kısaca özetlemek gerekirse Docker sayesinde bilgisayarımıza PostgreSql veritabanı kurmadan uygulamamızda bu veritabanını kullanabiliyoruz. Docker ile tek bir komutla tüm sistemimizi ayağa kaldırabiliyoruz.
Image ve Container arasındaki fark nedir ?
Bunu örnekleyerek açıklayacak olursam image’ı java sınıflarımız gibi düşünürsek container, bu sınıflardan new operatörüyle ürettiğimiz instance’lara karşılık geliyor.
Dockerhub nedir ?
Docker image’larımızı host ettiğimiz yer. Örneğin git ile versiyonladığımız projelerimizi yayınladığımız github gibi.
Docker Kurulumu
Docker’ı kullanabilmek için localinizde kurulu olmalı. Kurulum için şuradaki adresten işletim sisteminize uygun olanı indirebilirsiniz. Kurulum tamamlandığında aşağıdaki arayüzle karşılaşacaksınız. Sol alt köşe yeşilse başarılı bir şekilde çalışıyordur. (Windows bilgisayarlarda yeşile dönmesi uzun sürebiliyor.)
Temel Docker Komutları
- docker — Docker komutlarını terminalden aşağıdaki komutla listeleyebilirsiniz.
C:\springboot-docker-maven-jib-plugin> docker
- docker help — Ayrıca aşağıdaki komutla da aynı listeye erişebilirsiniz.
C:\springboot-docker-maven-jib-plugin> docker --help
Herhangi bir komut üzerinde detayları öğrenmek istediğimizde bu komutu şu şekilde kullanıyoruz. Örneğin update komutunun detaylarını öğrenelim.
C:\springboot-docker-maven-jib-plugin> docker update --help
- docker image — Aşağıdaki komut tüm image’ları listeler.
C:\springboot-docker-maven-jib-plugin> docker image ls
yada
C:\springboot-docker-maven-jib-plugin> docker images
- docker rmi — Image silmek için Image Id’nin ilk 3–4 karakterini yazmak yeterli oluyor. Örneğin hello-world’ü silmek için.
| REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
| ----------- | ------ | ------------ | ----------- | ------ |
| hello-world | latest | feb5d9fea6a5 | 4 weeks ago | 13.3kB |C:\springboot-docker-maven-jib-plugin> docker rmi feb5
- docker run — Dockerhub’da yer alan bir image’ı çekmek ve çalıştırmak için aşağıdaki komutu kullanıyoruz. Örneğin şu image’ı çalıştıralım.
C:\springboot-docker-maven-jib-plugin> docker run hello-world
- docker pull — Çalıştırmayıp yalnızca localimize çekmek isteseydik şu komutu kullanacaktık.
C:\springboot-docker-maven-jib-plugin> docker pull hello-world
- docker container — hello-world image’ı çalıştı görevini tamamladı ve durdu. Aşağıdaki komut çalışmış ve ölmüş olan atıl durumdaki containerları listeler.
C:\springboot-docker-maven-jib-plugin> docker container ls -a
Çalışmakta olan tüm containerları ise şu komutla listeliyoruz.
C:\springboot-docker-maven-jib-plugin> docker container ls
- docker ps — Çalışan docker containerlarını listelemek için diğer bir komut şu. Yine bu komutunda sonuna ”-a” ekleyerek atıl durumda olanları görebiliriz.
C:\springboot-docker-maven-jib-plugin> docker ps
- docker stop — Çalışan containerı durdurmak için aşağıdaki komutu kullanıyoruz.
C:\springboot-docker-maven-jib-plugin> docker stop <CONTAINER_ID>
- docker rm — Container silmek için ise şu komutu kullanıyoruz.
C:\springboot-docker-maven-jib-plugin> docker rm <CONTAINER_ID>
- prune — Durmuş olan tüm containerları tek bir komutla silmek için ise aşağıdaki komutu kullanıyoruz.
C:\springboot-docker-maven-jib-plugin> docker container prune
Diğer docker komutları için şu referanstan devam edebilirsiniz.
Spring Boot / PostgreSql Projesini Dockerize Etmek
Spring Boot ve PostgreSql kullanarak hazırladığım basit bir Restfull uygulaması üzerinden ilerleyeceğiz. Projemizde bir tane api bulunuyor ve bununla ürün ekleyebiliyor/listeleyebiliyoruz. Örnek projeye bu adresten ulaşabilirsiniz.
Docker’ın, Dockerfile adında bir konfigürasyon dosyası var. Yeni bir docker image’i create etmemizi sağlıyor. Mevcut uygulamamızı bu dosya içerisinde yazacağımız ayarlara göre dockerize ediyoruz. Yani konteynırlaştırıyoruz.
Dockerfile Oluşturmak
Projenin ana klasörüne aşağıdaki Dockerfile dosyasını oluşturuyoruz.
- FROM : Spring projesinin çalışabilmesi için JDK’ya ihtiyacımız var. Bunun için Java platformunun open source implementasyonu olan OpenJDK’yı kullanıyoruz.
- EXPOSE : Hangi port üzerinde koşacağını söylüyoruz.
- ADD : jar dosyamizi isimlendiriyoruz. target altındaki jar dosyamiza yeni isim veriyoruz.
- ENTRYPOINT : executable olarak bir iş yapmasını sağlıyoruz. Terminal üzerinden bir jar dosyasını çalıştırma mantığıyla hareket ediyoruz.
Bu dosyayı oluşturduktan sonra uygulamamızı dockerize etmek için aşağıdaki komutu çalıştırıyoruz.
docker build -t spring-docker-demo .
Burada “-t” den sonra tag ismini yazıyoruz. (İstediğimiz isimlendirmeyi yapabiliriz.)
“.” sondaki nokta ise build ettiği image’ı bulunduğu klasöre koyacağını gösteriyor.
Aşağıdaki gibi bir çıktı alıyor olacaksınız. Böylece Spring projemizin Docker image’ini oluşturduk!
Oluşturduğumuz image’i localde çalıştırmak için aşağıdaki komutu kullanıyoruz.
docker run -p 8080:8080 spring-docker-demo
Burada “8080:8080” ikinci bölüm uygulamayı localde ayağa kaldıracağımız port oluyor. Örneğin “8080:9090” yazmış olsaydık uygulamamız “localhost:9090” da çalışırdı.
Dikkat ettiyseniz şimdiye kadar PostgreSql konfigürasyonlarını yapmadık. Bu yüzden çalıştırdığınızda aşağıdaki hatayı almış olabilirsiniz. İleride bunu düzelteceğiz.
Dockerhub’a Yüklemek
Oluşturduğumuz docker image’ını dockerhub’a yükleyerek global erişim sağlıyoruz. Herhangi birisi erişim sağlayarak kendi localinde uygulamamızı çalıştırabiliyor.
İlk olarak buradan hesabınızı oluşturmalısınız. Ardından terminalden aşağıdaki komutu çalıştırarak login olmalısınız.
docker login
Image ismini dockerhub kullanıcı adımıza göre taglıyoruz.
docker tag spring-docker-demo betulsahinn/spring-docker-demo
Ardından aşağıdaki push komutuyla image’ı dockerhub’a yüklüyoruz.
docker push betulsahinn/spring-docker-demo
Yüklediğimiz image’ı ise pull komutuyla localimize çekebiliyoruz. Yada run komutuyla aynı anda hem localimize çekip hem de çalıştırabiliyoruz.
docker pull betulsahinn/spring-docker-demodocker run betulsahinn/spring-docker-demo
docker-compose.yml Dosyası Oluşturmak
Bu dosya birden fazla containerı aynı anda çalıştırabilmemize olanak tanıyor. Detaylı bilgi için şuradaki yazıya gidebilirsiniz.
PostgreSql veritabanını docker üzerinden çalıştırmak için projenin ana klasörüne docker-compose.yml isimli aşağıdaki dosyayı oluşturuyoruz.
Ardından aşağıdaki komutla projeyi ayağa kaldırıyoruz.
docker-compose -f docker-compose.yml up -d
Ayrıca veritabanı oluşturmanıza lüzum yok kendisi otomatik oluşturuyor. Çok iyi değil mi ?
Tüm işlemleri başarıyla tamamladıysanız http://localhost:8080/swagger-ui.html adresine giderek aşağıdaki ekrana ulaşmış olmalısınız. Gördüğünüz gibi herhangi bir kurulum ihtiyacı duymadan tek bir komutla tüm sistemi ayağa kaldırdık.
Jib Maven Plugini Kullanımı
Şimdi tüm bu işlemleri maven plugini olan jib kullanarak otomatize edeceğiz. Böylece uygulamayı dockerize etme ve Dockerhub’a yükleme işlemlerini jib maven plugin’i bizim yerimize gerçekleştirecek.
İlk olarak aşağıdaki jib maven plugin deklarasyonunu, pom.xml dosyamızda <plugins></plugins> bölümüne koyuyoruz.
Yukarıdaki deklarasyon ile containerımızı oluşturuyoruz.
<configuration></configuration> bölümünde docker image konfigürasyonunu temel seviyede yaptık. Ayrıntı bilgi için jib resmi sayfasına bakabilirsiniz.
Ardından jib plugin’i ile deklare ettiğimiz Docker image’nı build etmek için aşağıdaki komutu kullanıyoruz.
mvn clean install jib:dockerBuild -Djib.to.image=spring-docker-demo:v1
Bu komutu çalıştırdıktan sonra aşağıdaki warningleri alabilirsiniz. Bu durumda aynı komutu tekrar çalıştırırsanız warningler kalkacaktır.
Jib ile oluşturduğumuz docker image’ını yine aynı şekilde terminale aşağıdaki komutları yazarak localhost:8080 ‘de çalıştırabilirsiniz.
docker run -p 8080:8080 spring-docker-demo:v1
İkinci olarak ise image’ı, dockerhub’a jib komutlarıyla pushlayalım. Burada taglama yaparken dockerhub kullanıcı adımızı yazıyoruz ve versiyon veriyoruz.
mvn clean install jib:build -Djib.to.image=betulsahinn/spring-docker-demo:v1
- Warning alırsanız aynı komutu tekrar çalıştırın.
Şimdi bu komutla yaptığımız dockerhub push işlemini jib pluginlerini kullanarak otomatize edelim.
Bunun için ilk olarak pom.xml dosyasında properties bölümüne aşağıdaki eklemeleri yapalım.
<properties>
<java.version>1.8</java.version>
<app.image.name>spring-docker-demo</app.image.name>
<app.image.tag/>
</properties>
Ardından pom.xml dosyasına profil tanımlıyoruz. Aşağıdaki deklarasyonu </plugins></build> etiketini kapattıktan sonra ekliyoruz.
İlk profil dockerhub’a pushlarken ikinci profil locale pushlamaktadır. Yani localde image oluşması için.
Maven bölümünden profilleri aşağıdaki ikinci resimdeki gibi işaretleyip komutu çalıştırınız. Uygulamaya tag ismi vermedik properties bölümünde tanımladığımız için. Yalnızca versiyon vermemiz yeterli.
mvn clean install -P jib-push-to-dockerhub -Dapp.image.tag=v2
Ardından dockerhub hesabınızı kontrol ederseniz oraya yüklenmiş olduğunu göreceksiniz.
Komut yazmakla uğraşmak istemezseniz maven bölümünden profilleri seçip mvn clean install komutunu çalıştırarak aynı işlemleri yapabilirsiniz.
Dockerhub’a gönderdiğiniz projeyi localde çalıştırmak için image isminin başına dockerhub kullanıcı adınızı eklemeyi unutmayın.
docker run -p 8080:8080 betulsahinn/spring-docker-demo:v1
Umarım faydalı olmuştur sizin için. Projenin tamamına şu repodan ulaşabilirsiniz.
Happy coding ! 🚀