Docker’a Giriş: Başlangıç Rehberi
Merhabalar, bu yazımda Docker’ı yeni öğrenenler için temel bilgileri paylaştım; Docker’ın ne olduğu, hangi amaçlarla kullanıldığı gibi konuları ele aldım. Umarım bu bilgiler sizin için faydalı olur. Keyifli okumalar :)
Günümüzde hızla değişen teknoloji, yazılım geliştirme süreçleri giderek karmaşık hale gelmektedir. Yazılım uygulamalarının farklı ortamlarda tutarlı bir şekilde çalıştırılması ve dağıtılması gerekliliği, geliştiricileri yeni çözümler aramaya yöneltmiştir. Bu nokta da Docker gibi devrim niteliğinde bir teknoloji bizleri karşılamaktadır.
Tarihçesine bakacak olursak, 2013 yılında Solomon Hykes tarafından oluşturulan açık kaynkalı bir konteynerizasyon platformudur.
Konteynerizasyon da ne?
Kısaca analtmak gerekirse; bir bilgisayar programının çalıştırılması için gerekli olan tüm yazılım, kütüphane ve bağımlılıkları bir araya getirerek izole bir ortamın çalışmasını sağlayan bir teknolojidir.
Bu teknoloji sayesinde, bir yazılım uygulaması ve tüm bağımlılıkları, bir container(konteyner) olarak adlandırılan taşınabilir bir paket içerisinde toplanır.
Her container, kendi izole ortamına sahiptir ve diğer container’lardan ve ana işletim sisteminden izole olarak çalışır.
Şimdi Docker’ın yaratıcısı Solomon Hykes’in hikayesinden devam edelim.
Docker’ın hikayesi Solomon’un kendi deneyimleri ve yazılım geliştirme süreçlerinde karşılaştığı zorluklarla başlamıştır.
Solomon, yazılım projelerini farklı ortamlarda çalıştırmanın ve dağıtmanın ne kadar zor olduğunu farkındaydı. Her bir ortamda farklı kurulum gereksinimleri ve yapılandırmalarla uğraşmak, zaman alıcı ve hata eğilimli bir süreçti.
Solomon, bu sorunları çözmek için Docker’ı oluşturmaya karar verdi. Docker, yazılım uygulamalarını container adı verilen izole ortamlarda çalıştıran bir teknoloji olarak doğdu.
Container’lar, uygulamaların tüm bağımlılıklarını (kod, çalışma zamanı, kütüphaneler vb.) bir araya getirerek, bir sunucudan diğerine sorunsuzca taşınmasını sağlar.
Avantajlarını inceleyecek olursak;
✱ Container’lar, sanal makinelerden daha az kaynak tüketir. Aynı fiziksel sunucu üzerinde daha fazla container çalıştırabilirsiniz, bu da donanım kaynaklarını daha verimli kullanmanızı sağlar.
✱ Bir işletim sistemi ve donanım bağımsız olarak çalışır. Bu, uygulamaların herhangi bir ortamda tutarlı bir şekilde çalıştırılabilmesini sağlar.
✱ Uygulamaların dağıtımı ve ölçeklendirilmesi daha hızlı ve verimlidir.
✱ Mikroservis mimarisine uygun bir şekilde kullanılabilir. Her bir servis, kendi konteynerinde çalışır ve bağımsız olarak ölçeklenebilir.
Peki, sanal makineler varken Docker’ı neden tercih etmeliyiz?
Aşağıdaki basit karşılaştırma bile, Docker’ın neden tercih edilmesi gerektiğini anlamamız için yeterli olabilir.
Docker vs Virtual Machine (Sanal Makine)
İşletim Sistemi:
- Docker: Docker konteynerleri, ana bilgisayarın işletim sistemini paylaşır ve herhangi bir işletim sisteminde bir uygulamayı çalıştırmak için kullanılan yazılım paketleridir.
- Sanal Makine: Sanal makineler, kendi işletim sistemlerini ve bağımsız çekirdeklerini çalıştırır.
Verim:
- Docker: Docker konteynerleri, ana bilgisayarın işletim sistemini paylaştıkları için daha az kaynak tüketirler. Bu nedenle, daha hafif ve daha yüksek performanslıdırlar.
- Sanal Makine: Sanal makineler, kendi işletim sistemlerini çalıştırdıkları için daha fazla kaynağa ihtiyaç duyarlar ve daha fazla bellek ve işlemci gücü kullanırlar. Bu da daha yavaş performans ve daha fazla kaynak tüketimi anlamına gelir.
Hız:
- Docker: Docker konteynerleri, uygulamaları hızlı bir şekilde başlatır ve çalıştırır. Konteynerler, sadece uygulamaların çalışması için gereken minimum işleri yaparlar.
- Sanal Makine: Sanal makineler, tam bir işletim sistemi başlatmak zorunda oldukları için daha uzun süre alır ve daha fazla önyükleme süresine ihtiyaç duyarlar.
Docker File
Docker konteynerlerinin nasıl oluşturulacağını tanımlayan bir metin dosyasıdır.
Bu dosya, bir Docker image’inin nasıl inşa edileceğini adım adım belirtir. Dockerfile, temelde bir dizi talimat içerir ve bu talimatlar Docker Daemon tarafından yorumlanır ve uygulanır. Dockerfile, Docker image’inin katmanlarını oluştururken kullanılır.
Şu bileşenleri içerir:
- Base Image: Docker image’inin temelini oluşturan bir başlangıç imajı belirtilir. Örneğin, bir Ubuntu veya Alpine gibi bir işletim sistemi imajı olabilir.
- Komutlar ve Talimatlar: Image’in oluşturulması için gerekli olan adımlar ve komutlar belirtilir. Bu adımlar, paketlerin yüklenmesi, dosyaların kopyalanması, bağımlılıkların kurulması gibi işlemleri içerebilir.
- Çalıştırılacak Komutlar: Docker image çalıştırıldığında çalışacak komutlar belirtilir. Örneğin, bir web sunucusunu başlatmak veya bir uygulamayı çalıştırmak gibi.
Docker Daemon ne pekii?
Docker’ın arka planda çalışan ana bileşenidir. Bilgisayarınızda Docker çalıştığında, Docker Daemon sürekli olarak çalışır. Docker Daemon,diğer adıyla Docker Engine olarak da bilinir. Docker konteynerlerinin oluşturulması, yönetilmesi ve çalıştırılmasından sorumludur. Kullanıcı Docker komutlarını verdiğinde, bu komutlar Docker Daemon’a iletilir ve Daemon bu komutları işler.
Yani Docker Daemon, Docker’ın motoru gibidir ve konteynerlerin yönetiminden sorumludur.
Docker Image
Docker image, bir uygulamanın ve tüm bağımlılıklarının paketlenmiş halidir.
Docker image’leri, bir Dockerfile kullanılarak oluşturulur ve içerdikleri tüm dosyaları, bağımlılıkları ve yapılandırmaları barındırır. Bu image’ler Docker Hub gibi merkezi depolarda saklanabilir ve paylaşılabilir.
Docker image’leri genellikle katmanlı bir yapıya sahiptir. Her bir katman, Dockerfile’da belirtilen talimatların uygulanması sırasında oluşur. Bu katmanlar, bir önceki katmanın değiştiği durumları temsil eder. Bu yapı, image’lerin hızlı bir şekilde oluşturulmasını, depolanmasını ve paylaşılmasını sağlar.
Docker image’leri, bir uygulamanın taşınabilir bir şekilde dağıtılmasını ve çalıştırılmasını sağlar. Bir Docker image’i, Docker konteynerlerinin temelini oluşturur. Dolayısıyla, Dockerfile’da belirtilen talimatlarla bir image oluşturulur ve bu image daha sonra Docker konteyneri olarak çalıştırılabilir.
Docker Hub :
Docker tarafından sağlanan bulut tabanlı bir hizmettir ve Docker konteynerleri, Docker image’leri ve uygulama bileşenlerini depolamak, paylaşmak ve yönetmek için kullanılır.
Docker Registry :
Docker image’lerinin depolandığı ve yönetildiği bir depo veya sunucu sistemidir.
Yazılım geliştiricilerin ve sistem yöneticilerin ihtiyaç duydukları Docker image’lerini bulmalarını, indirmelerini ve kullanmalarını sağlayan önemli bir kaynaktır. Bu, yazılım geliştirme süreçlerini kolaylaştırır ve Docker ekosistemini daha erişilebilir hale getirir. GitHub gibi yani.
Docker CLI :
Docker CLI (Command Line Interface), Docker’ın komut satırı arayüzüdür.
Kullanıcının Docker Engine ile konuşmasını sağlar.
Kullanıcılar, docker push
komutuyla bir Docker image'ini bir Registry'e yükler ve docker pull
komutuyla bir image'i bir Registry'den indirirler.
Docker Network
Docker konteynerleri arasında iletişim sağlar ve dış dünya ile bağlantı kurar.
Network türlerinden kısaca bahsedecek olursak eğer;
Bridge Network (Bridge Ağı):
- Bridge ağı, Docker’ın varsayılan ağ modudur ve aksi belirtilmediği sürece kullanılır.
- Bir bridge ağı oluşturulduğunda, Docker hostu üzerinde sanal bir ethernet bridge oluşturulur.
- Her bir Docker konteyneri, bu bridge ağına bağlanarak birbirleriyle ve host makineyle iletişim kurabilir.
- Bridge ağında her konteyner için bir IP adresi atanır ve konteynerler birbirleriyle bu IP adresleri üzerinden iletişim kurarlar.
Host Network (Ana Makine Ağı):
- Host ağı, Docker konteynerlerinin host makinenin ağına doğrudan bağlanmasını sağlar.
- Konteynerler host ağı üzerinden çalıştırıldığında, host makinenin ağ ayarları doğrudan konteynerlere uygulanır.
- Bu durumda, konteynerler host makinenin IP adreslerini kullanarak dış dünya ile iletişim kurabilirler.
- Bu ağ modu, yüksek performans gerektiren uygulamalar için uygundur, ancak izolasyon seviyesi daha düşüktür.
Overlay Network (Üstüne Yayılma Ağı):
- Birden fazla Docker ana bilgisayarı arasında konteynerler arasında iletişim sağlamak için kullanılan ağ türüdür.
- Overlay ağları, Docker Swarm gibi konteyner orkestrasyon araçları ile birlikte kullanıldığında, dağıtık uygulamaların farklı ana bilgisayarlar üzerinde çalışan konteynerler arasında iletişim kurmasını sağlar.
- VXLAN (Virtual eXtensible Local Area Network) gibi sanal ağ teknolojilerini kullanarak çalışır. VXLAN, farklı ana bilgisayarlar arasında sanal bir ağ oluşturarak konteynerlerin iletişimini sağlar.
None Network (Hiç Ağı):
- None ağı, Docker konteynerlerinin herhangi bir ağa bağlanmadığı tamamen izole bir ağ ortamı sağlar.
- Bu ağ türünde, konteynerlere herhangi bir ağ arabirimi atanmaz ve dış ağlara erişim sağlanmaz.
- Konteynerler yalnızca kendi içerisinde çalışabilir ve dış dünya ile iletişim kuramazlar.
- Bu ağ türü, güvenlik gereksinimleri olan veya ağ erişiminin gerekli olmadığı durumlar için uygundur.
Network Driver’ları
Docker’ın farklı ağ bağlantılarını desteklemek için birden fazla network driver’ı bulunmaktadır. Bu driver’lar, Docker’ın farklı ağ modları ve gereksinimleri için özelleştirilmiştir. Örnek olarak:
- Bridge Driver: Bridge ağı için kullanılır ve Docker’ın varsayılan ağ modudur.
- Host Driver: Host ağı için kullanılır ve konteynerlerin host makine ağına doğrudan bağlanmasını sağlar.
- Overlay Driver: Overlay ağı için kullanılır ve Docker Swarm gibi dağıtık uygulamaların iletişimini sağlar.
- None Driver: None ağı için kullanılır ve tamamen izole bir ağ ortamı sağlar.
Container Network (Konteyner Ağı)
Konteyner ağı, Docker konteynerlerinin ağ bağlantılarını ifade eder. Her bir Docker konteyneri, ait olduğu ağa ve diğer konteynerlere bağlanabilir.
Konteyner ağı, Docker ağ modları ve network driver’ları tarafından belirlenir ve Docker konteynerlerinin iletişimini yönetir.
Docker networking yapısı, konteyner tabanlı uygulamaların iletişimini sağlamak için esnek ve güçlü bir çözüm sunar. Farklı network driver’ları ve ağ modları, farklı kullanım senaryolarına uygun olarak seçilebilir ve yapılandırılabilir. Bu, Docker’ın dağıtık uygulamaların oluşturulması ve yönetilmesi için ideal bir platform olmasını sağlar.
Docker Volume
Docker konteynerlerinde veri depolamak için kullanılan bir yapıdır.
Docker konteynerleri, çalışma zamanlarında geçici bir dosya sistemine sahiptir. Bu geçici dosya sistemleri, konteynerlerin durdurulup yeniden başlatılmasıyla veya farklı bir ana bilgisayara taşınmasıyla silinebilir veya kaybolabilir. Bu nedenle, kalıcı veri depolamak gerektiğinde Docker Volume kullanılır.
Docker Volume, Docker konteynerlerine kalıcı ve paylaşılabilir veri depolama alanı sağlar.
Bu yazımda Docker ile ilgili temel bilgileri paylaşmayı amaçladım. Umarım açıklayıcı olmuştur. İlerleyen süreçlerde Docker’ı daha detaylı incelediğim yazımı paylaşmayı hedefliyorum.