Giderek yaygınlaşan ve basitliği ile de popülerleşen Docker üzerinde durmak, hangi probleme çözüm getirdiğini ve varsa hangi problemleri doğurduğunu düşünmek istiyorum.

Çok aşikâr ki konteynerler uygulamalar için deploy sırasında yaşanan zorlukları bertaraf etti. Geliştirici bilgisayarında sorunsuz çalışan uygulamalar, güncellemeler operasyon tarafında canlı hale getirilirken türlü zorluklarla karşılaşılıyordu. Öte yandan bu zorlukların aşılması süreci epey uzatıyor, geliştiriciye geri bildirimin gitmesi de haliyle uzuyor ve gerekli güncellemenin uygulanması oldukça zaman alan bir süreç haline gelmiş oluyordu.

Docker bu problemi basitliğiyle ortadan kaldırdı. Neden basitliğiyle? Çünkü Docker olmayan bir şeyi var etmedi, LXC (Linux Containers) zaten Linux çekirdeğinde var olan bir şeydi. Ancak bu teknolojinin kullanımı geliştiriciler için ya da operasyon tarafı için oldukça zordu. Hacker seviyesine hitap eden bir şeydi, demek yanlış olmaz.

Docker aynı teknoloji üzerine inşa edilmiş ve bu "kullanım" süresini birkaç saniyeye indirgeyecek kadar basitleştirmiş bir container runtime yazılımı. Bu sayede konteynerler oldukça fazla kullanılır oldu. Pekiyi, Docker konteyneri tam olarak ne yapıyor da bu soruna çözüm getiriyor? Hatta şöyle soralım, konteynerler ne işe yarar ki?

Önceleri tek bir sunucuda birden fazla uygulama çalıştırmak, hele de benzer uygulamalar çalıştırmak büyük bir karın ağrısıydı. Birbirine çakışan uygulamalar mı dersin, bağımlılığı olan paketlerdeki uyumsuzluklar mı dersin, gereken başka bir Linux dağıtımı mı dersin... ne isterseniz öyle sorun var yani. Ancak konteynerler devreye girince bu problemlerin hepsi çözülmüş oldu. Çünkü konteynerler birbirinden izole, sanal sunucular gibi iş yapmakta. İyi de bu zaten yok mu, örneğin VMware bunu yapmıyor mu zaten, evet yapıyor da Docker bir başka yapıyor. Çünkü Docker izolasyonu çekirdek seviyesinde yapıyor. Tamam tamam, daha basit anlatalım. Sizin yeni bir uygulama için yeni bir VM'e ihtiyaç duyduğunuz sırada bunu VMware ile yaparsanız gereksiz yere çok fazla işlemci gücü, bellek ve disk kullanmış olursunuz. Oysa konteyner kullanırsanız örneğin bir Ubuntu VM için sadece 80 MB alan harcarsınız. Ayrıca boot işlemi de yalnızca 1 saniye sürer. Uygulamanızın boyutuyla beraber örneğin 100 MB alan kaplar. Bu bir konteyner olduğu için geliştirici bilgisayarında ve sunucuda birebir aynı çalışır. Hiçbir ek optimizasyon gerekmez.

Tek avantajı bu mu? İşe yeni bir geliştirici alındığını düşünün. Onun geliştirme ortamının hazırlanması eski yöntemlerle oldukça zaman alır hatta işten ayrılan kişinin yürüttüğü süreçlerin çözülmesi de ayrı bir karmaşadır. Ancak devreye Docker girdiğinde yeni gelen geliştiricinin geliştirme ortamı saniyeler içinde hazırlanabilir. Ayrıca işten ayrılan kişinin de süreçlerini nasıl oluşturduğunu anlamak çok basittir. Bu konuda Docker Compose File incelenmelidir.

Docker'in çözdüğü problemleri anladık, pekiyi hiç mi yeni problem doğurmadı? Docker sağladığı avantajlar sebebiyle çokça kullanılır oldu ve bir sürecin her noktasında yer almaya başladı. Konteyner karmaşası ortaya çıktı. Yani o kadar çok konteyner var ve o kadar çok sistematik biçimde çalışmaları gerekiyor ki, bu konteynerlerden birine bir şey olsa tüm sistemin akışı kesilebilir. Bundan dolayı konteyner orkestrasyonu kavramı ortaya çıktı.

Orkestrasyon sistemleri bu konteynerleri bizim isteklerimiz doğrultusunda organize eder ve bir sorun oluştuğunda yine bizim daha önceden verdiğimiz talimatlar doğrultusunda bu sorunu çözer. Örneğin bir konteynerin çökmesi durumunda o konteynerin eski verilerine zarar gelmeden ve aynı veriler üstüne inşa ederek yeniden oluşturulmasını sağlar. Canlı ortamda uygulamanın kullanıcıları tarafından bu neredeyse algılanmaz.

Eğer uygulamaya olan talepler giderek artıyor ve var olan konteyner sayısı bu talepleri karşılayamayacak düzeydeyse orkestrasyon sistemi, içinde bulunduğu cluster dahilindeki bilgisayarlar üzerinde zayıf kalan konteynerlerin örneklerini oluşturur ve böylece istenilen talep karşılanabilmiş olur. Ayrıca eğer talepler oldukça düşükse gereksiz yere işlemci gücü, bellek harcamamak için fazla olan konteynerleri siler.

Yeniden oluşturma ve silme aşamalarında varsayılan olarak verilere zarar gelmez. Aynı uygulamanın birden çok konteyner ile ölçeklenmesinde ortaya çıkan veri farklılığı problemi ise önceden de var olduğu gibi şimdi de var. Bu problemi yine kendi algoritmalarımız ile çözmekteyiz. Ancak ne var ki Docker ile bu tür problemleri çözmek de eski usullere göre daha kolay.