Merhaba arkadaşlar, bugün sizlere parlamakta olan container teknolojisi "docker"dan bahsedeceğim. Öncelikle, docker nedir sorusuna cevap vererek başlayalım. Docker aslında bir DevOps tooludur. Kernel seviyesinde virtualization ya da daha bilinen adıyla "containerization" yapar. Low levelda nasıl çalıştığına dair daha uzun detayları
buradan bulabilirsiniz, ben uzun uzadıya değinmek istemiyorum.
Bir de neden docker sorusuna yanıt verelim. Bir sistemi bir yerden alıp, başka bir yere taşıma ihtiyacı, taşınan sistemde bütün herşeyin sıfırdan kurulum gerektirmesi gibi problemlerden dolayı diyebilirim. Tabii ki arkasında yatan başka sebepler de var, lakin bize en yakın olanı bu zannımca. Docker bize bir "image" seçtirir. Bu image yeri gelir bir OS (evet ubuntudur, centosdur) yeri gelir bir applikasyon olur.(databasedir, nodejsdir gccdir) Bu imageı bulunduran container aslında sistem de izole olmuş bir şeklide çalışmaktadır. Bu da bir diğer deyişle, kendi minik dünyasında çalışmaktadır.
Bunun dışında bilinmesi gerektiğini düşündüğüm bir diğer şey ise, docker, docker-compose
ve docker swarm (veya bir benzeri olan kubernetes) arasındaki farklar ve ne zaman hangi şartlarda neyin kullanılması gerektiği.
* Docker, bir adet container, yani bir servistir. İçerisinde belirtilen işi izole ederek çalıştırır.
* Docker-compose, birden fazla işi tek bir servis olarak çalıştırmanızı sağlar.
Yani tek bir servis içerisinde birden fazla container bulundurup, bunları
tek bir servis olarak serve eder.
* Docker swarm (ya da kubernetes), birbirinden farklı docker hostlarını(clusterlarını)
organize etmeye birbirleri arasındaki network ayarlarını değiştirmeye
ve bütün hepsini tek bir ürün olarak birbirine bağlamaya yarar.
Bu konuda ağırlıklı olarak Docker-compose üzerinden ilerleyeceğim. Lakin compose içerisinde kullanılan tüm ayarlar sadece 1 docker instanceı için de kullanılabilir, aklınızda bulunsun.
Öncelikle, dockerı ve docker composeu sistemimize kurarak başlayaylım.
Ben arch linux kullanıyorum, siz kendi distronuza uygun olan komutları yazarak devam edersiniz.
Kod:
$ sudo pacman -S docker
$ sudo pacman -S docker-compose
Not düşeyim, eğer docker servisi açık değilse ps komutunu çalıştırdığınız zaman
hata alacaksınız, o yüzden servisin çalıştığından emin olun.
Docker servisimizi başarılı bir şekilde çalışır hale getirdikten sonra yeni bir klasör oluşturup, docker-compose dosyasını tutacağımız bir klasör belirliyoruz.
eveet, gelelim docker-compose dosyasını yazma aşamasına.
Bende hazır yazılmışı var. Lakin burayı size detaylı şekilde açıklamaya çalışacağım. Öncelikle, kullanmak istediğiniz imagei hub.docker.com adresinden arayın. docker pull komutu ile sisteminize indirin. Eğer ben imaj kullanmak istemiyorum, Dockerfile'ımı kendim yazacağım diyorsanız image kısmına Dockerfile'ın bulunduğu yolu belirtmeniz gerekmekte. "./serviceX" gibi.
Şimdi yaml dosyasının içeriğine gelecek olursak,
version, docker-compose versiyonu. Versiyon arttıkça yeni bir kaç özellik ekleniyor tahmin edebileceğiniz gibi. Son versiyonu 3.7, ama ben 3 olarak kullanıyorum. Yeni eklenen özelliklere ihtiyaç duymadıkça tabii ki.
services, kullanılacak servisleri belirttiğimiz kısım.
postgres, bu servisin adı image'dan yukarıda bahsettim zaten ama, kısaca kullanılacak aplikasyon.
environment, Environment değişkenleri tıpkı PATH gibi.
!!!Port: Bunu belirtmek zorundasınız arkadaşlar, ve kullanacağınız uygulamanın hangi portu kullandığını da bilmek zorundasınız. ":" solundaki port sizin expose, yani kullanılmasını istediğiniz port. Sağdaki ise uygulamanın kendi kullandığı port. Yorum satırına alınmış pgadminde görebileceğiniz üzere, 80i kullanmasına rağmen ben 8080i kullansın diye belirtmişim.
Evet bu kadar, daha sonrasında "docker-compose up" komutu ile çalıştırıp belirttiğimiz porttan bağlanabiliriz.
Not2: Eğer server üzerinde çalışıyor ve docker-compose'un detach şekilde çalışmasını istiyorsanız(yani ctrl+c yaptığında kapanmasın istiyorsanız) -d parametresini ekleyin.
Son olarak bunu docker compose olmadan nasıl yapardık diyorsanız,
Kod:
docker run -e ENVIRONMENT VARIABLES -p PORTS --name NAME --detach
Ekstra:
Yukarıda bahsi geçen Dockerfile'ı nasıl yazarımcılar için
Kod:
FROM gcc:4.9
COPY . /HelloWorld
WORKDIR /HelloWorld
RUN gcc --o HelloWorld main.cpp --lstdc++
CMD ["./HelloWorld"]
FROM ile başlayan şey, kullanılacak tool, copy folder içerisindeki dosyaları izole ettiğimiz docker insanceının içerisine taşımak için kullanıyoruz. Workdir, dockerda uygulamanın çalışacağı klasörü belirtmek için run, komut çalıştırma, CMD ise commandline dan yazdığınız "command"
diye özetleyebilirim.
Umarım açıklayıcı olabilmişimdir, projelerinizde kullanmaya özen gösterin derim ben çünkü gündemde olan bir teknoloji ve bu alanda çalışacaksanız yakın gelecekte her şirketin talep edeceği bir teknoloji.
Saygılarımla.
Moderatör tarafında düzenlendi: