Merhaba.

Bu yazıda sizlere Docker Compose kullanarak Elasticsearch ve Spring Boot’un Dockerize edilip kullanılması hakkında bilgi vereceğim.

Öncelikle bilgisayarınızda Docker’ın kurulu olması gerekmektedir. Windows kullanan arkadaşlar https://docs.docker.com/docker-for-windows/install/ adresindeki maddeleri takip ederek Docker’ı bilgisayarlarına kurabilirler. Esasen kurulum için spesifik olarak yapılması gereken bir şey yok. Next Next deyip kurulumu tamamlayabilirsiniz.

Bu yazı için geçenlerde Elasticsearch’ün Spring Data ile beraber kullanımına dair kullandığım örnek uygulamayı kullacağım.

Docker Compose File Oluşturulması

Docker Compose bizim uygulamamızın ihtiyaç duyduğu servisleri tek bir komutla ayağa kaldırmamızı sağlayan bir araçtır arkadaşlar. Ayağa kaldırma sırasında uygulanacak prosedürleri .yaml formatındaki bir dosyada saklarız.

Biz de şimdi projenin kök dizini içerisinde docker-compose.yml adında bir dosya oluşturuyoruz.

docker-compose.yml Dosyasının İçeriği

docker-compose.yml dosyamız az önce de bahsettiğim gibi uygulamamızın ihtiyaç duyduğu servislerin, bağımlılıkların nasıl ayağa kaldırabileceğini söylediğimiz dosyadır. Konfigürasyon işlemimiz bu dosya içerisinde yer alacaktır.

docker-compose.yml dosyamızın içeriği de şu şekildedir:

version: '3'

services:
  web:
    build: .
    ports:
      - "8080:8080"
    networks:
      - docker-files_default
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.1
    restart: always
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - node.name=nodefortutorial
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - docker-files_default
networks:
  docker-files_default:
    external: true

volumes:
  esdata:
    driver: local

docker-compose.yml dosyası içeriğinde services seçeneği altında web ve elasticsearch adında 2 alt tag’imiz var.

web dediğimiz kısım bizim Spring Boot uygulamamızı simgeliyor. Uygulamamız 8080 portunda çalışacak ve docker-files_default adındaki bir network’e dahil olacak.

elasticsearch tag’i altında da image özelliği ile Docker Hub’dan çekilcek elasticsearch imajını belitriyoruz. container_name özelliği ile Docker container isimlendirmesini yapıyoruz. environment özelliği ile elasticsearch’ün çalışma şeklini konfigüre ediyoruz. discovery.type=single-node elastichsearch’ün tek node üzerinde çalışacağını söylüyoruz, cluster.name node’u kapsayan cluster’ı isimlendiriyoruz. bootstrap.memory_lock özelliğine true ataması yaparak elasticsearch ayağa kalkarken RAM’den bir alanı kendisine ayıracağını belirtiyoruz. node.name=nodefortutorial özelliği ile de ayağa kalkacak tek node’un isimlendirmesini yapıyoruz. Ayrıca network üzerinden elastichsearch’e de bu node ismi ile erişeceğiz. ports özelliği ile elasticsearch’ün çalışacağı portları ayarlıyoruz. 9200 ve 9300 portları elasticseach’e tahsis edilecek.networks kısmında da web kısmında olduğu gibi elasticsearch’ü docker-files_default adındaki network’e dahil ediyoruz.

Uygulama içerisinde RestClientConfig sınıfı içerisinde bağlanacağı Elasticsearch URL’lini belirten bir kısım yer alıyor. buradaki localhost:9200 kısmını nodefortutorial:9200 şeklinde değiştirmemiz gerekecektir çünkü Docker üzerinde çalışan uygulamaların localhost’u çözümleme yetisi olmuyor. Biz de bu nedenle Spring Boot uygulaması ve Elasticsearch’ü aynı network’e dahil ederek çalıştırıyoruz.

Network’ün Oluşturulması

.yml uzantılı dosyamızı hazırladıktan sonra sıra geldi network’ümüzü oluşturmaya. Oldukça basit bir komutu komut satırı üzerinde işleterek network’ü oluşturacağız. Çalıştıracağımız komut şu şekildedir:

docker network create docker-files_default

Bu komutu çalıştırdıktan sonra komut satırı üzerinden docker network ls komutunu çalıştırarak network’ün oluşturulup oluşturulmadığını görebiliriz.

Uygulamanın Ayağa Kaldırılması

Komut satırı üzerinden projenin kök dizinine gelip aşağıdaki komutu çalıştırdığımız takdirde Spring Boot uygulamamız ve elastichsearch Dockerize eidlmiş bir şekilde ayağa kaldırılacaklar.

docker-compose up -d

Komutun çalışması tamamlandığında yine komut satırı üzerinden docker ps -a komutunu çalıştırarak Docker’a kayıtlı imajları listeyelebiliriz.

Ekran görüntüsündne görebileceğimiz gibi Spring Boot uygulamamız ve Elastissearch Docker üzerinde koşmaya başlamışlar.

Uygulamayı Test Edelim

Şimdi Postman üzerinden http://localhost:8080/api/drivers/ adresine aşağıdaki body’e sahip HTTP POST isteğini gönderiyorum.

{
    "name":"Alex",
    "surname":"Albon",
    "team":"Aston Martin Red Bull Racing"
}

Kayıt İşlemi Başarılı şeklindeki mesaja sahip şekilde bir response geliyor.

Şimdi aynı adrese HTTP GET isteği gönderiyorum.

Az önce kaydettiğim kullanıcının bana gösterildiğini görüyorum. Uygulamamız başarılı şekilde çalışıyor.

Bu yazıda anlatacaklarım bu kadar arkadaşlar. Başka bir yazıda görüşene kadar hoşçakalın.