Spring Boot Dockerization: Uygulamayı Container'da Çalıştırma
Spring Boot uygulamanızı Docker üzerinde çalıştırmak için öncelikle bir Dockerfile oluşturun ve temel imajı (Örn: FROM openjdk:17-jdk-slim) belirleyin. Ardından Maven/Gradle ile ürettiğiniz JAR dosyasını container içine kopyalayın (COPY target/app.jar app.jar). Terminalde docker build -t myapp . komutuyla imajı oluşturun ve son olarak docker run -p 8080:8080 myapp komutuyla container'ı başlatın.
Spring Boot uygulamasını Docker ile çalıştırmak (Containerization), projeyi farklı ortamlarda (geliştirici makinesi, test, production) "Benim bilgisayarımda çalışıyordu" sorununu yaşamadan, daha kolay dağıtmanın ve tutarlı şekilde çalıştırmanın en modern ve pratik yoludur.
1. Spring Boot Uygulamasını Docker ile Çalıştırmak Neden Önemli?
Spring Boot projeleri geliştirme ortamında sorunsuz çalışsa bile, farklı sunuculara (AWS, DigitalOcean, şirket içi server) taşındığında işletim sistemi sürümü veya Java versiyon farklarından dolayı hatalar verebilir.
Docker bu problemi kökünden çözer çünkü uygulamayı çalışması için gereken tüm bağımlılıklar (JDK, kütüphaneler) ile birlikte paketler. Aynı image farklı makinelerde saniyeler içinde çalıştırılabildiği için dağıtım (Deployment) süreci daha hızlı ve daha güvenilir hale gelir.
2. Spring Boot Projesi Oluşturma ve Test Endpoint'i
Uygulamanın gerçekten çalıştığını görmek için Spring Initializr üzerinden Spring Web bağımlılığı ile bir proje oluşturduğunuzu varsayalım. Hızlıca bir test controller yazalım:
@RestController
public class HelloController {
@GetMapping("/")
public String index() {
return "Spring Boot Docker demo çalışıyor!";
}
}
Bu kodu yazdıktan sonra mvn clean install komutu ile projenizi derleyip target/ klasörü altında JAR dosyanızı oluşturun.
3. Dockerfile Oluşturma
Proje ana dizininde (pom.xml ile aynı yerde) uzantısı olmayan, adının tam olarak Dockerfile olduğu bir metin belgesi oluşturun. Docker, image üretirken bu dosyadaki talimatları yukarıdan aşağıya okuyarak çalışır.
# 1. Base Image (Uygulamanın çalışacağı temel işletim sistemi ve Java sürümü)
FROM openjdk:17-jdk-slim
# 2. Çalışma dizini belirleme
WORKDIR /app
# 3. Host makinedeki derlenmiş JAR dosyasını container içine kopyalama
COPY target/demo-0.0.1-SNAPSHOT.jar app.jar
# 4. Uygulamanın hangi portta çalıştığını belirtme (Dokümantasyon amaçlıdır)
EXPOSE 8080
# 5. Container ayağa kalktığında çalıştırılacak komut
ENTRYPOINT ["java", "-jar", "app.jar"]
4. Docker Image (İmaj) Build Etme
Dockerfile hazır olduktan sonra, proje dizininde terminali açarak aşağıdaki komut ile paketleme işlemini başlatın:
docker build -t dockerdemo -f Dockerfile .
- docker build: Image oluşturma komutudur.
- -t dockerdemo: Image adına "dockerdemo" etiketini (tag) verir.
- -f Dockerfile: Kullanılacak konfigürasyon dosyasını belirtir.
- . (Nokta): Build işleminin mevcut dizinde yapılacağını (Build Context) belirtir.
Build işlemi tamamlandıktan sonra image’ın oluşup oluşmadığını kontrol edin:
docker images
5. Docker Container Çalıştırma (Run)
Image başarılı bir şekilde oluşturulduktan sonra artık uygulamamızı izole edilmiş bir container olarak ayağa kaldırabiliriz.
docker run -d -p 9990:8080 --name my_spring_app dockerdemo
Bu komutta -p 9990:8080 ifadesi kritik öneme sahiptir. Host makinedeki (bilgisayarınızdaki) 9990 portu ile container içindeki 8080 portu eşleştirilir. Yani uygulama container içinde 8080'de çalışırken, siz tarayıcıdan localhost:9990 yazarak uygulamaya erişebilirsiniz. -d parametresi ise container'ın arkaplanda çalışmasını sağlar.
6. Sık Yapılan Hatalar
- Maven Build Unutulması: Jar dosyasını derlemeden (
mvn clean installyapmadan) Docker image oluşturmaya çalışmak. COPY adımı jar dosyasını bulamayacağı için hata verecektir. - Dosya Adı: Dockerfile dosya adını yanlış (Örn:
Dockerfile.txt) yazmak. - Yanlış Port Eşleştirmesi: Container içi portu dışarıya yanlış yansıtmak (Örn: uygulamanız 8080'de kalkıyorsa
-p 8080:9090yazmak).
7. Daha Temiz ve Güvenli Kullanım İçin Öneriler (Best Practices)
Temel bir Dockerfile öğrenmek için idealdir ancak gerçek projelerde (Production) şu kurallara dikkat edilmelidir:
- Küçük Base Image:
openjdk:17-jdk-slimveyaalpinekullanarak image boyutunu ciddi oranda azaltın. - Multi-stage Build: Maven derleme işlemini de Dockerfile içine alarak (Multi-stage build), gereksiz kaynak kodları final image içine dahil etmeyin.
- Environment Variables: Veritabanı şifresi gibi hassas verileri Dockerfile içine yazmayın, container'ı kaldırırken Environment Variable (
-e) ile dışarıdan verin.
8. Sık Sorulan Sorular
Spring Boot uygulamasını Docker ile neden çalıştırmalıyım?
Çünkü Docker, uygulamayı bağımlılıklarıyla birlikte paketler ve farklı işletim sistemlerinde (Windows, Mac, Linux) tamamen aynı ve tutarlı şekilde çalışmasını sağlar.
Dockerfile zorunlu mu?
Evet. Klasik Docker image üretim sürecinde, container'ın nasıl inşa edileceğini belirten talimatlar dizisi olduğu için Dockerfile zorunludur. (Ancak Spring Boot 2.3+ ile gelen Cloud Native Buildpacks teknolojisi Dockerfile olmadan da imaj üretebilir).
docker build -t ne işe yarar?
Build edilen image’a insanlar tarafından okunabilir bir isim ve etiket (tag) vermek için kullanılır.
Sonuç
Bu rehberde bir Spring Boot uygulamasını Docker ile nasıl çalıştıracağımızı adım adım inceledik. Önce bir Dockerfile hazırladık, docker build komutu ile kendi imajımızı oluşturduk ve son olarak docker run komutu ile uygulamamızı ayağa kaldırdık. Spring Boot projelerinizi daha taşınabilir ve buluta (Cloud) hazır hale getirmek istiyorsanız, Docker kullanımı atmak zorunda olduğunuz en güçlü adımdır.