Container Nedir ?
Yazılımların standartlaşmış paketidir. Bir geliştiricinin bir uygulamayı, kütüphaneler ve diğer bağımlılıklar gibi ihtiyaç duyduğu tüm parçalarla paketlemesini ve tek bir paket olarak göndermesini sağlar. Bu sayede uygulama içerisinde kod yazma ve test etmek için kullanılan makineden farklı olabilecek herhangi bir özelleştirilmiş ayardan bağımsız olarak, uygulamanın başka bir Linux makinesinde (containerda) çalışmasını sağlamaktadır.
Docker Nedir ?
Docker, container teknolojisi kullanarak uygulama oluşturma, dağıtma ve çalıştırma işlemlerini kolaylaştırmak için tasarlanmış bir araçtır. Docker bir sanal makine gibidir ancak sanal bir makineden farklı olarak, bütün bir sanal işletim sistemi oluşturmak yerine, Docker uygulamaların aynı Linux çekirdeğini kullandıkları sistem olarak kullanmasına izin verir. Bu önemli bir performans artışı sağlar ve uygulamanın boyutunu azaltır. Kısaca docker şöyle düşünebiliriz bir çekmeceniz var ve bu çekmecede herşey paketli yani kaplarında bulunuyor bu container teknolojisidir. Docker da bu sayede aradığı herşeyi bulabiliyor bu da dockerın çalıştırma ve dağıtma işlevidir.
Dockerın bulut yazılım veya Blockchain teknolojisinde yeri oldukça önemlidir.
Burada docker çalışma mantığını görüyorsunuz. Docker Client-Server modeli ile çalışır. Client Docker host’u ile konuşarak program ile ilgili “build”, “pull”, “run” gibi talimatları (instructions) bildirir. Host RESTful API aracılığıyla client ile konuşur. Registry ise bir Docker image kütüphanesidir.
Burada size dockerin içerisine yerleşmiş bazı terimlerden de bahsetmek isterim.
- Image çalıştırmak istediğimiz programların paketlenmiş halleridir. Her image layer’lardan oluşur ve her image’ın bir base layer’ı vardır. Her yeni yaratılan container için image üzerine bir layer eklenir.
- Popüler image’lar için: Explore — Docker Hub örnek olarak MySql veritabanı image hazır olarak indirilip kullanılabilir.
- Image’lar Docker Registry kütüphanesinden indirilir.
- Containerlar ise image’ların çalışabilen bir örneğidir.
- Dockerfile ise image yaratmak için instructionlar içeren bir dosyadır.
- Dockerfile’daki bilgiler Docker Engine tarafından işlenir ve image yaratılır.
- Volumes ise data directory’sidir. Data volume sunucu ile /var/lib/docker/volumes directory’sinde paylaşılır.
Şimdi size docker kurulumu ve komutları hakkında bilgi vermek isterim.
Öncelikle Docker kurulumu için: https://docs.docker.com/get-docker/
- create: Docker imagelarını bir container olarak çalıştırmamızı sağlar.
- ps: Çalışan containerları listeler. -a parametresini eklersiniz, çalışan ve çalışmayan tüm containerlar listelenecektir.
- start: Oluşturulmuş olan containerları başlatır.
- attach: Terminalinizi standart giriş/çıkış’ını (I/O) containerlara bağlar.
- build: Dockerfile dosyasını alarak image haline getirir.
- images: Makineniz içerisinde çalıştırılabilir Docker imagelarını gösterir.
- run: Containerı çalıştırır ve belirtilirse container içinde komut çalıştırır.
- rmi: Bir veya birden fazla Docker image ını silmek için kullanılır.
- rm: Bir veya birden fazla containerı silmek için kullanılır.
- kill: Bir veya birden fazla çalışan containerı durdurmak için kullanılır.
- ps: Çalışan containerları listelemek için kullanılır.
- tag: Oluşturulan imagelara tekrar ulaşabilmek için etiketleme yapar. (Versiyonlama için kullanılabilir)
- login: Docker Registery (Hub)’a bağlanmak için gerekli olan doğrulamayı yapar.
Burada ki veridiğimiz bazı komutlar terminalde kullanımı olan komutlardır.
Şimdi spring boot projemizin veritabanı bağlantasını docker container içerisinde olan MySql Database de nasıl yapacağımızı göstereceğim.
Spring Boot MySQL uygulamasını docker-compose kullanarak dağıtmak için, tüm uygulama hizmetleri için yapılandırmayı içeren bir docker-compose.yml dosyası oluşturmamız gerekir .
Projemizin kök dizinine gidin ve bir docker-compose.yml dosyası oluşturun. Bu docker-compose.yml içerisinde olması gereken yapılandırma kodlarını paylaşıyorum sizlerle.
version: '3.1'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 'password'
ports:
- "3307:3307"
volumes:
- ./mysql:/var/lib/mysql
image: mysql
MySQL resmi imajını kullanarak bir konteyner oluşturur.restart: always
konteynerin her zaman yeniden başlaması gerektiğini belirtir.environment:
MySQL veritabanı yapılandırmasına çevre değişkenleri ekler.MYSQL_ROOT_PASSWORD
çevresel değişkeni, MySQL kök kullanıcısının şifresini belirler.ports:
3307 portunun konteynere nasıl yönlendirileceğini belirtir. İlk numara yerel makinedeki portu, ikinci numara ise konteynerdaki portu temsil eder. Bu örnekte, yerel makinedeki 3307 portu, konteynerdaki 3307 portuna yönlendirilir.volumes:
İsteğe bağlı olarak, konteynere başlatılırken veritabanı dosyalarının yüklenmesi için bir volume belirtir.
Burada ben 3307 kullandım çünkü localdaki MySql veritabanım 3306'da çalışmakta.
Bu yapılandırmaları yaptıktan sonra restful uygulamanızın terminalini açıp
‘‘docker-compose up’’ komutunu yazmanız yeterli veritabanınızın öncelikle docker hubdan pull edilip çalıştığını göreceksiniz.
Referanslar:
https://www.youtube.com/playlist?list=PLRp4oRsit1bzGGClDYCplnGKYI6p-dDE1
https://www.youtube.com/playlistlist=PL_f2F0Oyaj4_xkCDqnRWp4p5ypjDeC0kO