İleri seviye programlama ve büyük projeler için önemli olan Docker konusunu gelin beraber inceleyelim. Docker diye bahsetsekte bu aslında ölçekleme ve konteynerleştirme demektir. Docker ise bir üründür. Jeep markasının isimleşmesi gibi düşünebilirsiniz. Öncelikle çok kaba bir anlatımla başlayıp, detaylara değinmek istiyorum.

Günümüzde PHP projeleri birçok yazılımcı gerçekleştirebiliyor. PHP projeler bildiğiniz gibi hostinglerde çalışabiliyor. Bunun çalışmasının sebebi Apache gibi deployment araçlarından bir tanesinin kurulu olması. Sunucu firmaları sunucuları sanallaştırıp, Apache kurulumları ile beraber size hosting paketleri sağlıyor. Yani bilgisayarlar içinde küçük bilgisayarlar oluşturuyor ve PHP'yi çalışabilecek hale getirip, konfigürasyonları sizin için yapıyorlar.
Örneğin PHP 5 için konfigüre edilmiş bir hosting'e PHP 7 versiyonla hazırlanmış bir PHP projesi atarsanız çalışmaz. Konfigürasyon 5 için yapıldığından dolayı PHP 7 çalışmayacaktır. Konfigüre edilmesi gerekir. Hosting firmaları bunu sizin için otomatik konfigüre eder genelde.
Bunlar size bir şey anlatmadıysa biraz daha açalım konuyu. "Benim bilgisayarımda çalışıyordu" cümlesini ortadan kaldırmak içinde Docker kullanılır. Siz lokalinizde bir proje yazmışsınızdır ama sunucuya veya başka bir bilgisayara taşıdığınızda bu çalışmıyorsa konfigüre etmeniz gerekmektedir. Ancak bir konteyner ile çalıştırırsanız, otomatik ortam oluşturulur. Peki nasıl ?

Güncel geliştirme metodolojilerinin vazgeçilmesi NodeJS'tir. NPM ve Yarn paketleri ile projeler desteklenir. PHP, NodeJS, Python gibi dillerde bu paketler kullanılır veya muadilleri vardır. Örneğin bir NodeJS projeniz mevcut:
Lokalinizde NodeJS versiyon 14 kurulu. Birde MongoDB versiyon 4 ile projenizi geliştirdiniz. Ancak yeni bir bilgisayarda development sürecinizi gerçekleştirmeniz gerekti. Veya sunucuya deploy etmeniz gerekir. Burada yapmanız gereken yeni bilgisayarınızda NodeJS 14 ve MongoDB 4 kurmanız gerekir. Konteyner burada devreye giriyor artık.
VMWare kullandıysanız daha öncesinde bilirsiniz. Bilgisayar içinde bilgisayarlar kurabilirsiniz. Bu VDS, VPS gibi sunucularda yapılmıştır. VMWare gibi araçlar kullanılarak size bilgisayar içinde bilgisayarlar veriliyor. Sizde bu bilgisayarları kullanabiliyorsunuz. Sizde bu işlemi kendi bilgisayarına yapabilirsiniz. Örneğin 64 GB Ram, 24 CPU ve 20 TB harddisk'e sahip sunucunuz mevcut. Siz sanallaştırarak 2 GB Ram, 1 TB Harddisk ve 4 CPU ayırıp bir yeni bir bilgisayar oluşturabilirsiniz içeride. Belirlediğiniz sınırlar içerisinde çalışacaktır bu bilgisayar.
Docker'da aynı mantıkta çalışıyor diyebiliriz. Siz Docker konfigürasyonunuzu hazırlarsınız. Sizin için bir sanallaştırma yapılır ve projeniz burada çalışır. Donanım konfigürasyonunu yaptıktan sonra örneğin NodeJS 14 versiyonu ve MongoDB 4 kurulması gerektiğini belirtirseniz, Docker sizin için bunu otomatik olarak yapıp projenizi deploy edebilir. Bu sayede "benim bilgisayarımda çalışıyordu" problemi ortadan kalkar. Projeniz artık o konteyner içerisinde rahatlıkla çalışır. Bir balığın 24 derecelik akvaryumdan alınıp, tekrar aynı derecelerde ve minerallerdeki akvaryuma aktarılması gibi.

Peki bunları elle kurabilirim, benim için ne anlamı var derseniz ?
Evet bunları elle kurabilirsiniz. Sunucuyu kendinizde konfigüre edebilirsiniz. Ancak burada devreye ölçeklendirme devreye giriyor. Büyük projelerin bir yerden sonra ölçeklendirilip, yeni sunuculara ihtiyacı olabilir. Örneğin projeniz 5K trafik alıyordur ve sunucu tüketimleri %85-100 arasında geziyordur. Burada ölçeklendirmeye gidip, ikinci bir sunucu açmanız ve trafiği dağıtmanız gerekir. Buna da basit anlamda ölçeklendirme denir ve yeni sunucu açılır. Burada Docker kullanarak işlemleri otomatikleştirebilirsiniz. Yani sizin sunucularınız sıkışmaya başladığında otomatik olarak yeni sunucu oluşturulur ve trafik yönlendirilmesi paylaştırılır. Bu da konteynerleştirmenin avantajıdır. Trafik azaldığında ise yeni sunucu otomatik kapatılabilir.
Veya son olarak şu avantajından da bahsedeyim: Projenizi bir Github reposundan dağıttığınızı düşünelim. Bu repoyu güncellediğinizde tek tek sunuculara girip dosyalarınızı çekmeniz gerekir Github'tan. Otomatize edilmiş sistemlerde Github'tan verileri çeker ve güncellemeleri kendisi sağlar. Hatta Docker konfigürasyonunuzu güncellediğinizde de, bu konfigürasyonu alıp otomatik kurulum gerçekleştirir. Siz örneğin bir önceki Github güncellemesinde NodeJS 14 kullanıyorsanız, yeni güncellemede 18 versiyonuna geçtiyseniz ve Docker konfigürasyonunu yaptıysanız bunu otomatik yapar. Mevcut versiyonu ve sanallaştırmayı siler. Güncel repoyu indirir. NodeJS 18'e yükseltir ve çalıştırır.

1-2 sunucu için belki bunlar anlamsız gelebilir ancak onlarca, yüzlerce sunucuya ulaştığınızda bunun otomatize edilmesi şarttır.
Umarım konunun doğru anlatımını sağlamışımdır. Docker ileri seviye bir konu olsa da, en azından kulak aşinalığı olması gerekir yazılımla uğraşan kişilerin. İhtiyacınıza göre Docker kullandığınızda, umarım kulaklarım çınlar

