Java Spring Boot Projesini Docker Container İçerisinde Derlemek ve Çalıştırmak – 2
Merhaba daha önceki yazımda Spring Boot ile geliştirdiğimiz bir Rest Api uygulamasını docker container da çalıştırmıştık. Bu yazıda ise derleme işlemi de dahil olmak üzere tüm süreci docker container içerisinde gerçekleştireceğiz. Yani herhangi bir java geliştirme ortamı olmayan bir makinede sadece docker kullanarak java projesini derleyip çalıştıracağız. Bu yazıyı okumadan önce bir önceki yazıyı buradan okumanızı tavsiye ederim. Çünkü bazı adımları daha önce yaptığımız için burada atlayacağım.
Üzerinde çalıştığımız projeye buradan erişebilirsiniz. İlk olarak projemizin kök dizinine Dockerfile isimli bir dosya oluşturalım.
Dockerfile içerisine aşağıdaki satırları ekleyelim:
FROM maven:3.6.0-jdk-11-slim AS MAVEN_BUILD
COPY pom.xml /build/
COPY src /build/src/
WORKDIR /build/
RUN mvn install -q
FROM openjdk:11-jre-slim
WORKDIR /app
ARG JAR_FILE=/build/target/*.jar
COPY asset /app/asset/
COPY - from=MAVEN_BUILD ${JAR_FILE} /app/app.jar
CMD ["java", "-jar", "app.jar"]
1- FROM maven:3.6.0-jdk-11-slim AS MAVEN_BUILD
Bu komut ile projemizi derlemek için gerekli olan Java Development Kit(jdk) imajını kullanıyoruz. Eğer bilgisayarınıza daha önce bu imajı indirmediyseniz docker hub üzerinden indirecek. Biz Spring Boot projesinde build tool olarak maven ve java versiyonu olarak 11 kullandığımız için bu imajı seçtim.
2- COPY pom.xml /build/
Projede kullanılan tüm gerekli kütüphane ve bağımlılıkların derleme aşamasında indirilebilmesi için pom.xml dosyasını build isminde bir klasör oluşturarak içine kopyalıyoruz.
3- COPY src /build/src/
Projenin tüm kaynak kodlarını build klasörüne kopyalıyoruz.
4- WORKDIR /build/
Bu komut ile kendimize bir çalışma dizini oluşturduk ve burada çalıştığımızı belirttik. Kaynak kod, pom.xml ve build sonrası oluşacak target klasörü burada bulunacak.
5- RUN mvn install -q
Bu komut projemizi build edecek ve build altına için .jar dosyasının bulunacağı bir target klasörü oluşturacaktır. -q kodu ise bu işlemi yaparken console a yazdırılan mesajları görmemek için. (isteğe bağlı)
6- FROM openjdk:11-jre-slim
.jar dosyasının oluşturacağımız containerda çalışabilmesi için bir Java Runtime Environment’ a ihtiyacımız olacak(jre). Ben projenin başında java 11 seçtiğim için jre versiyonunu da 11 seçerek devam ediyorum. Eğer farklı versiyonlar kullandıysanız docker hub üzerinden ihtiyacınız olan jre imajını bulabilirsiniz.
7- WORKDIR app/
Bu komut ile kendimize bir çalışma dizini oluşturduk. Derleme sonucu oluşan .jar dosyasının çalıştırılmasını app klasöründe gerçekleştireceğiz.
8- ARG JAR_FILE=/target/*.jar
Bu komut ile sistemimizde aslında bir değişken oluşturduk ve derlendikten sonra oluşan .jar dosyamızın yolunu tutmasını istedik. İleriki aşamalarda bu dosya yolunu kullanacağız.
9- COPY asset /app/asset/
Biz projede asset olarak bir .json dosyası ve ülke bayrakları kullandığımız için bunları container içerisine taşımamız gerekli. Bu yüzden COPY komutu ile asset klasörünü daha önce WORKDIR ile belirlediğimiz çalışma dizinine kopyalıyoruz.
10- COPY –from=MAVEN_BUILD ${JAR_FILE} /app/app.jar
Bu komut ile ilk aşamada MAVEN_BUILD olarak tanımladığımız katmandaki .jar dosyasını 7. adımda oluşturduğumuz app klasörüne app.jar ismiyle kopyalıyoruz.
11- CMD [“java”, “-jar”, “app.jar”]
Bu komut ile container içerisine kopyaladığımız app.jar dosyasını çalıştırıyoruz. CMD, terminal komutlarını çalıştırabileceğimiz bir docker komutudur. Bulunduğumuz dizinde şu terminal kodunu çalıştıracaktır:
java -jar app.jar
Dockerfile ile işimiz bu kadar. Şimdi yapmamız gereken bu dosyayı build ederek bir docker imajı oluşturmak. Bunun için Dockerfile’ın bulunduğu dizinde şu komutu çalıştırmak yeterli olacaktır: docker build -t countries-be .
-t ile imajımıza bir isim veriyoruz. Bu örnekte countries-be verdik. En sona koyduğumuz nokta ise dizinde bulunan Dockerfile’ı ifade ediyor. Komut çalıştıktan sonra sırası ile yukarıdaki 6 katman çalışacak ve bir docker imajı elde edeceğiz. Oluşan imajı şu komutla listeleyebiliriz: docker image list
Farklı bir şekilde Docker Desktop üzerinden de görüntüleyebiliriz.
Evet imajımız hazır ve çalıştırılmayı bekliyor. Bu imajı çalıştırdığımızda bir container oluşturulacak ve Spring Boot programımız bu container üzerinde çalışıyor olacak. Şimdi çalıştırma işlemine geçelim:
docker run -p 1234:8080 -t countries-be
-p ile container’ın çalışacağı portları belirliyoruz. Örnekte 1234:8080 olarak belirledik. Buradaki 8080 aslında Spring Boot programının çalıştığı port, 1234 ise bizim docker container’ına erişebilmemiz için belirttiğimiz port. Ben 1234 portundan container a erişmek için 1234:8080 ayarı ile container’ı çalıştırdım.
Şimdi Postman den bir get request i atalım ve sonucu görelim:
Bu yazıda docker container içerisinde Java Spring Boot projemizi başarılı bir şekilde derledik ve çalıştırdık.
İyi çalışmalar.