Docker ve container (kapsayıcı) teknolojisine kısa bir giriş

Docker ve container (kapsayıcı) teknolojisine kısa bir giriş

Google, IBM ve Microsoft gibi popüler teknoloji şirketlerinin de kullanımıyla popüler bir hal kazanan Docker’ı inceliyoruz.
Merve Özdeş13 Eki 2022

Docker uygulamaları geliştirmek, göndermek ve çalıştırmak için açık kaynak kodlu bir kapsayıcı (container) platformudur. Kapsayıcı, uygulamamız için gerekli konfigürasyonları ve uygulamamızın bağımlılıklarını bir araya getiren paketleme yöntemidir. Kapsayıcı adı verilen izole kutularda uygulamalar çalıştırılır ve bu kutuların izole edilmesi sayesinde birden fazla bağımsız kapsayıcı üzerinde farklı uygulamalar çalıştırılabilir.                                

Docker, uygulamaları çalıştırmak ve depolamak için kapsayıcı oluşturur ve bu işlem için sanallaştırmayı kullanır. Bu size sanal makineleri hatırlatmış olabilir. docker ve sanal makineler, yazılım geliştirme için izole sanal ortamları kullansa da esasında birbirlerinden farklı yapılara sahiptir. Docker kapsayıcılarını sanal makinelerden ayıran en önemli özellik; Docker kapsayıcılarının daha hafif, daha hızlı ve kaynak açısından daha verimli olmasıdır. Aşağıdaki resimde de görülebildiği gibi sanal makinelerde her uygulama için o uygulamaya ait işletim sistemi ve gerekli kütüphaneler vardır. Docker ise bir sanal makineden farklı olarak, her bir uygulama için ayrı bir sanal işletim sistemi oluşturmak yerine uygulamaları tek bir işletim sistemi üzerinde kapsayıcı yapılarını kullanarak izolasyonu sağlar. Bu, uygulamanın boyutunu azaltmakla birlikte önemli bir performans artışını da yanında getirir. Bir donanım birden fazla kapsayıcıya sahip olabilir. Sanal makinelerden farklı olarak kapsayıcılar, uygulama düzeyinde sanallaştırılır. Bu nedenle, işletim sistemi çekirdeği ana bilgisayarla paylaşılır ve bunun üzerinde bir işletim sistemi sanallaştırılır. Bu, kaynak kullanımını azaltır, hızlı ve kolay yapılandırılabilen sanal ortamlar sağlar. Docker kapsayıcıları, uygulamaları farklı ortamlarda çalışacak şekilde tutmasıyla da sanal makinelerden farklıdırlar. Böylece docker’da uyumsuzluk problemi yaşanmaz.

 

Amazon

 

Docker ve sanal makineleri kıyasladığımızda ikisinin birbirlerine göre avantaj ve dezavantajları olduğunu görürüz. Ancak, docker’ın bazı avantajları ele alındığında bu avantajların kritik olduğunu söyleyebiliriz. Bu avantajlar:

  • Sistemlerin daha hızlı ölçeklendirilebilmesi,
  • Yazılım dağıtımının kapsayıcılar sayesinde daha verimli olması, 
  • Daha az kaynakta birden çok iş yükü çalıştırması, 
  • Geliştirme ve dağıtım döngüleri arasında tutarlılığı sağlamak için ortamları standart hale getirmesi,
  • Sanal makinelerden daha uygun maliyetli olmasıdır.

Docker ve sanal makineler arasındaki farkları inceledik. Şimdi de docker ile ilgili karşılaşabileceğiniz bazı bileşenlere değinelim. Bu bileşenlerin temel çalışma mantıklarını bilmeniz docker’ı etkin bir şekilde kullanabilmeniz açısından çok önemli bir yere sahip. Haydi, bu bileşenlere biraz yakından bakalım.

 

Docker görüntüleri (Docker images) ve kapsayıcı (container): Docker ile ilgili karşılaşacağınız en önemli iki kavramdan bir tanesi Docker görüntüleri ve kapsayıcılardır. Docker görüntüleri, kapsayıcı oluşturmak için kullanılan salt okunur şablonlardır. Docker görüntüleri, çalışacak olan kaynak kodun yanı sıra kodunuzun gerek duyduğu kitaplıklar ve bağımlılıklar ile ilgili tüm tanımları barındıran dosyalardır. Bir görüntü oluşturulduktan sonra bu görüntüden birden fazla kapsayıcı oluşturabilirsiniz. Bunu nesneye yönelik programlamada sınıf ve nesne kavramı olarak düşünebilirsiniz. Bir sınıf yaratıldıktan sonra o sınıftan birden fazla nesne oluşturulabilir. Bu görüntüler, özel yönergeler içeren bir docker dosyasından oluşturulmaktadır. 

Kapsayıcının daha iyi anlaşılabilmesi için bir yazılım geliştirme sürecinin kapsayıcı kullanmadan ve kapsayıcı kullanarak nasıl olduğunun anlaşılması gerekmektedir. Bir şirkette ekibinizle birlikte bir uygulama üzerinde çalıştığınızı, siz ve ekibinizde geliştiricilerin birçok servisi kendi işletim sisteminize indirmeniz, yapılandırmanız ve çalıştırmanız gerektiğini düşünün. Bu indirme, yapılandırma ve çalıştırma süreci de kullanılan işletim sistemine göre farklılık gösterecektir. Her bir servisin indirme ve yükleme sürecinde hatalarla karşılaşmanız da olasıdır. Bu da çok sayıda servisi yüklemeniz gerektiğinde yorucu olabilmektedir. Kapsayıcılar tam da bu aşamada devreye girer ve bunun gibi karşılaşılabilecek sorunları çözmek için kurtarıcı olur. Kapsayıcılar ile herhangi bir servisi direkt kendi işletim sisteminize indirmenize ve yapılandırmanıza gerek kalmaz. Böylece yükleme aşamasında karşılaşılabilecek olası sorunlardan da kurtulmuş oluruz. Kapsayıcılar, ihtiyacınız olan her şeyi izole edilmiş paket halinde size sunmuş olur. Yapmanız gereken şey ise sadece kapsayıcıyı tek bir komutla indirmek olur. İşletim sistemi fark etmeksizin bu işlem sorunsuz bir şekilde gerçekleşir.

 

Docker dosyası (Docker file): Docker dosyası, bir Docker görüntüsü oluşturmak için var olan tüm katmanların açıklandığı, bir dizi yönergeden oluşan ve uzantısı olmayan dosyadır. Docker dosyasında, hangi Docker görüntüsünün kullanılacağı, hangi dosyaları içereceği ve hangi uygulama için hangi parametrelerin kullanılacağı bilgisi mevcuttur. Docker dosyasında bulunan komutlar, Docker tarafından sırasıyla tek tek çalıştırılır.  Docker dosyanızda belirttiğiniz her komut (run, copy, add vb.) yeni bir katman oluşturur. Her katman kendi içinde tam bir görüntüdür ve temel aldığı görüntüye (önceki katman) kıyasla değişiklikleri depolar. Bazı komutlar ise ara katmanlar oluşturur ve görüntünüzün boyutunu etkilemez. Docker dosyası oluşturulduktan sonra build komutu ile docker görüntüsü oluşturulur. Aynı görüntü ile birçok docker kapsayıcısını çalıştırabilirsiniz.

Docker run komutu ile docker görüntüsünü çalıştırabilirsiniz. Bir görüntüyü çalıştırdığınızda öncelikle docker sunucusuna bağlanılır ve o görüntünün lokal görüntü deposunda olup olmadığı kontrol edilir. Eğer o görüntü yoksa docker hub’a bağlanılır ve oradan görüntü indirilerek lokal görüntülerin olduğu yere eklenir.  

Docker hub: Docker hub, bulut tabanlı kapsayıcı görüntüleri deposudur. Geliştiriciler kapsayıcı görüntülerini docker hub’dan alabilir ve docker hub’a yükleyebilir. Docker hub’da görüntüler iki şekilde tutulabilir: Genel (herkese açık) ve özel. Genel depolara herkes erişebilir, ancak özel depolara yalnızca ilgili depo sahipleri erişebilir. Ayrıca, belirli sayıdan fazla özel depo istenmesi durumunda ek bir ücret ödemeniz gerekebilir. Docker hub ile çalışma grupları oluşturabilir ve depoları yalnızca kuruluşunuzda kullanılabilen özel bir depo olarak kullanabilirsiniz. Siz de Docker hub’ın resmi sitesinden istediğiniz bir kapsayıcıyı arayabilirsiniz.

 

Docker engine: Docker platformunun kalbidir. Windows veya linux sistem üzerine kurulan istemci/sunucu uygulaması olarak çalışan docker Engine 3 temel bileşenden oluşur:

  • Docker engine’nin temelini oluşturan görüntüler, kapsayıcılar, networkler ve volume’ler gibi docker objelerinin oluşturulmasından ve yönetilmesinden sorumlu olan Sunucu (Server- daemon),
  • Programlar ve docker daemon arasında iletişim kuran ve docker’a ne yapması gerektiğini söyleyen REST API,
  • Docker komutlarını çalıştırmak için komut satırı arabirimi (CLI).

 

Docker
 

Docker volumes: Kapsayıcılar herhangi bir durum bilgisi tutmadan yani stateless olarak çalışırlar ve kapsayıcı bir kez silinince içindeki her şey kaybolur. Tabii ki bir kapsayıcıyı uzun süre start/stop şeklinde verilerinizi kaybetmeden kullanmak mümkündür. Ancak bu, docker için etkin bir kullanım değildir. Kapsayıcıdan bağımsız bir şekilde yönetilmesi gereken verileriniz olabilir. Örnek olarak; uygulamanın konfigürasyon dosyaları, ürettiği log dosyaları ve sürekliliği olan veriler  verilebilir. Docker volumes, kapsayıcı bağımsız olarak çalışan, tamamen Docker tarafından yönetilen ve kalıcı veriler için tercih edilen yardımcı bir mekanizmadır. Ana bilgisayarda tutulmaları nedeniyle kapsayıcı yaşam döngüsünden bağımsızdırlar.  

Docker volumes kullanmanın amacı, yedeklenebilmesi veya paylaşılabilmesi için verileri kapsayıcının dışında tutmaktır.  Ek olarak, docker volumes bir kapsayıcının yazılabilir katmanındaki kalıcı verilerden genellikle daha iyi bir seçimdir. Çünkü, bir docker volume onu kullanan kapsayıcıların boyutunu artırmaz ve docker volume’un içeriği belirli bir kapsayıcının yaşam döngüsünün dışında bulunur.

Docker compose: Compose, çok kapsayıcı docker uygulamalarını tanımlamak ve çalıştırmak için kullanılan bir araçtır. Compose aracıyla uygulamanızın hizmetlerini yapılandırmak için bir YAML dosyası kullanılır. Ardından, tek bir komutla tüm hizmetler oluşturulur ve başlatılır.  Birden fazla kapsayıcı tanımı docker compose ile tek bir dosyada yapılabilir ve tek bir komutla uygulama çalıştırılabilir. Docker compose ile birden fazla çalıştırdığınız kapsayıcılardan bazılarının birbirine bağımlı kalmasını sağlayabilirsiniz.

Bu yazımızda docker komutları kullanarak kapsayıcı çalıştırma, durdurma ve silme işlemlerine değinmedik. Amacımız, docker teknolojisine giriş yapmak ve docker hakkında genel bir fikir vermekti. Bu kapsamda docker nedir, sanal makinelerle arasında bir fark var mıdır, neden docker bizim için daha avantajlı sorularını yanıtladık ve docker dünyasında karşılaşabileceğiniz kavramlara yer vererek docker ve kapsayıcı (container) teknolojisi hakkında bilmeniz gereken temel bilgilere değinmeye çalıştık. Docker oldukça büyük bir dünya ve bu teknolojiyi iyi ve etkin bir şekilde kullanmak için docker’ın temel mantığının iyi bilinmesi gerekmekte. Siz de docker dünyasına giriş yapmak ve kendinizi bu alanda geliştirmek istiyorsanız Miuul’un Production Level Data Science programını incelemelisiniz. 

 

 

Kaynaklar:

Miuul topluluğunun bir parçası ol!

Abone ol butonuna tıklayarak Miuul'dan pazarlama ve haber içerikleri almayı onaylıyorum.