Günümüzde işletmeler, altyapılarını oluşturmak için çok sayıda DevOps seçeneğine sahiptir. İşletmeler, geleneksel sunucuların yanı sıra düşük maliyetli uygulamaları daha hızlı geliştirmek için sanal makineler, kapsayıcılar ve sunucusuz bilgi işlem gibi teknolojileri kullanabilir.
Containers Nedir?
İşletmeler uzun süredir sanal makinelerin zayıf noktalarını ele almak için konteyner (container) teknolojilerini kullanır. Kapsayıcıları VM’lerin daha hafif sürümleri olarak düşünebilirsiniz. Kapsayıcılar ve VM’ler arasındaki en önemli fark, kapsayıcıların kendi işletim sistemlerine ihtiyaç duymamasıdır. Bir ana bilgisayardaki tüm kapsayıcılar, çok sayıda sistem kaynağını serbest bırakan ana bilgisayarın işletim sistemini paylaşır.
Şimdi modern kapsayıcılar olarak bilinen birçok kapsayıcı, yola Linux kapsayıcıları (LXC) olarak başlamıştır. Google dahil birçok katkıda bulunan şirket, konteynerle ilgili teknolojilerin Linux çekirdeğine getirilmesine yardımcı oldu. Bu katkılar olmasaydı, bugün sahip olduğumuz zengin konteyner ekosistemine sahip olamazdık.
Fakat Docker ortaya çıkana kadar konteynerleştirme çok erişilebilir değildi. Docker kapsayıcıları, uygulama katmanında bir soyutlama oluşturdu.
Kapsayıcılar, uygulamanızı ve kapsayıcı bağımlılıklarını, aşağıdakiler dahil çalışması gereken her şeyle paketler:
- İşletim sistemi
- uygulama kodu
- Çalışma süresi
- Sistem araçları
- Sistem kitaplıkları
Docker Nedir?
Son on yılda DevOps tarafında geniş çapta benimsenen popüler bir teknoloji olan Docker, uygulamanın “Geliştirme, Hazırlama veya Üretim” gibi herhangi bir ortamda sorunsuz çalışması için uygulamayı ve bağımlılıklarını bir kapsayıcı içinde paketleyen bir kapsayıcı platformdur.
Kapsayıcıları kullanarak uygulama oluşturmayı, dağıtmayı ve çalıştırmayı kolaylaştırmak için tasarlanmış bir araçtır. Docker kapsayıcıları, sanal makinelere hafif alternatiflerdir ve ana bilgisayar işletim sistemini kullanır. Sanal makinelerde olduğu gibi kapsayıcılarda önceden herhangi bir RAM ayırmanız gerekmez.
Geliştiricilerin, sistem yöneticilerinin ve işletmelerin anında dağıtılmış uygulamalar oluşturması, göndermesi ve çalıştırması için açık kaynaklı bir platformdur.
Docker Neden Bu Kadar Popüler?
Aşağıdaki listede Docker’ı bu kadar popüler yapan birçok öne çıkan özelliği bulabilirsiniz:
1. Mikro hizmet mimarisi
Docker, uygulamanızı daha küçük hizmetlere ayırmanıza olanak tanır. Her hizmet bir mikrobilgisayar gibidir. Her biri belirli bir işleve sahiptir ve diğer hizmetlerden izole edilebilir.
Bir uygulamayı ve bir veri tabanını birlikte çalıştırmak gibi birkaç kapsayıcıyı tek bir uygulamanın parçası olarak kontrol edebilirsiniz.
Mikro hizmet mimarisinin avantajları aşağıdakileri içerir:
- Bir seferde yalnızca belirli bir hizmeti hedeflediğiniz için uygulamanın bakımı daha kolay hale gelir.
- Bir hizmet çöktüğünde, tüm uygulamayı önemli ölçüde etkilemez.
- Gerektiğinde, diğer servislerin bağımlılıkları hakkında fazla endişe duymadan değişiklikler tek bir servise getirilebilir.
Kısacası, bir hizmet aynı ana makinede başkalarını etkilemeden kolayca eklenebilir, kaldırılabilir, durdurulabilir ve yeniden başlatılabilir.
2. Uyumluluk
Docker kapsayıcıları, sanal makinelerin aksine uyumluluk sorunlarına neden olmadan herhangi bir platformda dağıtılabilir. Uygulamanız sistemden bağımsız olarak kalır ve herhangi bir ana bilgisayar sisteminde veya buluta; kullanmayı, oluşturmayı, yönetmeyi ve dağıtmayı kolaylaştırır.
3. Etkili kaynak kullanımı
Docker, (sanal makinelerden farklı olarak) kaynakların doğrudan ana bilgisayar tarafından tahsis edildiği bir sanallaştırma biçimidir. Bu, yalnızca birkaç sanal makine yerine birçok Docker kapsayıcısını çalıştırmanıza yardımcı olur. Her kapsayıcı, uygulamanın ihtiyacına göre kaynakları kendi kendine atar.
Docker, katmanlı bir dosya sistemi kullanır. Bu, Docker’a dosyaları verimli bir şekilde yeniden kullanabileceği için daha az disk alanı kullanma yeteneği verir. Örneğin, aynı temel görüntüyü kullanan birden fazla Docker görüntünüz varsa, Docker gereken dosyaların yalnızca tek bir kopyasını tutar ve bunları her bir kapsayıcıyla paylaşır. Bu, büyük ölçek ekonomileri yaratarak uygulamanızı uygun maliyetli hale getirir.
4. Uygun maliyet
Docker’da tüm kapsayıcılar aynı işletim sistemini paylaşır. Her kapsayıcı kendi tam teşekküllü uygulamasını ve uygulama bağımlılıklarını çalıştırır. Ayrıca, birkaç kapsayıcı aynı bağımlılıkları kullanıyorsa (Docker kapsayıcı görüntüleri), aynı bağımlılık örneğini Docker Engine’de yeniden yüklemeden tekrar kullanabilir. Tüm bu faktörler maliyet avantajı sağlar.
5. Taşınabilirlik
Bir uygulama oluştururken genellikle uygulama sunucusuna birçok program ve araç yüklenir. Tüm uygulama, bu sunucunun bulunduğu makineye bağlıdır. Bu tür uygulamaları paylaşmak zor olabilir. Docker ile tüm uygulamayı alıp bir kapsayıcıda tutabilirsiniz.
Bir sunucunun nasıl kurulacağını gösteren talimatları tam da ihtiyacınız olan şekilde yazabilirsiniz. Uygulamanızın çalışması için gereken her teknoloji yığınını tek bir yapılandırma dosyasında ayarlayabilirsiniz. Bu yapılandırmaları başka herhangi bir sunucuda yeniden konuşlandırabilir ve uygulama işlevselliğini çoğaltabilirsiniz.
Bu da uyumluluğu etkiler. Diyelim ki siz Node.js 5.0.0 sürümüne sahipsiniz ve karşı taraf da Node.js 16.0.0 sürümüne sahip. Bu uygulamayı bu iki platformda çalıştırırken sürüm uyumluluğu açısından bir etkilenme olabilir. Docker ile uygulamanızın çalışmasını sağlamak için tüm bu sürüm yapılandırmalarını ayarlayabilirsiniz.
6. Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD)
Bu yaklaşım CI/CD’yi teşvik eder. Bu, geliştiricileri kod havuzlarını zamanında ve daha genel olarak diğer geliştiricilerle paylaşmaya teşvik etmek için tasarlanmış bir DevOps metodolojisidir. Geliştiriciler daha sonra uygulama kodunu hızlı ve verimli bir şekilde dağıtabilir, test edebilir, çalıştırabilir ve izleyebilir.
Yaygın Docker Kullanım Örnekleri
Konfigürasyon Basitleştirme: Docker, sanal bir makinenin gerçek ek yükü olmadan konfigürasyonunun yardımıyla herhangi bir platformda çalışabilir.
Konfigürasyon dosyasını koda koymanıza ve farklı ortamlara hitap etmek için ortam değişkenlerini iletmenize izin verir. Böylece bir docker görüntüsü farklı bir ortamda kullanılabilir.
Kod Yönetimi: Kod, geliştirmeden üretime uzanan yolculuğunda farklı bir ortamdan geçer.
Her ortamın diğerinden küçük bir varyasyonu vardır. Docker, tutarlı bir ortam sağlayarak geliştirme ve kodlamayı çok daha rahat hale getirerek bu farkı ortadan kaldırır.
Docker görüntüleri değişmez olduğundan, uygulama ortamında geliştirmeden üretime sıfır değişiklik avantajıyla gelir.
Geliştirilmiş Geliştirme Verimliliği: Geliştirme ekosistemindeki iki temel amaç, geliştirme ortamının üretim ortamına mümkün olduğunca yakın bir şekilde çoğaltılmasını sağlamaktır. Bir sonraki hedef ise, kalite kodunun mümkün olan en kısa sürede teslim edilmesini sağlamaktır.
Docker, kodun üretim ortamını yansıtan bir kapsayıcıda çalışmasına izin verir ve VM’nin aksine docker, daha az ek bellek kapasitesine sahiptir. Bu da birkaç hizmetin çalışmasına yardımcı olur.
Uygulama kodunun ana bilgisayardan kapsayıcıya sunulması için Docker’ın paylaşılan hacmini kullandığınızda diğer hedefe ulaşılır. Bu, geliştiricinin, Docker içindeki çalışma ortamına yansıyacak olan platformundan ve düzenleyicisinden kaynak kodunu düzenlemesine olanak tanır.
Uygulamaların İzolasyonu: Farklı apache ve farklı bağımlılıklar gerektiren API sunucuları gibi uygulama izolasyonunun gerekli olabileceği durumlar vardır.
API sunucularını farklı kapsayıcılar altında çalıştırmak çok daha iyi bir çıkış yoludur.
Hata Ayıklama Yetenekleri: Uygulamaları test ederken oldukça önemli olan kapsayıcılara ve farklı kapsayıcılara kontrol noktaları ekleme yeteneği ile Docker, kapsayıcılarla iyi çalışan çok sayıda araç sunar.
Hızlı Dağıtım: Docker kapsayıcıları oldukça hızlı bir şekilde oluşturulabilir; bu, kapsayıcıların bir işletim sistemini başlatmaması, yalnızca uygulamayı çalıştırması sayesinde elde edilir.
Bir kez ayarlandığında yani kod bir kez çalıştığında tüm ortamlarda çalışır.
Docker İle İlgili Bilmeniz Gereken Terimleri
Platformla çalışırken göreceğiniz bazı yaygın Docker terimleri aşağıdaki şekildedir:
Cgroups: Kontrol grupları, bir sistemde çalışan işlemler arasında kaynakları tahsis etmenize olanak tanır.
Kapsayıcı görüntüleri: Docker görüntüleri, bir Docker kapsayıcısında kod yürütmek için kullanılan dosyalardır.
Docker build: “docker build”, Dockerfile’dan bir görüntü oluşturmak için kullanılan bir komuttur.
Docker Engine: Docker Engine, Docker’ın arka plan programı ve CLI’sini içeren temel ürünüdür. Docker arka plan programı ile etkileşim kurmak için bir API’ye sahiptir.
Dockerfile: Dockerfile, Docker görüntüleri oluşturma talimatlarını içeren metin tabanlı bir belgedir.
Docker Hub: Docker Hub, kapsayıcıları bulmanızı ve işletmenizle paylaşmanızı sağlayan bir hizmettir.
Docker Registry: Docker Registry, adlandırılmış Docker görüntülerini depolamanıza ve dağıtmanıza olanak tanır. Kayıtlar, depolar halinde düzenlenir ve farklı görüntülerin tüm sürümlerini tutar.
Docker run: Run komutu, belirtilen bir görüntüden bir kapsayıcı oluşturmanıza ve belirli bir komutu kullanarak bu kapsayıcıyı başlatmanıza olanak tanır.
Namespace: Bir kapsayıcı çalıştırdığınızda namespace oluşturulur. Bir kapsayıcının her öğesi farklı bir namespace’te çalıştığı için bir yalıtım katmanı sağlar.
Pull: “docker pull”, belirli bir görüntüyü veya görüntü kümesini indirmenize izin veren bir komuttur.
Repository (repo): Docker depoları, kapsayıcı görüntülerini başkalarıyla paylaşmanıza olanak tanır. Bu görüntüler etiketler olarak saklanır.
Tags (Etiketler): Docker etiketleri, tamamlanmış herhangi bir yapıya atayabileceğiniz etiketler gibidir.
Union filesystem (AUFS): Union filesystem, tek bir ana bilgisayarda birden çok dizini katmanlar ve bunları tek bir dizin olarak sunar.
Özetle diyebiliriz ki, konteynerleştirme teknolojileri kalıcıdır. Uygulamanızı paketlemenin ve altyapınızın etrafında taşımanın doğru yolu budur.
Docker, BT dünyasında kapsamlı bir devrim yaratarak geliştirme, test etme ve sunucu dağıtımlarını hızlandırdı. Birçok geliştirici ve işletme şu an Docker’ın başı çektiği bu yaklaşımları benimser.