Ö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.

Yorumlar (0)
Yorum Yaz