Java İle Docker Konteynerleri İçin Uygulama Paketleme Nasıl Yapılır?

Java İle Docker Konteynerleri İçin Uygulama Paketleme Nasıl Yapılır?
Java İle Docker Konteynerleri İçin Uygulama Paketleme Nasıl Yapılır?

Ön Hazırlık ve Gereksinimler

Uygulama paketleme sürecine başlamadan önce geliştirme ortamınızın hazır olduğundan emin olmalısınız. Aşağıdaki araçların sisteminizde kurulu olması gerekmektedir:

  • Java Development Kit (JDK) 21 veya üzeri: Uzun süreli destek (LTS) sürümü olması önerilir.
  • Docker Desktop veya Engine: Konteyner yönetimi için temel araç.
  • Maven veya Gradle: Java projelerinde bağımlılık yönetimi ve build aracı.
  • IDE: IntelliJ IDEA veya VS Code (Java eklentileri ile).

Kurulumları kontrol etmek için terminal üzerinden şu komutları çalıştırabilirsiniz:

java -version
docker --version
mvn -version

Bu komutlar, ortam değişkenlerinizin doğru yapılandırıldığını ve araçların kullanıma hazır olduğunu doğrulamanızı sağlar.

Basit Bir Java Uygulaması Oluşturma

Docker paketleme sürecini anlamak için öncelikle basit bir Spring Boot uygulaması hazırlayalım. Bu uygulama, Docker konteyneri içinde çalışacak olan temel bir HTTP servisidir.

// AppController.java
package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AppController {
    @GetMapping("/api/status")
    public String status() {
        return "Java uygulaması Docker üzerinde başarıyla çalışıyor!";
    }
}

Yukarıdaki kod, uygulamanın konteyner içinde ayağa kalktığını doğrulamak için kullanacağımız temel bir endpoint'tir.

Docker Dosyası (Dockerfile) Hazırlama

Dockerfile, Docker'a uygulamanızı nasıl paketleyeceğini söyleyen talimatlar dosyasıdır. 2026 standartlarına göre "Multi-stage" (çok aşamalı) build yöntemi, nihai imaj boyutunu küçültmek ve güvenliği artırmak için zorunludur.

# Aşama 1: Build aşaması
FROM maven:3.9-eclipse-temurin-21 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# Aşama 2: Çalıştırma aşaması
FROM eclipse-temurin:21-jre-jammy
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

Bu Dockerfile, önce uygulamayı derler, ardından sadece gerekli olan JRE (Java Runtime Environment) ve derlenmiş JAR dosyasını alarak hafif bir imaj oluşturur.

İmaj Oluşturma ve Konteyneri Çalıştırma

Hazırladığınız Dockerfile dosyasını kullanarak uygulamanızı imaj haline getirebilirsiniz. Bu işlem, uygulamanızın her yerde çalışabilir bir kopyasını oluşturur.

# İmajı oluşturma
docker build -t java-app-demo:1.0 .

# Konteyneri çalıştırma
docker run -d -p 8080:8080 --name my-java-container java-app-demo:1.0

Burada -d parametresi konteynerin arka planda çalışmasını, -p ise host makinenizdeki 8080 portunun konteynerin 8080 portuna yönlendirilmesini sağlar.

Java Uygulamaları İçin Docker Optimizasyon Teknikleri

Java uygulamaları büyük imaj boyutlarına sahip olabilir. Bunu engellemek için JLink gibi araçlarla özel bir JRE oluşturabilir veya imaj katmanlarını optimize edebilirsiniz.

Yöntem Avantaj Dezavantaj
Multi-stage Build Küçük imaj boyutu Daha karmaşık Dockerfile
Distroless İmajlar Maksimum güvenlik Debug zorluğu
Katman Önbellekleme Hızlı build süresi Doğru sıralama gerektirir
Kritik Uyarı: Üretim ortamlarında (production) asla "latest" etiketini kullanmayın. Her zaman belirli bir sürüm numarası (örneğin: 1.0.2) kullanarak imajlarınızı versiyonlayın. Bu, geri dönüş (rollback) süreçlerini kolaylaştırır.

Güvenlik ve En İyi Pratikler

Docker konteynerleri içinde çalışan Java uygulamalarının güvenliği için root kullanıcısı ile çalıştırmaktan kaçınmalısınız. Konteyner içinde düşük yetkili bir kullanıcı oluşturmak, olası bir sızıntıda sistemin güvenliğini korur.

# Dockerfile içine ekleyin
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

Bu yapılandırma, uygulamanın konteyner içinde sınırlı yetkilerle çalışmasını sağlar ve güvenlik açıklarını minimize eder.

Sıkça Sorulan Sorular

Java uygulamasını Docker'da çalıştırmanın en büyük avantajı nedir?

En büyük avantaj, uygulamanın bağımlılıklarıyla birlikte paketlenmesi sayesinde, geliştirme, test ve üretim ortamları arasında hiçbir uyumsuzluk yaşanmamasıdır.

Multi-stage build neden gereklidir?

Build araçlarını (Maven/Gradle) ve kaynak kodları üretim imajına dahil etmemek, imaj boyutunu ciddi oranda düşürür ve saldırı yüzeyini azaltır.

Docker konteynerinde Java bellek yönetimi nasıl yapılır?

Java, konteyner bellek limitlerini otomatik algılayabilir. Ancak -Xmx ve -Xms parametrelerini Docker ortam değişkenleri ile belirlemek, JVM'in konteyner sınırlarına uygun davranmasını sağlar.

Konteyner içindeki loglara nasıl erişirim?

docker logs [konteyner_adı] komutu ile uygulamanızın standart çıktı (stdout) loglarını anlık olarak takip edebilirsiniz.

Docker imajlarını nasıl güncellerim?

Kodunuzda değişiklik yaptıktan sonra yeni bir imaj etiketiyle docker build yapmalı ve yeni imajı konteyner orkestrasyon aracınızla (Kubernetes vb.) dağıtmalısınız.

Java Uygulamalarında Docker Hata Ayıklama (Debugging) Teknikleri

Konteynerize edilmiş bir Java uygulamasında hata ayıklamak, yerel geliştirme ortamından farklı bir yaklaşım gerektirir. Uygulama bir konteyner içinde izole çalıştığı için, dışarıdan bir hata ayıklayıcı (debugger) ile bağlanmak için JVM parametrelerini doğru yapılandırmanız gerekir.

Uzak Hata Ayıklama (Remote Debugging) İçin Yapılandırma

Konteynerinizi başlatırken JVM'e hata ayıklama portunu dış dünyaya açması talimatını vermelisiniz. Aşağıdaki Dockerfile komutu veya çalışma zamanı parametresi, uygulamanın 5005 portunu dinlemesini sağlar.

# Dockerfile veya docker-compose.yml içerisinde
ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar", "app.jar"]

Bu yapılandırmadan sonra, konteyneri çalıştırırken port eşleştirmesi yapmayı unutmamalısınız:

docker run -p 8080:8080 -p 5005:5005 java-app-image

Artık IntelliJ IDEA veya Eclipse gibi IDE'lerinizden "Remote JVM Debug" konfigürasyonu oluşturarak localhost:5005 adresine bağlanabilir ve canlı konteyner üzerinde adım adım kod takibi yapabilirsiniz.

Java Konteynerlerinde Performans İzleme ve Metrik Toplama

Docker üzerinde çalışan Java uygulamalarının sağlığını takip etmek, özellikle mikro hizmet mimarilerinde kritik öneme sahiptir. Uygulamanın CPU, bellek ve iş parçacığı (thread) durumunu izlemek için Prometheus ve Grafana gibi araçlar endüstri standardıdır.

Micrometer ve Actuator Entegrasyonu

Uygulamanızdan metrik toplamak için Spring Boot Actuator ve Micrometer kütüphanelerini kullanabilirsiniz. Bu araçlar, uygulamanızın çalışma zamanı verilerini /actuator/prometheus uç noktasında dışa aktarır.


    org.springframework.boot
    spring-boot-starter-actuator


    io.micrometer
    micrometer-registry-prometheus

Bu yapılandırma ile Docker konteyneriniz, bir izleme sistemi tarafından periyodik olarak sorgulanabilir hale gelir. Ayrıca, konteyner bazlı kaynak kısıtlamalarını (cgroups) izlemek için aşağıdaki komutu kullanarak anlık istatistikleri görebilirsiniz:

docker stats 

Bu komut, Java uygulamanızın Docker tarafından atanan bellek limitlerine ne kadar yaklaştığını ve CPU kullanım oranını gerçek zamanlı olarak görmenizi sağlar. Özellikle "Out of Memory" (OOM) hatalarını önceden tespit etmek için bu metrikler hayati değer taşır.

Sonuç

Java ile Docker konteynerleri için uygulama paketleme, modern yazılım geliştirme döngüsünün ayrılmaz bir parçasıdır. Bu rehberde öğrendiğiniz multi-stage build teknikleri, güvenlik pratikleri ve optimizasyon yöntemleri, uygulamalarınızı daha kararlı ve güvenli hale getirecektir. Bir sonraki adım olarak, bu imajları bir Docker Registry üzerinde depolamayı ve CI/CD süreçlerine entegre etmeyi deneyebilirsiniz.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamlarında kullanmadan önce mutlaka güvenlik taramalarından geçirin ve güncel bağımlılık sürümlerini takip edin.
Bu yazıya tepkinizi paylaşın:
Selin Yılmaz

Kişisel gelişim ve zaman yönetimi odaklı pratik teknikler üzerine çalışıyorum. Günlük rutinleri iyileştiren, zaman kazandıran yöntemleri bilimsel temellere dayandırarak editöryal bir dille paylaşıyorum.

Yorumlar (0)

Yorum Yaz