Docker Notları
DOCKER NEDİR ?
Konteyner Teknolojisi Nedir ?
Konteynerlar kısacası , bir uygulamanın bağımlılıkların ve kütüphanelerinin başka uygulamalardan izole bir şekilde çalışmasını sağlayan bir teknolojidir. Bu sayede bu uygulamalar her yerde çalışabilir hale gelmektedir. Hatta aynı işletim sistemi üzerinde aynı uygulamaların farklı versiyonlarını bile çalıştırabiliriz. Örneğin; bir konteynerde web sunucusu, diğerinde veritabanı, diğerinde wordpress gibi uygulamalar çalıştırabiliriz. Hatta işletim sistemlerini bile konteynerda çalıştırabiliriz. Bu konteyner imajlarının boyutu normal bir sunucuya göre çok küçüktür.
Aşağıda sanallaştırma ve konteyner teknolojisi arasındaki fark gösterilmektedir.
Hypervizor tabanlı sanallaştırmada , bir fiziksel makine üzerinde birden fazla sanal sunucu oluşturulabiliyordu. Bu teknolojide her sanal sunucu kendi işletim sistemi çekirdeğine sahipti ve bu sanal sunucular çok fazla kaynak kullanıyordu.
Konteynerler ise , tek bir işletim sistemi üzerine birden fazla olacak şekilde oluşturulabilir ve bu konteynerlarda istenilen uygulamalar çalıştırılabiliyordu. Konteynerlar sanal sunuculara göre daha az kaynak kulllanıyorlar ve tüm konteynerler bulundukları işletim sistemi çekirdeğini kullanıyorlar. Aynı zaman konteynerların taşınması, sanal sunuculara göre daha kolaydır.
DOCKER NEDİR ?
Docker kısacası , konteyner teknolojisini basit ve hızlı bir şekilde oluşturulmasını , dağıtılmasını, test edilmesini sağlayan bir araçtır. Docker 2013 yılında ortaya çıkmıştır ama konteyner teknolojisi dockerdan önce de vardı.
DOCKER KURULUMU
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
Docker yükleme sırasında herhangi bir sorunla karşılaşmamak için yukarıdaki update komutu ve gerekli uygulamaları yüklüyoruz.
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Dockerın resmi GPG anahtarını yukarıda ki komutlarla sistemimze yüklüyoruz.
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Dockerın resmi reposunu sistemimize ekliyoruz.
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Eklediğimiz reponun geçerli olabilmesi için update komutunu ardından docker için gerekli bileşenleri yüklüyoruz.
DOCKER HUB NEDİR ?
DockerHUB , docker imajlarının bulunduğu dockerın resmi reposudur. Burada şirketler ve insanlar kendi imajlarını yükleyip başkaları tarafından kullanılmasını sağlamaktadırlar. Burada , işletim sistemleri , veritabanları, web sunucuları, yazılımlar… gibi aradığınız her şeyi bulubileceğiniz bir servistir. DockerHUB ta her imajın nasıl yükleneceği, nasıl kullanılacağı, hangi etiketlerin bulunduğu, environment gibi bilgiler bulunur bu yüzden hiçbir şeyi ezberlemenize gerek yoktur. DockerHUB gibi servislere genel olarak registry denir. Aşağıdaki bazı popüler registry ler bulunmaktadır.
· Docker Hub Registry
· Azure Container Registry
· AWS Container Registry
· Google Container Registry
· Quay Registry
DockerHub a girdiğinizde şöyle bir ekranla karşılaşırsınız.
Örneğin; alpine imajına tıklayıp nelerin olduğuna bakalım. Sağ tarafta nasıl yüklendiği , alt tarafta kullanılabilecek etikler ve resim gözükmeyen birçok bilgi bulunmaktadır.
Docker Image Nedir ?
Docker imajları, konteynerları oluşturan içerik diyebiliriz. Yani bu imageler oluşturulan konteynerın ne yapacağını söyleyen templatelardır. Bir imageden çok sayıda konteyner oluşturulabilir. Imageler Dockerfile dosyası ile oluşturulabilmektedir. Sizde bir Dockerfile oluşturarak kendi imajınızı oluşturabilirsiniz. Docker imajları read-only dir yani değiştirilemez. Yani ubuntu imajını indirdiniz diyelim siz bu imajın içeriğini değiştiremezsiniz. Bir container oluşturduktan sonra, değiştirilemez olan bu şablonun yani image’in üstüne yazılabilir bir katman (layer) ekler. Böylece artık değiştirebilirsiniz.
Kısacası, docker imajları, Dockerfile den , konteynerlarda docker imajlarından oluşmaktadır.
TEMEL DOCKER KOMUTLARI
docker pull imagename
Bu komutla dockerHUB üzerinde bulunan imajları kendi localimize indiriyoruz. Eğer localimizde varsa tekrardan indirmez.
docker pull ubuntu
Bu komutla “ubuntu” imajını indirdik.
docker images
bu komutla localde bulunan imajları görüntüleyebiliriz. Dockerda her şey bir ID ye sahiptir. İmajlar, konteynerler, networkler. Aşağıdaki çıktı imaj adı, image ID , bu imajın ne zaman oluşturulduğu ve boyutu bulunmaktadır.
Yukarıdaki resimde TAG şudur; bu imagenin hangi versiyonunu yüklediğimizi belirten bir değer diyebiliriz. Yani bu resimde ubuntunun en son sürümü indirdi. Şuan 22.04 sürümü son sürüm olduğu için onu yükledi. Eğer başka bir sürüm yüklemek istersek aşağıdaki komutu kullanabiliriz.
docker pull ubuntu:20.04
şeklinde ubuntunun 20.04 sürümünü yükleyebiliriz. Bu TAG ler dockerHUB ta imajın açıklamalar kısmında bulunmaktadır. TAG belirtmezsek varsayılan olarak en son sürümünü indirir.
docker run ubuntu
Bu komutla artık indirilen imajdan container yaratıyoruz. Bu komut imajı önce localde arar eğer yoksa dockerHUB tan önce pull eder ardından konteynarı oluşturur.
docker run ubuntu echo Merhaba
Yukarıdaki komutla ubuntu imajından bir konteyner oluşturur ve ekrana “merhaba yazar” ve işlem bittiği için konteynerı kapatır. Biz eğer bu ubuntunun içine girmek istiyorsak aşağıdaki “-it” parametresini kullanabiliriz.
Artık ubuntunun içindeyiz ve istediğimiz komutu çalıştırabiliriz. Şunu unutmayın bir konteyner kapandığı an önceden yaptığınız her şey silinir.
Örneğin; aşağıdaki gibi bir apache web sunucusu oluşturduk. Bazen böyle imajlar sürekli çalışır ve bunlar ön planda çalışır ve siz o ekranda hiçbir şey yapamazsınız. Böyle durumlarda sürekli çalışan konteynerların arkaplanda çalışmasını sağlamalıyız. Bu ekranda bir şey yapmak istiyorsak maalesef bu konteynarı kapatmaz zorunda kalıyoruz.
Aşağıdaki komutla konteynerı arkaplana alabiliriz. -d parametresi deattach kelimesiden gelmektedir.
docker run -d httpd
Bazen çalışan konteynerı ön plana almak isteyebiliriz. Böyle durumlarda ise
docker attach 4600c
komutuyla çalışan konteynarı ön tarafa alabiliriz. 4600c konteynerın ID sidir. Her konteynerin bir ID ye sahip olduğunu söylemiştik.
docker logs 4600c
komutu ile de bu konteynerın oluşturduğu logları görebiliriz.
docker ps
bu komut sadece çalışan konteyları gösterir.
docker ps -a
çalışan ve çalışmayan tüm konteynerları gösterir.
docker inspect containerID
komutu ile konteyner hakkında detaylı bilgiye ulaşabiliriz.
docker stop containerID
ile konteynerın çalışmasını durdurabiliriz. Ama bu komut konteyner üzerinde çalışan bir işlem varsa bu işlemin bitmesi bekler. Eğer 10 saniye içinde bitmezse otomotik olarak konteyner kapatılır.
docker kill containerID
bu komutla konteynerı anında kapatır. Sanki bilgisayarın fişi çekmiş gibi.
docker start containerID
ile de durdurulan konteynerları tekrardan başlatabiliriz
docker rm containerID
ile konteynerı silebiliriz. Eğer konteyner çalışıyorsa bu konteynerı durdurduktan sonra silebiliriz.
docker rm $(docker ps -q -a)
komutu ile durdurulmuş tüm konteynerları silebiliriz. -f parametresini force edersek çalışan , çalışmayan tüm konteynerları siler.
docker rmi imageID
ile komutu ile localde bulunan imajları silebiliriz. Silenecek imajların herhangi bir konteyner tarafından kullanılmaması gerekmektedir. Var ise önce konteynerları , ardından imajları silmeliyiz.
docker run –-name webSunucusu httpd
komutu ile oluşturulan konteynerın ismini “webSunucusu” yaptık. Aşağıdaki resimde en sağ tarafta görülüyor. Aşağıdaki çıktıda konteynerın ID si , bu konteynerın hangi imajdan oluşturulduğu, ne zaman oluşturulduğu, durumunun ne olduğu , hangi porttan hizmet verdiği ve ismi gözükmektedir.
Peki ben masaüstü bilgisayarımdan oluşturulan konteynere nasıl ulaşacağım. Masaüstümde vmware üzerinde oluşturulan sanal ubuntu makineye docker yüklü ve bir web sunucusu için konteyner oluşturduk.
docker run -p 8080:80 -d httpd
bu komut şunu yapmaktadır. Eğer biz dockerın yüklü olduğu makineye ait ip adresine 8080 portu ile bağlanmaya çalışırsak bizi bu konteynera bağlayacaktır.. 8080 portunu boşta olan istediğiniz bir portu yapabilirsiniz ama 80 portu konteynerın kullandığı port olmalıdır. Çalışan her servis bir porta aittir. Bu bir web server , veritabani sunucusu .. olabilir. Bu portlarda dockerHUB dökümanlarında verilir.
Böyle bir sonuç aldığımıza göre işlem başarılıdır.
docker run -p 27017:27017 -d mongo
Bu şekilde de mango ya bağlanabilmek için dockerın yüklü olduğu makineye 27017 portundan bağlanmamız gerekiyor. Mongo varsayılan olarak 27017 portunu kullanır. Portlar farklı da aynı da olabilir.
Docker Volume Nedir ?
Daha önce bir konteyner silindiği zaman içinde herşeyin yok olduğunu söylemiştik. Çünkü konteynerler oluşturulurken imaj üzerine okunabilir ve yazılabilir bir katmanda verileri tutarlar. İmajların sadece okunabilir olduğunu da belirtmiştik. Örneğin; bir veritabanı için konteyner oluşturduk ve içine veriler girdik. Yanlışlıkla konteyner silinirse tüm verilerde yok olur. Aynı şekilde bir web sunucusu içinde sonradan oluşturduğumuz sayfalarda yok olur. İşte böyle bir durumda docker volume devreye girer. Docker volume kısacası konteyner içinde verilerin kalıcı olmasını sağlayan bir yapıdır.
Şuan “public_html” klasöründe hiçbir şey yok.
docker run –name webSunucusu -p 8080:80 -v /home/suleyman/public_html/:/usr/local/apache2/htdocs httpd
şimdi aşağıdaki komutla web sunucusunun içine girip “/usr/local/apache2/htdocs” bir konumunda bir index.html dosyası oluşturalım.
docker exec -it containerID /bin/bash
Şimdi public_html klasörüne baktığımızda web sunucusu içinde oluşturulan sayfanın geldiğini görebiliriz. Bir volume birden fazla konteynera bağlayabiliriz.
docker volume create volume_name
ile kendimiz volume oluşturabiliriz. Ardından yukarıdaki volume için kullandığımız dosya konumunun yerine bunu volume kullanabiliriz.
docker volume ls
ile sistemdeki volume leri listeleyebiliriz.
docker volume rm volume_name
ile de istediğimiz volumeleri silebiliriz.
docker volume prune
ile sistemdeki tüm volumeleri silebiliriz.
Docker volume ve nginx kurulumunun yapılması ile ilgili örnek yapacağız. Öncelikle aşağıda ki komutla bir volume oluşturalım.
docker volume create nginxVolume
Şimdi nginx için konteyner kurulumu yapalım.
docker run --name nginxSunucu -v nginxVolume:/usr/share/nginx/html -p 8080:80 -d nginx
ile nginx için bir konteyner oluşturduk.
docker volume inspect nginxVolume
komutu ile bu volume hakkında detaylara ulaşabiliriz. Örneğin; bu volume ‘ nin hangi konumda oluşturulduğu öğrenebiliyoruz. İstersek bu konuma gidip dosyaları burada oluşturursak nginx konteynerının içinde de bu dosyaların oluşacağını görebiliriz. Ya da nginx konteynerın içine girip “/usr/share/nginx/html” konumunda dosya oluşturursak yine bu volumenin mount edildiği yerde bu dosyaları göreceğiz.
Nginx için web sitesi ayarlarını konteyner içinde /etc/nginx/conf.d klasörü içindeki dosyalardan yapabiliriz. Bu konfigurasyon dosyaları önemli dosyalar olduğu için bunlar için kesinlikle bir volume oluşturulmalıdır. Bizde bu dosyalar için bir volume oluşturacağız. Bir volume birden fazla konteynera , bir konteynera birden fazla volume oluşturulabilir.
docker volume inspect nginxVolumeConf
docker run –name webSunucu -p 8080:80 -v nginxVolume:/usr/share/nginx/html -v nginxVolumeConf:/etc/nginx/conf.d -d nginx
Hem web sayfaları hem de konfigurasyon dosyaları için aynı anda volumeler oluşturduk. Bu konteynerın yok olması durumunda başka br konteyner oluşturduktan sonra bu volumeleri bu konteynerlara bağlayacağız ve hiçbir şey olmamış gibi yolumuza devam edeceğiz.
Dockerfile Nedir ?
Daha önce imageların Dockerfile dosyasından oluşturulduğunu söylemiştik. Dockerfile kısacası imageların ne yapacağını söyleyen dosyadır. Her image başka bir image ‘ yi referans alarak oluşturulmak zorundadır. Dockerfile dosyasında ki her komut birer katmanı oluşturur. Aşağıdakida resimde gösterildiği gibi
FROM
Oluşturulacak image ‘ nin hangi imageden referans alınarak oluşturulacağını belirtir. Her Dockerfile dosyasında kesinlikle bulunmak zorundadır.
RUN
İmage oluşturulurken çalışacak kodları belirtir.
WORKDIR
Containerın çalışma dizinini belirtir.
COPY
Belirtilen dosyaları , konteyner içindeki konuma kopyalar
EXPOSE
Bu konteynerın hangi porttan hizmet vereceğini belirtir.
CMD
Konteyner ayağa kalktığında çalışacak kodları belirtir. Bir Dockerfile dosyasında sadece bir tane CMD komutu bulunabilir.
Bir Dockerfile dosyasında tüm komutların bulunmasına gerek yoktur.
Örneğin şimdi kendi image mizi oluşturalım. Bizim imagemız her kurulduğunda nginx web sayfası yerine bizim oluşturduğumuz sayfayı gösterecek.
Çalışacağımız konumda bir Dockerfile ve ve webSayfalari adlı bir klasor olsun. Bu klasorun içinde de bizim oluşturduğumuz bir index.html sayfası olsun. Şimdi Dockerfile dosyasını açıp aşağıdaki komutları yazıyoruz.
FROM nginx:latest
LABEL SuleymanAKTURK suleyman@gmail.com
WORKDIR /home/suleyman
COPY ./webSayfalari /usr/share/nginx/html
FROM ile nginx imagesini referans alıyoruz.
LABEL , ile bu image için bilgiler verdik.
WORKDIR ile bu image için çalışma dizinini belirtiyoruz.
COPY ile webSayfaları klasöründeki dosyaları , nginx in web sayfalarının bulunduğu klasöre kopyalıyoruz.
index.html sayfasının içeriği aşağıdaki gibidir.
docker build -t suleymanweb:v1 .
ile bu image yi yaratıyoruz. Suleymanweb imagenin ismi , v1 ise bir tag ‘ dır. Aşağıdaki komutla bir konteyner yaratıyoruz.
docker run -p 8080:80 -d suleymanweb:v1
Artık sunucumuzun 8080 portuna erişmeye çalıştığımızda bizim oluşturduğumuz image ye ait konteynera ulaşıyoruz.
Docker Network Türleri
Docker varsayılan olarak 3 tür networke sahiptir.
Bridge
Host
-
None
docker network ls
komutu ile sistemdeki networkleri görüntüleyebiliriz. Dockerı yeni kurduysanız sadece yukarıdaki 3 network gözükecektir ve varsaylan olarak gelen bu networkleri silemezsiniz.
Bridge network
Host yani dockerın yüklü olduğu sunucu ve container arasında ağ oluşturur. Oluşturulan konteynerler varsayılan olarak bu networke dahil olurlar ve bu yüzden birbirleriyle iletişim halindedirler. Örneğin; 2 ubuntu makinesi kurdunuz bu makineler birbirlerlerine ping atabilirler.
docker network networkAdi
komutu ile bu istenilen network hakkında detaylı bilgilere ulaşılabilir.
Yeni bir bridge networkü oluşturmak istiyorsak
docker network –-driver bridge –-subnet “172.47.0.0/16” –-gateway “172.47.0.1” denemeBridgeNetwork
şeklinde “denemeBridgeNetwork ismi ile bir network oluşturduk ve bu networke dahil olan konteynerlar için ip havuzunu ve gateway belirledik. Eğer ip havuzu ve gateway belirlemezsek otomotik olarak docker bir ip havuzu verecektir. Bu networke dahil olan her konteyner birbiri ile iletişim kurabilir.
docker run –name ubuntuOne -it ubuntu –d –network denemeBridgeNetwork ubuntu
docker run –name ubuntuTwo -it ubuntu –d –network denemeBridgeNetwork ubuntu
komutları ile bu ubuntu konteynerlarını oluşturduğumuz networke dahil ettik.
Bu networkü incelediğimizde aşağıdaki gibi networke dahil olan konteyları ve bilgilerini görebiliriz.
Bir konteyner birden fazla networke dahil olabilir.
docker run –name ubuntuTree -it ubuntu –d –network denemeBridgeNetwork ubuntu
ile ubuntumuzu denemebridgeNetwork isimli networke dahil ettik. Aşağıdaki komutlada bu konteynerı başka bir networke de dahil edebiliriz.
docker network connect testBridgeNetwork ubuntuTree
Aşağıda komutla da bir konteynerı networkten çıkarabiliriz.
docker network discconnect networkAdi conteinerAdi
Eğer bir konteyner varsayılan olarak gelen bridge networkte ise bunu bridge networkten çıkarırsak none networküne sahip olur.
Host Network
Bu network kullanıldığında oluşturulan konteyner host ile aynı ip adresini alır.. Bridge networkteki gibi port yönlendirme yapmadan bu servislerin çalıştığı porttan bu servislere ulaşabilirsiniz. Örneğin; httpd ile web sunucusunu kurduk. Bu servis varsayılan olarak 80 portunu kullanıyor. Biz artık dockerın yüklü olduğu makineye 80 portundan ulaşmak istediğimizde biz direk bu konteynera ulaşıyoruz. Bridge ise port yönlendirerek ulaşıyorduk. Tehlikeli bir network türüdür. Aşağıda komutla bu konteynarı host networküne dahil edebiliriz.
docker run –-network host httpd
None network
Container “none” network dahil olursa network içerisinde hiçbir container ile iletişime geçemez. None olarak çalıştırılan containerlar docker network stack’ine alınırlar ancak herhangi bir network konfigurasyonu yapılmaz.
Docker User-Defined Network :
Kendi networkumuzu oluşturulup uygulamamızı grupladığımız network türüdür. Yukarı yaptığımız denemeBridgeNetwork ve testBridgeNetwork bu kategoriye girer.
docker network create –driver networkTuru networkAdi
Docker Compose Nedir ?
Eğer çok sayıda container işin içine girerse her bir konteyner için tek tek komut yazmak zorunda kalıyoruz ve bu da zaman kaybına ya da hatalara neden olabiliyor. İşte docker bu sorunlar için oluşturulmuş bir docker aracıdır. Docker compose ile çok sayıda konteynerın tanımını tek dosyada yapabiliriz ve bu dosyanın çalıştırılması ile aynı ayna dosya içinde tanımlanan konteynerlerı ayağa kaldırabiliriz. Docker compose için oluşturulan dosyanın ismi genellike “docker-compose.yml”dır. Docker-compose ile konteynerları birbirilerine bağlayabiliriz.
YAML, hem insan tarafından kolaylıkla okunabilen hem de sayısal olarak kolaylıkla işleme alınabilen ve tüm programlama dilleri tarafından kullanılabilen bir veri değişim formatıdır.
Eğer sistemde docker-compose aracı yok ise aşağıdaki komutla yükleyebilirsiniz.
apt install docker-compose-plugin -y
touch docker-compose.yml
komutu ile bir docker-compose dosyası oluşturuyoruz ve içini aşağıdaki gibi doldurabiliriz.
Bundan sonra aşağıdaki komutla bu dosyayı çalıştırıyoruz.
docker-compose up -d
Bu komutunu çalıştıracağınız yerde docker-compose dosyası bulunmalıdır.
Bu içerikte bir konteyner içinde diğerinde ise mysql veritabanını kurduk. Volumelerini, port ve environment larını belirledik.
Environment kısacası dışarından konteyner içine yollamak istediğimiz bilgiler olarak düşünebiliriz. Örneğin; mysql veritabanının root kullanıcısına ait parolayı belirledik.
Docker-compose dosyasında dikkat edilmesi gereken bazı durumlar vardır. Docker-compose dosyası yukarıdan aşağıya sırasıyla çalışır ve bazı durumlarda buna dikkat edilmelidir ki oluşturulan konteynerlar düzgün bir şekilde çalışabilsin. Diğeri ise çıkıntı dediğimiz boşluklar, bu boşluklar düzgün yapılmazsa dockor-compose dosyası çalışmaz. Düzgün bir şekilde çalıştığında ise aşağıdaki gibi konteynerların düzgün bir şekilde çalıştığını göreceğiz.
Şimdi de docker compose ile mysql ve phpmyadmini kurup birbirine bağlayacağız.
Yukarı önce , image olarak mysql , herhangi bir sorun olması durumunda yeniden başlatılsın dedik. Ardından mysql için gerekli değişkenleri tanımladık sonra da volume oluşturduk. Sonra phpmyadmin i kurduk ve web arayüzden bağlanacağımız portu belirledik. Hangi mysql ile bağlantı kuracağını environmentler ile belirledik
Tarayıcınıza ip_address:8082 yazdığınızda artık phpmyadminin arayüzüne ulaşacaksınız.
DOCKER SWARM NEDİR ?
Docker swarm kısacası birden fazla fiziksel ya da sanal sunucuda cluster halinde bulunan docker uygulamalarını yönetmeye yarayan, dockerın kendisine ait bir orkestrasyon aracıdır. Günümüzde docker swarm’ın yerini daha çok kubernetes almıştır. Ama docker swarm da gayet başarılı bir araçtır.
Docker swarm temel olarak 2 yapıdan oluşur
1- Yönetici(manager)
2- Çalışan(Worker)
Manager; kısacası cluster üzerinde konteynerların oluşturulması, dağıtılması, ölçeklenmesi , monitör edilmesi gibi görevleri yerine getiren node dır.
Worker ise konteynerların çalıştığı node lardır.
Bir docker swarm clusterında en az bir yönetici bulunmalı ama birden fazla yönetici de bulunabilir. Eğer yönetici yok olursa cluster diye bir şey kalmaz. Bu yüzden birden fazla yönetici olması clusterın sağlıklı çalışması adına tavsiye edilmektedir. Bir clusterda worker node bulunmayabilir. Manager’ların kendi aralarında ve worker’larla iletişim kurabilir fakat worker nodelar kendi aralarında iletişim kuramazlar.
Docker swarm , workerler istenildiği takdirde manager yapılabilmektedir.
Aşağıdaki örnek bir cluster yapısı bulunmaktadır.
Docker swarmın avantajları:
· Merkezi yönetim
· High availability ile sistemin her zaman çalışabilecek bir yapı sağlamak
· Load-Balancing
· Ölçeklenebilirlik. Yani sisteme istediğimiz zaman yeni manager ve worker ekleyebiliyoruz.
·
Swarm bize sağladıkları,
· Swarm ile Hangi konteyner hangi makinede çalışacak.
· Hangi konteyner’den kaç kopya(replica) çalışacak.
· Makinelerden biri düştüğünde onun çalıştırdığı konteynerler nerede tekrar ayağa kaldırılacak.
· High Availability (Yüksek kullanılabilirlik)
· Yük dağılımı (Load balancing) özelliklerini sağlar.
Aşağıdaki gibi bir test ortamımız var.
Varsayılan olarak docker kurulumunda swarm modu kapalı gelmektedir.
docker info | grep Swarm
Komutu ile görebiliriz.
docker swarm init
Komutunu uygulayıp swarm modunu açıyoruz. Docker swarm da workerler , clustera katılabilmek için yönetici tarafından verilen bir tokena sahip olmalıdır. Yukarıdaki komutu uyguladığımızda workerlar için oluşturulan tokenı görebiliriz.
Manager için oluşturulan tokenı görebilmek için ise
docker swarm join-token manager
komutu kullanabiliriz.
Workerlerda manager tarafından verilen tokenı girerek clustere katılabiliriz.
docker swarm join — token SWMTKN-1–408h9pxouuqghzadnttok1vxh1phwyr00x4kr0lwfai5cptcf0-buspxck338d8wai6jlvibvrvn 192.168.1.10:2377
docker node ls
komutunu uyguladığımızda workerların düzgün bir şekilde clustera kayıt olduğunu görebiliriz.
Manager statüsünde “Leader” olanın manager olduğunu görebiliriz.
Eğer bir workerı manager yapmak istiyorsak
docker node update promode HOSTNAME
Örneğin workerOne , yönetici yaptığımızda Manager statusunun “Reachable” olarak değiştiğini görebiliriz.
docker node update demote HOSTNAME
ile de yöneticiyi worker yapabiliriz.
Docker swarm da 3 adet erişebilirlik modu vardır.
1- Drain: Drain olarak işaretlenen nodelar tamamen devre dışı bırakılır. Üzerinde bulunan hiçbir servis çalışmaz ve üzerinden trafik oluşmaz.
2- Pause: Örneğin; bir node üzerinde önceden oluşturulan servisler var. Eğer biz bu node ‘ u pause olarak işaretlersek önceden oluşturulan servisler çalışmaya devam eder fakat yeni oluşturulan servisler bu node üzerinde oluşturulmaz.
3- Active: Varsayılan modtur. Nodelar üzerinde bulunan tüm servisleri çalıştırır.
docker node update –-availability drain HOSTNAME
docker node update –-availability pause HOSTNAME
docker node update –-availability active HOSTNAME
komutlarıyla nodeların modları değiştirilebilir.
Docker swarm da aşağıdaki temel komutla servis oluşturabiliriz. Tabi biz bunu bazı komutlarla özelleştirebiliriz.
docker service create servisAdi
Biz şimdi docker swarm da nginx servisini kuracağız.
docker service create –-name webSunucu -p 8080:80 -d nginx
Yine temel olarak nginx servisini localde arayacak bulamaz ise dockerHUB tan çekecektir.
docker service ls
komutu ile çalışan servisleri görüntüleyebiliriz.
Bu çıktıcadaki “REPLICAS” satırı şunu söylemektedir. Bu servis cluster içinde sadece 1 node oluşturulmuştur.
docker service ps webSunucu
komutu ile bu servisin clusterda hangi node da çalıştığını görebiliriz. “NODE” satırında bu servisin Manager node’ unda oluşturulduğunu söylemektedir. Yani bir servis manager ya da worker nodelarda oluşturulabilir. Varsayılan olarak belirtmezsek bir servis için bir konteyner oluşturulur.
docker service create –name webSunucu –-constaint node.role=worker -p 8080:80 -d nginx
--constaint node.role==worker, ile bu servisin worker node larla çalışmasını sağlıyoruz. Eğer workerOne node ‘ unda herhangi bir sorun oluşması halinde bu servisi clusterda ki herhangi bir node tekrar oluşturarak servisin çalışmasını tekrar sağlıyor. Tabi biz worker node için filtreleme yapmıştık yapmasaydık Manager node da oluşturabilir. Ama bu yinede küçük bir gecikmeye neden olmaktadır. Bu yüzden bir servis için birden fazla konteynerın oluşmasını sağlayarak oluşabilecek gecikme süresini en aza indirmeye çalışmalıyız.
docker service create –name webSunucu –-replicas 3 -p 8080:80 -d nginx
komutundaki “—replicas 3” parametresi ile bu servis için 3 konteynerın oluşmasını sağladık.
“REPLICAS” satırında bu servis için 3 tane konteynerın oluştuğunu görüyoruz. “docker service ps webSunucu” komutunda ise bu konteynerların hangi nodeları oluşturulduğunu görüyoruz. Bunu rastgele yapıyor. Örneğin; workerOne node’unda 1 tane , workerTwo node’unda 2 tane da oluşturabilir. Eğer önceden oluşturulmuş bir servis için bu sayıyı artırmak ya da azaltmak istiyorsak aşağıdaki komutu uygulayabiliriz. Eğer replica sayısını 0 yaparsak servis durdurmuş oluruz.
docker service update –-replicas sayi servisAdi
Mesela workerOne daki bu konteynerda bir sorun olduğunda bu servis için anında yeni bir konteyner oluşturuldu. Yani her zaman 3 tane çalışacak şekilde ayarlanıyor.
192.168.1.10:8080
192.168.1.11:8080
192.168.1.12:8080 , artık bu nginx servisine bu ip lerden herhangi birinden ulaşılabilir. Eğer konteynar sadece 1 tane olsaydı yine üçünden ulaşılabilirdik. Aşağıdaki gibi sorunsuz bir şekilde clusterımızın çalışıyor.
Eğer node sayımızı bilmiyorsak ve bu servislerin tüm nodelarda oluşmasını istiyorsak aşağıdaki komutla global modta servisi oluşturabiliriz. Bu yüzden replica sayısını belirtmemize gerek kalmaz.
docker service create –-mode global –-name webSunucu -p 8080:80 -d nginx
“ — mode global” parametresi bu servisin clusterdaki tüm nodelarda birer tane oluşmasını sağlamaktadır.
Docker swarm da çalışan bir servisi güncellemek gerekebilir.
docker service create --name webSunucu --replicas 3 -p 8080:80 nginx:1.23
Örneğin yukarı komutla nginx in 1.23 sürümü için 3 adet konteyner oluşmasını sağladık.
docker create update –image nginx:latest --update-delay 5s –update-failure-action rollback webSunucu
bu komutla önceden yüklenen nginx:1.23 sürümü , nginx son sürümüne güncelliyoruz.
— update-delay 5s= her konteyner güncellemesi arasındaki sürenin 5 saniye olduğunu söyler.
— update-failure-action rollback = eğer güncelleme sırasında herhangi bir sorun meydana gelirse konteynerı eski haline çevirir.
Docker swarm varsayılan olarak birer birer güncelleme işlemini yapar. Yani birtanesinin güncellemesi bittiğinde diğerine başlar. Ama istersek bunu değiştirebiliriz. Aynı anda 2 tane güncellemesini istersek
— update-parallelism=2 parametresini komutumuza ekleyebiliriz.
Docker swarm üzerinde tümleşik bir load-balancera sahiptir. Nodelarda ki yoğunluğa göre gelen istekleri nodelar üzerinde dağıtmaktadır. Bu da cluster yapısının en büyük avantajlarından bir tanesidir.
PORTAINER NEDİR ?
Portainer, docker ve docker swarm işlemlerimizi bir web arayüzü ile yönetmemizi sağlayan bir yardımcı programdır.
PORTAINER KURULUMU
Bir docker compose dosyası oluşturun ve içine aşağıdaki kodu yapıştırın.
version: '3.8'
services:
portainer:
image: portainer/portainer-ce
restart: always
container_name: portainer
ports:
- "8000:8000"
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
volumes:
portainer_data:
docker-compose up -d
komutu ile dosyayı çalıştırınız.
Ardından web tarayıcınızı portainerın kurulu olduğu makinenin ip_adresi:9000 şeklinde portainerın arayüzüne ulaşabilirsiniz. Ardından kullanıcı adı şifre oluşturup devam edelim ve bağlanacağımız yer olarak locali seçelim. Portainer ile local, uzak sunucu veya azure ortamındaki docker sunucularına bağlanabilirsiniz.
Portainerın dashbord ekranında docker sunucusu ile ilgili bazı bilgilere ulaşabiliyoruz. Sol tarafta bulunan menü ile docker sunucumuzu daha detaylı bir şekilde inceleyebiliriz.
Sol taraftan container işlemleri, image işlemleri, network işlemleri , volume işlemleri … gibi bir çok sekme bulunuyor. Events sekmesinde bu docker sunucu üzerine yapılan işlemlerin container oluşturma, network oluşturma, volume oluşturma vb. gibi işlemlerin logları bulunmaktadır. Ama bir containerın oluşturduğu loglar bu ekranda değil , container sekmesi altında containerın altında bulunur. Portainere yerine kullanılabilecek diğer programlar
· Red Hat OpenShift Container Platform
· Kubernetes
· Rancher
· Kitematic
· AWS Fargate
Biz yeni bir konteyner eklemek için sol taraftan containers butonuna tıklıyoruz ve çıkan ekranda “Add Container” butonuna basıyoruz. Ardından bizi aşağıdaki gibi bir ekran karşılıyor.
Burada konteyner için bir ad ve image belirliyoruz. Ardından port ayarı için “publish a new network port diyerek bu konteynerımızı hangi portan erişeğimizi belirliyoruz. Ardından aşağıda tarafta bulunan “Deploy the container” butonuna basarak konteynerımızı oluşturuyoruz.
KUBERNETES NEDİR ?
Kubernetes, birden fazla sunucuda bulunan konteynerlarımızı oluşturmak, silmek,dağıtmak vb. işlemlerimizi hızlı bir şekilde sağlayan bir konteyner orkestrasyon aracıdır. Docker swarmın yerini hızlı bir şekilde alarak şuan dünya da en çok kullanılan konteyner orkestrasyon aracıdır. Kubernetes google tarafından geliştirilmiş ve şuan açık kaynak kodlu bir yazılımdır. Bazen kubernetesi “k8s” olarak da duyabilirsiniz.
Top comments (0)