Docker nedir?

Docker kapsayıcısı, bir uygulamanın tüm kodlarını ve bağımlılıklarını standart bir formatta paketleyen bir paketleme formatıdır. Bu paket, uygulamanın farklı bilgi işlem ortamlarında hızlı ve güvenilir bir şekilde çalıştırmasına olanak tanır. Docker kapsayıcısı; kitaplıklar, sistem araçları, kodlar ve çalışma zamanı gibi bir uygulamayı çalıştırmak için gerekli her şeyi içeren popüler, bağımsız ve yürütülebilir bir kapsayıcıdır. Docker, geliştiricilerin kapsayıcı mimarisine alınmış uygulamaları hızla oluşturmasına, test etmesine ve devreye almasına da olanak tanıyan bir yazılım platformudur.

Hizmet Olarak Kapsayıcı (CaaS) ya da Kapsayıcı Hizmetleri, kapsayıcıların yaşam döngüsünü yöneten, yönetilen bir bulut hizmetidir. Kapsayıcı hizmetleri, kapsayıcıların çalıştırma zamanını düzenlemeye (başlatma, durdurma, ölçeklendirme) yardımcı olur. Kapsayıcı hizmetlerini kullanarak uygulama geliştirme ve devreye alma yaşam döngünüzü basitleştirebilir, otomatik hâle getirebilir ve hızlandırabilirsiniz.

Docker ve Kapsayıcı Hizmetleri, hızla kabul görmüş ve son yıllarda çok büyük bir başarı elde etmiştir. 2013'te neredeyse bilinmeyen ve oldukça teknik bir açık kaynaklı teknoloji olan Docker, şu anda birçok Oracle kurumsal ürünü için resmi olarak desteklenen, standart hâline gelmiş bir çalıştırma zamanı ortamına dönüşmüştür.

Docker terminolojisini tanımlama

Docker:

Kapsayıcı teknolojisinden yararlanan uygulamalar geliştirmek, göndermek ve çalıştırmak için tasarlanmış bir yazılım kapsayıcısı platformu. Docker iki sürümde gelir: kurumsal sürüm ve topluluk sürümü

Konteyner:

Donanım sanallaştırması sağlayan sanal makinelerin aksine kapsayıcılar, "kullanıcı alanını" soyutlayarak hafif ve işletim sistemi düzeyinde sanallaştırma sağlar. Kapsayıcılar, ana bilgisayar sisteminin çekirdeğini diğer kapsayıcılarla paylaşır. Ana bilgisayar işletim sisteminde çalışan bir kapsayıcı, kodu ve tüm bağımlılıklarını paketleyen standart bir yazılım birimidir. Bu sayede, uygulamalar bir ortamdan diğerine geçildiğinde hızlı ve güvenilir şekilde çalışabilir. Kapsayıcılar kalıcı değildir ve görüntülerden alınabilir.

Docker Engine:

Kapsayıcı derleyip çalıştıran açık kaynaklı ana bilgisayar yazılımı. Docker Engine; Windows sunucularında ve Oracle Linux, CentOS, Debian, Fedora, RHEL, SUSE ve Ubuntu dahil olmak üzere çeşitli Linux işletim sistemlerindeki kapsayıcıları destekleyen istemci - sunucu uygulaması olarak hareket eder.

Docker görüntüleri:

Docker platformunda çalıştırılabilen kapsayıcı oluşturmaya yönelik talimatlar içeren, kapsayıcı olarak çalıştırılacak yazılım koleksiyonu. Görüntüler değişmez ve bir görüntüde değişiklik yapıldığında yeni bir görüntü oluşturulmalıdır.

Docker Kayıt Defteri:

Görüntüleri depolamaya ve indirmeye yönelik yer. Kayıt defteri, Docker görüntülerini depolayıp dağıtan durum bilgisi olmayan ve ölçeklenebilir bir sunucu tarafı uygulamasıdır.

Docker'ı kimler kullanır?

Docker, DevOps ve geliştiricilerin faydalanacağı şekilde tasarlanmış bir açık uygulama geliştirme sistemidir. Geliştiriciler Docker'ı kullanarak uygulamaları neredeyse her yerde çalıştırılabilen hafif, taşınabilir, kendi kendine yeten kapsayıcılar olarak kolayca oluşturabilir, paketleyebilir, gönderebilir ve çalıştırabilir. Kapsayıcılar, geliştiricilerin bir uygulamayı tüm bağımlılıklarıyla birlikte paketlemesine ve tek bir birim olarak devreye almasına olanak sağlar. Geliştiriciler, önceden oluşturulmuş ve kendi kendine yeten uygulama kapsayıcıları sağlayarak uygulama koduna odaklanabilir ve temel işletim sistemi veya devreye alma sistemi konusunda endişe duymadan kullanabilir.

Ayrıca, geliştiriciler hâlihazırda bir Docker kapsayıcısında çalışacak şekilde tasarlanmış binlerce açık kaynaklı kapsayıcı uygulamasından yararlanabilir. DevOps ekipleri için Docker, sürekli entegrasyon ve geliştirme araç zincirlerini ifade eder; uygulamaları devreye almak ve yönetmek için sistem mimarisi içinde gerekli olan kısıtlamaları ve karmaşıklığı azaltır. Kapsayıcı orkestrasyon bulut hizmetlerinin kullanıma sunulmasıyla, tüm geliştiriciler kendilerine ait geliştirme ortamlarında kapsayıcı mimarisine alınmış uygulamaları yerel olarak geliştirebilir ve daha sonra bu kapsayıcı mimarisine alınmış uygulamaları, yönetilen Kubernetes hizmetleri gibi bulut hizmetlerinde üretime alıp çalıştırabilir.

Docker ve geliştiriciler

Kapsayıcılar her türlü geliştirici tarafından paket hâline getirilebilir. Yazılım endüstrisindeki kişiler, genellikle geliştiricileri uzmanlık alanına göre ayırır: ön uç, arka uç veya aradaki herhangi bir uzmanlık alanı. Paketleme kapsayıcılarını çoğunlukla arka uç geliştiricileri görse de CaaS temel kavramlarına aşina olan herkes yazılım geliştirme yaşam döngüsünün bu alanında başarılı olabilir. Uygulamanızın bağımlılıklarını paket hâline getirmeye hazırlanmadan önce, developer.oracle.com adresine göz atın ve uygulamanızı veya programınızı derlemek için kullanabileceğiniz araçlar hakkında bilgi edinin.

Docker ve Kubernetes karşılaştırması

Linux konteynerleri 2008'den bu yana kullanılıyor ancak 2013'te Docker kapsayıcılarının ortaya çıkışına kadar kadar pek bilinmiyordu. Docker kapsayıcılarının ortaya çıkışıyla kapsayıcı mimarisine alınmış uygulamaların geliştirilmesi ve dağıtılmasına duyulan ilgide ani bir artış görüldü. Kapsayıcı mimarisine alınmış uygulama sayısının birden fazla sunucuda devreye alınmış yüzlerce kapsayıcıyı kapsayacak şekilde artmasıyla, bunları çalıştırmak giderek daha karmaşık hâle geldi. Yüzlerce kapsayıcı nasıl koordine edilir, ölçeklendirilir, yönetilir ve planlanır? Bu noktada Kubernetes yardımcı olabilir. Kubernetes, Docker kapsayıcılarınızı ve iş yüklerinizi çalıştırmanıza imkan veren açık kaynaklı bir orkestrasyon sistemidir. Çok sayıda sunucuya dağıtılmış birden fazla kapsayıcıyı ölçeklendirmek için verileri taşırken işletim karmaşıklıklarını yönetmenize yardımcı olur. Kubernetes motoru, uygulama konteyneri yaşam döngüsünü otomatik olarak düzenler, konteynerlerin barındırma altyapısında dağıtılmasını sağlar. Kubernetes, talebe bağlı olarak kaynakları yukarı ve aşağı yönde ölçeklendirebilir. Konteynerleri sürekli olarak kullanıma açar, takvimlerini programlar, bunları siler ve durumlarını izler.

Docker ile İlgili Temel Bilgiler

Docker'ın temel kavramları görüntüler ve kapsayıcılardır. Docker görüntüsünde, yazılımınızı çalıştırmak için gereken her şey bulunur: kod, çalıştırma zamanı [örneğin, Java Virtual Machine (JVM)], sürücüler, araçlar, komut listeleri, kitaplıklar, dağıtımlar ve daha fazlası.

Docker kapsayıcısı, bir Docker görüntüsünün çalışan örneğidir. Ancak, tip 1 veya tip 2 hipervizöre sahip geleneksel sanallaştırmanın aksine, Docker kapsayıcısı ana bilgisayar işletim sisteminin çekirdeğinde çalışır. Şekil 1'de gösterildiği gibi, Docker görüntüsü içinde ayrı bir işletim sistemi bulunmaz.

docker ile ilgili temel bilgiler görüntüsü
Şekil 1

Yalıtma ve Sanallaştırma karşılaştırması

Her Docker kapsayıcısının kendi dosya sistemi, kendi ağ yığını (ve bu nedenle kendi IP adresi), kendi işlem alanı, CPU ve bellek için tanımlı kaynak sınırlamaları vardır. Docker kapsayıcıları, işletim sistemini önyüklemek zorunda olmadığından anında başlar. Docker'ın odak noktası yalıtmadır. Yani, sanallaştırmanın aksine, ana bilgisayar işletim sisteminin kaynaklarını ayırarak ana bilgisayar işletim sistemi üzerinde bir konuk işletim sistemi sağlar.

Artımlı Dosyalar Sistemi

artımlı dosyalar sistemi görüntüsü
Şekil 2

Docker görüntülerinin dosya sistemi, yazma hâlinde kopyalama semantiği ile katmanlanır. Bu durum, devralmayı ve yeniden kullanmayı, kaynakları diske kaydetmeyi ve artımlı görüntü indirmeyi mümkün kılar.

Şekil 2'de gösterildiği üzere, WebLogic dağıtımına sahip bir Docker görüntüsü, Oracle WebLogic Server etki alanına sahip bir görüntüyü temel alabilir. Bu ise Java Development Kit (JDK) görüntüsünü temel alan bir WebLogic görüntüsüne dayalı olabilir ve bu da Oracle Linux temel görüntüsünü temel alır.

Docker Kayıt Defteri

Docker görüntülerinin oluşturulması kolay olduğundan geliştiriciler Docker görüntülerinin basitliğini ve taşınabilirliğini sevse de binlerce Docker görüntüsünün yönetilmesinin çok zor olduğunun bilincindeler. Docker Kayıt Defteri bu zorluğu giderir. Docker Kayıt Defteri, Docker görüntülerini depolama ve dağıtmaya yönelik standart bir yöntemdir. Kayıt Defteri, esnek Apache lisansı kapsamında açık kaynaklı bir veri havuzudur.

Docker Kayıt Defteri, veri havuzunda depolanan Docker görüntülerinin erişim denetiminin ve güvenliğinin geliştirilmesine de yardımcı olur. Görüntülerin dağıtımını yönetir ve ayrıca uygulama geliştirme iş akışlarıyla entegre edilebilir. Geliştiriciler, kendi Docker Kayıt Defterlerini ayarlayabilir veya Docker Hub, Oracle Kapsayıcı Kayıt Defteri, Azure Kapsayıcı Kayıt Defteri gibi barındırılan bir Docker Kayıt Defteri hizmeti kullanabilir.

Docker Hub, Docker tarafından yönetilen, barındırılan bir Docker kayıt defteridir. Docker Hub'da yazılım tedarikçileri, açık kaynak projeleri ve topluluğun sunduğu 100.000'den fazla kapsayıcı görüntüsü bulunur. Docker Hub; NGINX, Logstash, Apache HTTP, Grafana, MySQL, Ubuntu ve Oracle Linux gibi resmi veri havuzlarından yazılımlar ve uygulamalar içerir.

Docker, bir kapsayıcı başlatırken ilgili görüntüyü yerel olarak kullanılamıyorsa varsayılan olarak genel Docker Hub'dan otomatik olarak çeker. Ayrıca, kendi görüntülerinizi de oluşturabilir ve bunları Docker Hub'a genel veya özel bir veri havuzuna gönderebilirsiniz.

Şekil 3: Docker Kayıt Defteri ekran görüntüsü
Şekil 3

Mikro Hizmet Çalıştırma Zamanı Olarak Docker

Tek parçalı uygulamaları küçük mikro hizmet parçalarına ayırma fikri, günümüzde yazılım geliştiricileri arasında epey dikkat çekiyor.

Mikro hizmetler işlem olarak bağımsız şekilde dağıtılır, birbirleriyle iletişim kurmak için hafif protokoller kullanır ve her hizmet kendi verilerine sahiptir. Mikro hizmetler, merkezi olmayan bir yönetişim yaklaşımı izlediğinden çok yüksek miktarda altyapı otomasyonu, otomatik test, tamamen otomatik CD ardışık düzeni ve yetenekli, çevik DevOps ekiplerine ihtiyaç duyarlar.

Bu mimari tarz hakkındaki yoğun tartışmalar devam ediyor ancak mikro hizmetlere bölünen bir uygulamanın sadece bir işlem kümesi olarak çalıştırılabilmesi pek olası değildir. Gereksinimlerden yalnızca birkaçını belirtmek gerekirse bir mikro hizmetin ana bilgisayardan bağımsız ve işletim sistemi düzeyinde yalıtılmış olması gerekir. Kaynak sınırları içinde çalıştırılmalıdır, aşağı ve yukarı doğru ölçeklenmelidir, başarısız olması durumunda yeniden başlatılmalıdır ve yazılımla tanımlanmış bir ağ katmanı üzerinden keşfedilmeli ve diğer mikro hizmetlere bağlanmalıdır.

Bu nedenle, bir Docker kapsayıcısında bir mikro hizmet çalıştırmak, bu hedeflerin çoğuna ulaşmanız için mükemmel bir konum elde etmenizi sağlar.

Docker: İki Anahtar Boyut

Docker yazılımları oluşturma, gönderme ve çalıştırma şeklimizi iki farklı boyutta değiştiriyor:

  • Geliştirmeden üretime kadar her alanda güvenilir uygulama edinme sürecini geliştirir.
  • Şirket içinden buluta geçiş için standart bir görüntü formatı sağlar.

Her iki boyut da aşağıdaki paragraflarda daha ayrıntılı olarak açıklanmaktadır.

Docker Görüntüsü: Geliştirmeden Üretime

Tüm bağımlılıklarıyla birlikte bir Docker görüntüsü oluşturulduğunda, "fakat geliştirme makinemde çalışıyordu" sorunu giderilir. Burada temel fikir, bir Docker görüntüsünün, Git gibi bir kaynak kod veri havuzundan bir derleme ardışık düzeniyle otomatik olarak oluşturulması ve öncelikle geliştirme ortamında test edilmesi yönündedir. Bu değişmez görüntü, daha sonra Docker kayıt defterinde depolanır.

Şekil 4'te gösterildiği üzere, diğer yükleme testleri, entegrasyon testleri, kabul testleri ve daha fazlası için aynı görüntü kullanılacaktır. Her ortamda aynı görüntü kullanılır. Bir üretim veritabanı için JDBC URL'si gibi ortama özgü küçük ancak gerekli farklılıklar, kapsayıcıya ortam değişkenleri veya dosyalar şeklinde aktarılabilir.

docker görüntüsü ekran görüntüsü
Şekil 4

İstatistikler, mevcut tüm Docker kullanım senaryolarının %65'inin geliştirme aşamasında olduğunu ve %48'inde sürekli entegrasyon için Docker'ın kullanıldığını gösteriyor.

Docker Bulutu

Docker, genel bulutların benimsenme şeklini değiştirdi: Bir yandan, Docker görüntüsüyle birlikte tarihte ilk defa, şirket içinde ve yaygın kullanılan tüm bulut sağlayıcılarında çalıştırılabilecek ortak bir paket formatı ortaya çıktı. Docker kapsayıcıları, dizüstü bilgisayarlarda Oracle Bulut'ta çalıştığı gibi çalışır.

Diğer yandan, Docker kapsayıcıları yaygın kullanılan her genel bulutta çalıştırıldığından genel bulutlara karşı uzun süredir var olan tedarikçiye bağımlı kalma ön yargısının aşılmasına önemli bir katkıda bulunur. Artık yaygın kullanılan her bulut sağlayıcısı, PaaS olarak Docker'ı sunuyor.

Docker Sürümleri: Temel Teknolojinin Olgunluğu

Docker sürümleri, geleneksel kurumsal yazılımın sürüm döngüsünden çok daha hızlıdır. Zaman zaman Docker sürümlerinin daha yüksek hızı ve Docker projesinin yeni olması, Docker'ın güvenliği ve kararlılığı konusunda endişelere yol açıyor.

Docker ve onun komut satırı olan Docker daemon, API'si ve Docker Swarm, Docker Machine ve Docker Compose gibi araçlar yalnızca son üç yılda gelişmiş olsa da temel çekirdek özellikleri neredeyse on yıldır her Linux çekirdeğinde kullanılıyor.

Kapsayıcı teknolojisi ilk benimseyenlere verilebilecek önemli örneklerden biri Google'dır. Google, Docker ortaya çıkmadan önce bile Linux kapsayıcılarını kullanıyordu. Google her şeyi kapsayıcıda çalıştırır. Google'ın haftada birkaç milyar kapsayıcı kullanıma sunduğu tahmin ediliyor.

Cgroups ve Namespaces Geçmişi

Docker, temel Linux çekirdeği olarak cgroups ve namespaces'i kullanır. Cgroups, daha önce Google geliştiricileri tarafından yapılan çalışmalar temel alınarak 2008'de Linux çekirdeğinde kullanıma sunuldu1. Cgroups, bir dizi işletim sistemi işlemini sınırlar ve bu işlemlere yönelik kaynak kullanımının nedenini oluşturur.

Linux çekirdeği, işlemlerin sistem kaynaklarını birbirinden ayırmak için ad alanı kullanır. İlk ad alanı olan mount ad alanı, 2002 gibi erken bir dönemde kullanıma sunuldu.2

Kapsayıcı Bulut Hizmetleri

Bu makalenin ilk bölümünde, bazı önemli Docker kavramları açıklanmıştır. Ancak bir üretim ortamında, Docker kapsayıcısında uygulama çalıştırmak için yeterli değildir.

Üretim ortamını ayarlamak ve işletmek için kapsayıcıları çalıştıracak donanım gerekir. Veri havuzları ve küme yöneticilerinin yanı sıra Docker gibi yazılımların yüklenmesi, yükseltilmesi ve bunlara düzeltme eki uygulanması gerekir. Ana bilgisayarlar arasında birçok Docker kapsayıcısı iletişim kuruyorsa ağ oluşturulmalıdır. Kümelenmiş kapsayıcılar başarısız olmaları durumunda yeniden başlatılmalıdır. Ayrıca, birbiriyle bağlantılı bir dizi kapsayıcı tek bir mantıksal uygulama örneği kadar kolayca devreye alınabilmelidir. Bir yük dengeleyici, birkaç web sunucusu, yönetici sunucusuna sahip bazı Oracle WebLogic Server örnekleri, yönetilen sunucu ve veritabanı buna örnek verilebilir. Kapsayıcı mimarisine alınmış uygulamaları geniş ölçekte yönetmek için Kubernetes veya Docker Swarm gibi bir kapsayıcı orkestrasyon sistemi gerekir. Kubernetes gibi orkestrasyon sistemlerini devreye almak, yönetmek ve çalıştırmak zor ve zaman alıcı olabilir.

Bulut sağlayıcıları, geliştiricilerin kapsayıcı mimarisine alınmış uygulama oluşturmasını kolaylaştırmak ve verimli hâle getirmek için Kapsayıcı Bulut Hizmetleri veya Hizmet Olarak Kapsayıcılar (CaaS) sunar. Kapsayıcı Bulut Hizmetleri, geliştiricilerin ve operasyon ekiplerinin kapsayıcıların yaşam döngüsünü otomatik bir biçimde modernleştirip yönetmesine yardımcı olur. Genellikle Kubernetes kullanılarak oluşturulan bu orkestrasyon hizmetleri, DevOps ekiplerinin kapsayıcı mimarisine alınmış uygulamaları geniş ölçekte yönetip çalıştırmasını kolaylaştırır. Oracle Cloud Infrastructure Kubernetes Engine ve Azure Kubernetes Service popüler kapsayıcı orkestrasyonu yönetilen bulut hizmetlerine verilebilecek iki örnektir.

Oracle Cloud Infrastructure Kubernetes Engine, kapsayıcı mimarisine alınmış uygulamalarınızı bulutta devreye almak için kullanabileceğiniz tamamen yönetilen, ölçeklenebilir ve yüksek kullanılabilirlik sunan bir hizmettir. Geliştirme ekibiniz bulut yerel uygulamaları güvenile oluşturmak, konuşlandırmak ve yönetmek istediğinde Oracle Cloud Infrastructure Kubernetes Engine'ı (bazı durumlarda OKE olarak kısaltılır) kullanın.

Oracle'dan Docker görüntüleri

Kapsayıcılar her türlü geliştirici tarafından paket hâline getirilebilir. Yazılım endüstrisindeki kişiler, genellikle geliştiricileri uzmanlık alanına göre ayırır: ön uç, arka uç veya aradaki herhangi bir uzmanlık alanı. Paketleme kapsayıcılarını çoğunlukla arka uç geliştiricileri görse de CaaS temel kavramlarına aşina olan herkes yazılım geliştirme yaşam döngüsünün bu alanında başarılı olabilir. Uygulamanızın bağımlılıklarını paket hâline getirmeye hazırlanmadan önce, developer.oracle.com adresine göz atın ve uygulamanızı veya programınızı derlemek için kullanabileceğiniz araçlar hakkında bilgi edinin.

Aşağıda, Oracle ürünleri için Docker görüntülerini elde etmeye veya oluşturmaya yönelik bazı kaynaklar verilmiştir. Docker görüntülerine yönelik Oracle GitHub veri havuzunda, Oracle ticari ürünleri ve Oracle tarafından desteklenen açık kaynak projeleri için Docker görüntüleri oluşturmak amacıyla kullanılacak Dockerfile'lar ve örnekler yer alır.

Docker Hands-On Lab: Docker ile Kapsayıcı Mimarisine Alarak Geliştirme

Referanslar

  1. Cgroups (Wikipedia)
  2. Linux Namespaces (Wikipedia)