Docker Üzerine Genel Bakış -Docker Stack Kullanımı

Serkan Bingöl
AWS Certified User Group Turkey
7 min readJan 5, 2019

Merhabalar bundan önceki yazılarımızda docker compose ve docker swarm konuları genel olarak ele alıp , bu konular üzerinde çeşitli örnekler yapmaya çalışmıştık. Bu yazımızda docker containerları “production” ortamında nasıl yönetebilir ve ölçeklendirilebiliriz , buna uygun bir mimariyi ne şekilde kurgulayabiliriz bunların üzerinde durmaya çalışacağız.

Öncelikli olarak yapmak istediğimiz örneği daha iyi kavramak adına Gökhan Şengün ‘ün docker üzerine yazmış olduğu 3. blog yazısını gözden geçirebilirsiniz. Burada Gökhan hoca docker örnekleri arasında çok popüler olan “voting-app” örneğini “Docker Compose ile Oluşturulmuş Karmaşık Bir Sistemi İncelemek” kısmında detaylı şekilde açıklamıştır.

Kısaca örnek için kullanacağımız servislerin mimarisinden bahsetmek gerekir ise 5 ayrı docker imajını içinde barındıran bir örnektir. Kullanıcıların kedi ya da köpek için hangisini daha çok sevdiği üzerine oy kullandığı bir web uygulaması (voting-app) , sonuçların takip edilebildiği başka bir web uygulaması (result-app), oyların dağıtık memory’e kaydını gerçekleştiren servis (redis) , dağıtık memory ‘ de tutulan oyların DB ye kaydolmasını sağlayan servis (worker) ve ayrıca bir postgre veri tabanı olan (db) servislerinden oluşmaktadır.

İlgili örneğin imajlarına docker hub üzerinden ulaşabilir ve Dockerfile’larını inceleyebilirsiniz. Öncelikle bu servisleri docker swarm üzerinde ayağa kaldırarak bir inceleyeceğiz. Örneğimizde uygulanması gereken adımları aşağıdaki resim üzerinden takip ederek gerçekleştireceğiz. İsterseniz “README.md” dosyasını lokalinize indirerek takip edebilirsiniz.

Burada bulunan adımları 3 adet node ‘dan oluşan bir cluster üzerinde gerçekleştirebilmek adına digital ocean tarafında “Docker Stack” projesi içinde 3 tane droplet oluşturdum.

Bir önceki yazımda docker swarm ile ilgili genel bilgiyi verdiğim için gerekli adımları kısaca anlatarak geçeceğim. Bu adımların ekran görüntülerini bu bölümün sonundaki pdf dosyasından takip edebilirsiniz (Vote-App Swarm 3 Node Cluster Senaryosu aşamaları). 3 adet droplet açıldıktan sonra gerekli portların hepsini açık konuma getirip Node 1 üzerinde docker swarmı aktif hale getirerek Node 2 ve Node 3 ün bu cluster yapısına dahil olmasını gerekli komutları kullanarak sağlıyoruz.

Takip eden adım adım için hangi komutları çalıştırmam gerektiğini bir kenarda tutmak adına README.md dosyası üzerine tanımlıyorum.

Burada belirlemiş olduğum komutları sırası ile kullanarak tün servisleri ayağa kaldırarak , $ docker service ls komutu ile tüm uygulamaların genel bilgilerini listeliyorum.

Tüm servislerin docker service ps [servis_ismi] komutunu kullanarak hangi node üzerinde kaç adet task olarak çalıştığını ayrı ayrı inceleyebiliriz.

Uygulamamızı belirlemiş olduğumuz IP ‘ ler üzerinden çalıştırdığımız takdirde oy verilen web uygulaması (vote-app) üzerinden verilen oyun, redis üzerinden bir worker aracılığı ile postgre veri tabanına yazılarak cevapların olduğu web uygulamasından (result-app) canlı olarak takip edildiğini görebilmekteyiz.

Vote-App Swarm 3 Node Cluster Senaryosu aşamaları :https://1drv.ms/b/s!AskWoAU3NqUug_kcBE3c0Z515k629g

İşlemleri buraya kadar tamamladıktan sonra aslında işleyen ve ölçeklendirilebilen bir cluster yapısını elde etmiş bulunmaktayız. Docker swarmı kullandığımız için vote-app servisinin toplamda 3 adet task şeklinde çalışıyor olması bizim için bazı sorunları çözmüş bulunmaktadır. Tasklardan birininin fail olması durumunda diğer replikaların isteklere cevap vermesi ve docker swarm’ın fail olan taskı yeniden başlatması ya da “routing mesh” sayesinde herhangi bir sunucunun down olması durumunda gelen isteği, ayakta olan farklı bir cihaza otomatikman yönlendirme işlemleri bu çözümlerden bir kaç tanesidir.

Bunun gibi bir çok artıyı içinde barındırırken şu soru karşımıza çıkıyor. “Bu ölçeklendirilebilir yapı gerçekten yönetilebilir özellikleri üzerinde barındırıyor mu ?”.

Yönetilebilir sistem olarak tüm servis komutlarını tek tek çalıştırmak bizim için bir dezavantaj oluşturuyor mu , sistem içindeki bazı imajları güncellemek istediğimiz takdirde nasıl bir plan belirlememiz gerekiyor ya da her ne kadar sistem üzerinde kalıcı veriyi host tarafında tutmak yanlış bir kurgu olsa da bir şekilde containerların kalıcı verileri için volume oluşturmamız gerekir ise bunu nasıl çözebiliriz gibi soruları çözmek istediğinizde karşımıza Docker Stack kavramı çıkıyor.

Docker Stack Nedir ?

Docker stack aslında docker swarm’ın production tarafında daha yönetilebilir bir şekilde işlemesi için ,bir konfigürasyon dosyası üzerinden kurgulandığı ve yönetildiği bir yapıdır. Ya da başka bir tanımlama ile docker compose dosyası ile docker swarmın tek elden yönetilmesini sağlamaktır.

Daha önceki yazılarımızda bahsettiğimiz üzere bir çok container’ı tek komut ile ayağa kaldırmak üzere kullanılan docker compose , cluster şeklinde dizayn edilmiş ortamlarda bir çok noktada yetersiz kalıyor. Cluster içinde servis şeklinde kurgulanan containerların , volumelar ve overlay networkler ile beraber kullanılan yapısını docker stack üzerinden oluşturabiliriz. Aşağıdaki resim bu mimariyi biraz daha görsel şekilde anlatabilmektedir.

Stack kullanırken tek YAML dosyası üzerinden birden fazla servisi , network ve volume yönetebiliriz.Burada dikkat edilmesi gereken kısım Docker stack için , compose versiyon 3 ve üzeri sürümlerle çalışılıyor olmasının gerekliliğidir. Versiyon 3 ile ilgili genel bilgilere bu link üzerinden ulaşabilirsiniz.

Docker Stack ile Voting App Mimarisini Orkestra Etmek

Bu kısımda yukarıdaki örneğimizde tek tek çalıştırdığımız servislerimizi ,tek tek oluşturduğumuz overlay networklerimizi bir tek YAML dosyası üzerinden kontrol ve konfigüre edeceğiz. 5 servisten oluşan mimarimizi daha rahat bir şekilde yönetebildiğimiz ve güncelleyebileceğimiz bir yapıya sahip olmak temel amacımız.

Burada da ilk örneğimizdeki gibi 3 adet dropletimiz bulunmakta. Henüz herhangi node üzerinde çalıştırdığımız bir servisimiz bulunmuyor.

Node 1 üzerinde mkdir komutunu kullanarak docker-stack isimli bir klasör açarak içine voteapp-stack.yml isimli ve uzantılı bir YAML dosyası oluşturuyoruz.

Vim editör ile bu dosyayı 5 adet servisin hangi şekilde ve ne gibi ayarlar ile çalışması gerektiğini belirtecek şekilde düzenliyoruz. Burada dikkat edileceği üzere compose file gibi 3 adet ana kırılım bulunmakta (services,networks ve volumes). Buradaki ana fark compose dosyası normalde build üzerinden işlem yaparken docker stack üzerinde build komutunun bir geçerliliği bulunmamakta. Onun yerine deploy komutu işleme alınmaktadır. Deploy kırılımının altında bir çok konfigürasyon kırılımı yer almaktadır. Bu kırılımları bu link üzerinden detaylı olarak inceleyebilirsiniz. Ben bu YAML dosyasında kullandığım bazı konfigürasyon kırılımlarını aşağıda kısaca özetlemeye çalışacağım.

Voting-stack.yml dosyası içinde kullandığımız deploy komutu ile birlikte kullanılan ve alt nodelar olan replicas ilgili servisin kaç adet task olarak çalıştırılacağını , update-config güncelleme ayarlarını , restart_policy hata durumunda yeniden başlatma ayarlarını , placement ise servis ile nodelar arasındaki ilişkileri barındıran komut kırılımlarıdır.

Restart_policy altında bulunan max_attempts kırılımı ise bir restart işleminde ilgili task için ard arda kaç kere başarısız ayaklandırma işlemi yapılacak bunu sayısının belirtildiği alan olarak kullanılmaktadır.

Tüm ayarlamaları yaptığım YAML dosyasına ulaşmak için link üzerinden işlem yapabilirsiniz. YAML dosyamızı tamamen oluşturduktan sonra bulunduğu klasör altında $ docker stack deploy -c [Yaml_Dosyası] [Verilecek_Stack_Ismi] komutunu yani burada $ docker stack deploy -c voteapp-stack.yml cat-dog-survey komutunu kullanarak sırası ile tüm adımlarımızı gerçekleştirmekteyiz. $ docker service ls komutu ile 6 servisimizin de çalışır şekilde olduğunu inceleyebiliriz.

Ayrıca $ docker stack ps [stack_ismi] komutunu çalıştırdığımızda hangi nodelar üzerinde hangi servislerimizin ayakta olduğunu daha detaylı olarak inceliyebilmekteyiz.

Bu örnek için YAML dosyasını incelediğinizde 5 servisin yanında 6. bir servisin daha kullanıldığı dikkatinizi çekecektir. Bu servis visualizer imajı üzerinden bizlere cluster yapımızda hangi servislerin çalıştığını görsel olarak raporlayan bir servistir.

Aşağıdaki resim üzerinden browserımızda hem vote-app , hem result-app , hem de visualizer uygulamalarının çalıştığını görebilmekteyiz. Visualizer sekmesine dikkatli baktığımızda tüm servislerin detaylarını görsel olarak da alabilmekteyiz.

Cluster yapısı üzerinde artık herhangi bir güncelleme yapılması gerekir ise YAML dosyası üzerinde değişiklikler yapılıp tekrardan deploy edilmesi gerekmektedir. Burada vote-app web uygulamasını 2 replikadan 4 replikaya çıkardığımız bir işlemi denemek istiyorum. Ve Vote servisi içinde deploy altındaki replicas kırılımını 4 e çekiyorum.

$ docker stack deploy -c voteapp-stack.yml cat-dog-survey komutun tekrar çalıştırdığım takdirde tüm servisleri YAML dosyasındaki kurallara göre güncelleyerek işlemini tamamlayacaktır. $ docker service ls komutu ile vote servisinin 4 replika ile çalıştığını görebiliriz.

Aynı zaman da visualizer uygulaması üzerinden de task sayısı 4'e otomatik olarak yükseltilmiştir.

Bir yazımızın daha sonuna geldiğimizde artık development ortamında kullandığımız tüm komutları , production ortamında kullanabileceğimiz şekilde kurguladığımız ve konfigüre ettiğimiz docker stack yapısını uygulamalı olarak denemiş bulunmaktayız.

Vote-App Stack 3 Node Cluster Senaryosu aşamaları :https://1drv.ms/b/s!AskWoAU3NqUug_kdk4dVyb2rMiwthQ

Başka bir yazıda görüşmek dileği ile..

--

--

Serkan Bingöl
AWS Certified User Group Turkey

Muzur bir oğlan babası, hayvan sever, Harry Potter hayranı, bazen maceracı düz yazılımcı.