Konteyner, bir uygulama yazılımının tüm kodlarının ve bağımlılıklarının, bilişim ortamlarında hızlı ve güvenilir bir şekilde çalışmasını sağlayan standart bir biçimde paketleyen bir paketleme biçimidir. Docker konteyner kitaplıklar, sistem araçları, kod ve çalışma zamanı dahil olmak üzere bir uygulama yazılımını çalıştırmak için gereken her şeyi içeren popüler, hafif, bağımsız, yürütülebilir bir konteynerdir. Docker ayrıca, geliştiricilerin konteynere alınmış uygulama yazılımlarını hızla oluşturmasına, test etmesine ve dağıtmasına olanak tanıyan bir yazılım platformudur.
Containers as a Service (CaaS) veya Konteyner Servisleri, konteynerlerin yaşam döngüsünü yöneten yönetilen bulut servisleridir. Konteyner servisleri, konteynerlerin çalışma zamanını düzenlemeye (başlatma, durdurma, ölçeklendirme) yardımcı olur. Konteyner servislerini kullanarak, uygulama yazılımı geliştirme ve dağıtım yaşam döngünüzü basitleştirebilir, otomatikleştirebilir ve hızlandırabilirsiniz.
Docker ve Container Services hızlı bir şekilde benimsendi ve son birkaç yılda muazzam bir başarı elde etti. 2013'te neredeyse bilinmeyen ve oldukça teknik bir açık kaynak teknolojisi olan Docker, artık birçok Oracle kurumsal ürünü için resmi olarak desteklenen standart hale getirilmiş bir çalışma zamanı ortamına dönüştü.
Docker, DevOps'a ve geliştiricilere fayda sağlamak için tasarlanmış açık bir uygulama yazılımı geliştirme çerçevesidir. Geliştiriciler Docker'ı kullanarak, uygulama yazılımlarını hemen hemen her yerde çalışabilen hafif, taşınabilir, kendi kendine yeten konteynerler olarak kolayca oluşturabilir, paketleyebilir, gönderebilir ve çalıştırabilir. Konteynerler, geliştiricilerin bir uygulama yazılımını tüm bağımlılıkları ile paketlemesine ve tek bir birim olarak dağıtmasına olanak tanır. Geliştiriciler, önceden oluşturulmuş ve kendi kendini sürdüren uygulama yazılımı konteynerleri sağlayarak, uygulama yazılımı koduna odaklanabilir ve temeldeki işletim sistemi veya dağıtım sistemi hakkında endişelenmeden kullanabilir.
Ek olarak, geliştiriciler bir Docker konteynerde çalışmak üzere tasarlanmış binlerce açık kaynaklı konteyner uygulama yazılımından yararlanabilir. DevOps ekipleri için Docker, sürekli entegrasyon ve geliştirme araç zincirlerine katkıda bulunur ve uygulama yazılımlarını dağıtmak ve yönetmek için sistem mimarilerinde ihtiyaç duydukları kısıtlamaları ve karmaşıklığı azaltır. Konteyner düzenleme bulut servislerinin kullanıma sunulmasıyla, herhangi bir geliştirici, kendi geliştirme ortamlarında yerel olarak konteynere alınmış uygulama yazılımları geliştirebilir ve ardından bu konteynere alınmış uygulama yazılımlarını, yönetilen Kubernetes servisleri gibi bulut servislerinde üretimde taşıyabilir ve çalıştırabilir.
Linux konteynerler 2008'den beri var, ancak 2013'te Docker konteynerlerin ortaya çıkmasına kadar iyi bilinmiyorlardı. Docker konteynerlerin ortaya çıkmasıyla birlikte, konteynere alınmış uygulamaların geliştirilmesi ve dağıtılmasına yönelik ilgi patlaması yaşandı. Konteynere alınmış uygulama yazılımlarının sayısı, birden çok sunucuya dağıtılan yüzlerce konteyneri kapsayacak şekilde büyüdükçe, bunların çalıştırılması daha karmaşık hale geldi. Yüzlerce konteyneri nasıl koordine ediyor, ölçeklendiriyor, yönetiyor ve planlıyorsunuz? Bu konuda size Kubernetes yardımcı olabilir. Kubernetes, Docker konteynerlerinizi ve iş yüklerinizi çalıştırmanıza olanak tanıyan açık kaynaklı bir düzenleme sistemidir. Birden çok sunucuya dağıtılan birden fazla konteyneri ölçeklendirmeye geçerken işletim karmaşıklıklarını yönetmenize yardımcı olur. Kubernetes motoru, uygulama yazılımı konteynerlerini barındırma altyapısı genelinde dağıtarak konteyner yaşam döngüsünü otomatik olarak düzenler. Kubernetes, talebe bağlı olarak kaynakları hızla yukarı veya aşağı ölçeklendirebilir. Konteynerlerin sağlığını sürekli olarak tedarik eder, planlar, siler ve izler.
Docker'ın temel kavramları görüntüler ve konteynerlerdir. Docker görüntüsü, yazılımınızı çalıştırmak için gereken her şeyi içerir: kod, bir çalışma zamanı (örneğin, Java Virtual Machine (JVM), sürücüler, araçlar, komut dosyaları, kitaplıklar, dağıtımlar ve daha fazlası.
Docker konteyner, Docker görüntüsünün çalışan bir örneğidir. Bununla birlikte, tip 1 veya tip 2 hiper yönetici ile geleneksel sanallaştırmanın aksine, bir Docker konteyner, ana bilgisayar işletim sisteminin çekirdeği üzerinde çalışır. Bir Docker görüntüsünde, Şekil 1'de gösterildiği gibi ayrı bir işletim sistemi yoktur.
Her Docker konteynerin kendi dosya sistemi, kendi ağ yığını (ve dolayısıyla kendi IP adresi), kendi işlem alanı ve CPU ile bellek için tanımlanmış kaynak sınırlamaları vardır. Bir Docker konteynerin bir işletim sistemini önyüklemesi gerekmediğinden, işlem anında başlar. Docker, sanallaştırmanın aksine izolasyonu (örneğin bir ana bilgisayar işletim sisteminin kaynaklarını ayırma) yani ana bilgisayar işletim sisteminin üstünde bir konuk işletim sistemi sağlamayı amaçlar.
Docker görüntüsünün dosya sistemi, yazma üzerine kopyalama semantiği ile katmanlıdır. Bu, devralma ve yeniden kullanımı mümkün kılar, kaynakları diske kaydeder ve artımlı görüntü indirmeye olanak tanır.
Şekil 2'de gösterildiği gibi, WebLogic dağıtımına sahip bir Docker görüntüsü Oracle Linux temel görüntüsüne, bir Java Development Kit (JDK) görüntüsüne, bir WebLogic görüntüsüne, bir Oracle WebLogic Server alan adlı bir görüntüye dayanabilir.
Docker görüntülerinin oluşturulması kolayken ve geliştiriciler Docker görüntülerinin basitliğini ve taşınabilirliğini severken, binlerce Docker görüntüsünü yönetmenin çok zor olduğunu hızla keşfettiler. Docker Registry bu zorluğu ele alır. Docker Registry, Docker görüntülerini depolamanın ve dağıtmanın standart bir yoludur. Registry (Kayıt Defteri), izin verilen Apache lisansı altında açık kaynak tabanlı bir depodur.
Docker Registry, havuzunda depolanan Docker görüntülerinin erişim kontrolünü ve güvenliğini iyileştirmeye de yardımcı olur. Görüntülerin dağıtımını yönetir ve ayrıca uygulama yazılımı geliştirme iş akışlarıyla entegre edilebilir. Geliştiriciler kendi Docker Kayıt Registry'lerini kurabilir veya Docker Hub, Oracle Container Registry, Azure Container Registry gibi barındırılan bir Docker Registry servisini kullanabilir.
Docker Hub, Docker tarafından yönetilen, barındırılan bir Docker kayıt defteridir. Docker Hub yazılım satıcılarından, açık kaynak projelerinden ve topluluktan 100.000'den fazla konteyner görüntüsüne sahiptir. Docker Hub; NGINX, Logstash, Apache HTTP, Grafana, MySQL, Ubuntu ve Oracle Linux gibi resmi depolardan yazılım ve uygulamaları içerir.
Bir konteyner başlatırken, yerel olarak kullanılamıyorsa Docker varsayılan olarak ilgili görüntüyü genel Docker Hub'dan otomatik olarak çeker. Dahası, kendi görüntülerinizi de oluşturabilir ve bunları Docker Hub'a genel veya özel bir depoya aktarabilirsiniz.
Monolitik uygulama yazılımları daha küçük mikro servis parçalarına ayırma fikri, bugünlerde yazılım geliştiricileri arasında büyük ilgi görüyor.
Mikro servisler, bir süreç olarak bağımsız olarak konuşlandırılır, birbirleriyle iletişim kurmak için hafif protokoller kullanır ve her servis kendi verilerine sahiptir [7]. Mikro servisler merkezi olmayan bir yönetişim yaklaşımı izledikleri için, oldukça yüksek miktarda altyapı otomasyonu, otomatik testler, tam otomatik CD ardışık düzenleri ve yetenekli, çevik DevOps ekipleri gerektirir.
Bu mimari tarz hakkında hala çok fazla tartışma var, ancak mikro servislere ayrıştırılmış bir uygulama yazılımının basitçe bir dizi işlem olarak çalıştırılabileceğini varsaymak saflık olur. Yalnızca birkaç gereksinimi belirtmek için, bir mikro servisin ana bilgisayardan bağımsız olması ve işletim sistemi düzeyinde izole edilmesi gerekir. Kaynak sınırları dahilinde çalışmalı, yukarı ve aşağı ölçeklendirilmeli, başarısız olursa yeniden başlatılmalı ve bir yazılım tanımlı ağ katmanı aracılığıyla keşfedilmeli ve diğer mikro servislere bağlanmalıdır.
Bu nedenle, bir Docker konteynerde bir mikro servis çalıştırmak, bu hedeflerin çoğuna ulaşmak için sizi mükemmel bir atlama noktasına getirir.
Docker yazılımı oluşturma, gönderme ve çalıştırma şeklimizi iki farklı boyutta değiştirir:
Her iki boyut da aşağıdaki paragraflarda daha ayrıntılı olarak açıklanmıştır.
Tüm bağımlılıkları ile bir Docker görüntüsü oluşturmak "ama geliştirme makinemde işe yaradı" sorununu çözer. Temel fikir, bir Docker görüntüsünün Git gibi bir kaynak kod havuzundan bir derleme işlem hattı tarafından otomatik olarak oluşturulması ve başlangıçta bir geliştirme ortamında test edilmesidir. Bu değişmez görüntü daha sonra bir Docker kayıt defterinde saklanacaktır.
Şekil 4'te gösterildiği gibi, aynı görüntü diğer yük testleri, entegrasyon testleri, kabul testleri ve daha fazlası için kullanılacaktır. Her ortamda aynı görüntü kullanılacaktır. Bir üretim veritabanı için JDBC URL'si gibi küçük ancak gerekli çevresel olarak özel farklılıklar, ortam değişkenleri veya dosyalar şeklinde konteynere beslenebilir.
İstatistikler, tüm mevcut Docker kullanım örneklerinin %65'inin geliştirme aşamasında olduğunu ve %48'inin sürekli entegrasyon için Docker kullandığını göstermektedir [5].
Docker, genel bulutların benimsenmesini değiştirdi: Bir yandan, bir Docker görüntüsü ile tarihte ilk kez, her büyük bulut sağlayıcının yanı sıra şirket içinde de çalıştırılabilen ortak bir paket formatı bulunmaktadır. Docker konteynerler, dizüstü bilgisayarımda Oracle Cloud'da çalıştıkları gibi çalışıyor.
Diğer yandan, Docker konteynerler her büyük genel bulut üzerinde çalıştığından, genel bulutlara karşı uzun süredir var olan önyargının üstesinden gelmeye büyük katkı sağlarlar: satıcıya kilitlenme. Her büyük bulut sağlayıcı artık Docker'ı bir PaaS olarak sunuyor.
Docker sürümlerinin hızı, geleneksel kurumsal yazılımın yayın döngüsünden çok daha hızlıdır. Bazen Docker sürümlerinin yüksek hızı, Docker projesinin yeniliği ile birlikte Docker'ın güvenliği ve istikrarı hakkında endişeler uyandırmaktadır.
Docker ve komut satırı, Docker arka plan programı, API'si ve Docker Swarm, Docker Machine ve Docker Compose gibi araçların yalnızca son üç yılda gelişmesine rağmen, temeldeki çekirdek özellikleri neredeyse on yıldır her Linux çekirdeğinde mevcuttur.
Konteyner teknolojisini erken benimseyenlerin önemli bir örneği Google'dır. Google, Docker ortalıkta olmadan önce Linux konteynerleri kullanıyordu. Ayrıca, Google her şeyi bir kapta çalıştırmaktadır. Google'ın haftada 2 milyar konteyner başlattığı tahmin edilmektedir [3].
Docker'ın kullandığı temel Linux çekirdeği özellikleri kontrol grupları ve ad alanlarıdır. 2008 yılında, daha önce Google geliştiricileri [1] tarafından yapılan çalışmalara dayalı olarak Linux çekirdeğine kontrol grupları tanıtıldı. Kontrol grupları bir dizi işletim sistemi işleminin kaynak kullanımını sınırlar ve hesaba katar.
Linux çekirdeği, işlemlerin sistem kaynaklarını birbirinden izole etmek için ad alanını kullanır. İlk ad alanı (bağlama ad alanı) 2002 gibi erken bir tarihte tanıtıldı.
Bu makalenin ilk bölümü bazı önemli Docker kavramlarını açıkladı. Ancak, bir üretim ortamında bir uygulama yazılımını bir Docker konteynerde çalıştırmak yeterli değildir.
Bir üretim ortamı kurmak ve bunu çalıştırmak için konteynerleri çalıştıracak donanım gerekir. Depolar ve küme yöneticileriyle birlikte Docker gibi yazılımlar kurulmalı, bu yazılımlar yükseltilmeli ve yamalanmalıdır. Birkaç Docker konteyner ana bilgisayarlar arasında iletişim kuruyorsa, bir ağ oluşturulması gerekir. Başarısız olurlarsa kümelenmiş konteynerler yeniden başlatılmalıdır. Ek olarak, birbirine bağlı bir dizi konteyner, tek bir mantıksal uygulama yazılımı örneği kadar kolay bir şekilde konuşlandırılabilir olmalıdır. Bunun bir örneği, bir yük dengeleyici, birkaç web sunucusu, bir yönetici sunucusuna sahip bazı Oracle WebLogic Server örnekleri, bir yönetilen sunucu ve bir veritabanı olabilir. Konteynere alınmış uygulama yazılımlarını geniş ölçekte yönetmek için Kubernetes veya Docker Swarm gibi bir konteyner düzenleme sistemi gerekir. Kubernetes gibi düzenleme sistemlerini dağıtmak, yönetmek ve çalıştırmak zor olabilir ve zaman alıcı olabilir.
Geliştiricilerin konteynere alınmış uygulama yazılımları oluşturmasını kolaylaştırmak ve bunları daha verimli hale getirmek için, bulut sağlayıcılar Konteyner Bulut Servisleri (Container Cloud Services) veya Servis Olarak Konteynerler [Containers as a Service (CaaS)] sunar. Container Cloud Services, geliştiricilerin ve operasyon ekiplerinin otomatik bir şekilde konteynerlerin yaşam döngüsünü kolaylaştırmasına ve yönetmesine yardımcı olur. Genellikle Kubernetes kullanılarak oluşturulan bu düzenleme servisleri, DevOps ekiplerinin konteynere alınmış uygulama yazılımlarını uygun ölçekte yönetmesini ve çalıştırmasını kolaylaştırır. Oracle Container Engine for Kubernetes ve Azure Kubernetes Service, popüler konteyner düzenleme yönetimli bulut servislerinin iki örneğidir.
Oracle Container Engine for Kubernetes konteynere alınmış uygulama yazılımlarınızı bulutta dağıtmak için kullanabileceğiniz, tam olarak yönetilen, ölçeklenebilir ve yüksek düzeyde kullanılabilir bir servistir. Geliştirme ekibiniz bulut yerel uygulama yazılımlarını güvenilir bir şekilde derlemek, dağıtmak ve yönetmek istediğinde Container Engine for Kubernetes (bazen sadece OKE olarak kısaltılır) kullanın.
Aşağıda, Oracle ürünleri için Docker görüntüleri edinmeye veya oluşturmaya yönelik bazı kaynaklar bulunmaktadır. Docker görüntüleri için Oracle GitHub deposu, Oracle ticari ürünleri ve Oracle sponsorlu açık kaynaklı projeler için Docker görüntüleri oluşturmak üzere Dockerfiles ve örnekler içerir.