- Konu sahibi
- #1
Docker, uygulamaları ve ihtiyaç duydukları bağımlılıkları bir container içinde paketleyip farklı ortamlarda tutarlı biçimde çalıştırmayı sağlayan bir platformdur. Container; uygulamanın kodunu, kütüphanelerini ve çalışma ayarlarını taşır ancak işletim sistemi çekirdeğini sanal makine gibi tamamen kopyalamaz. Bu nedenle genellikle sanal makinelere göre daha hızlı başlar ve daha az kaynak tüketir.
Docker kullanımında birbirinden farklı dört kavramı ayırmak gerekir:
Örneğin bir web uygulaması için sunucuda ayrıca belirli bir işletim sistemi paketi, çalışma zamanı ve kütüphane kurmak yerine bunları bir image içinde tanımlayabilirsiniz. Aynı image geliştirici bilgisayarında, test sunucusunda ve üretim sunucusunda kullanıldığında ortam farklarından kaynaklanan sorunlar azalır. Ancak Docker uygulamanın hatalarını kendiliğinden düzeltmez; yanlış yapılandırılmış veya güvenlik açığı bulunan bir uygulama container içinde de sorunlu kalır.
Docker container'ı, tam bir sanal bilgisayar olarak düşünmemek gerekir. Sanal makine kendi işletim sistemi çekirdeğini ve genellikle daha geniş bir sistem katmanını çalıştırır. Linux container ise üzerinde çalıştığı Linux çekirdeğini paylaşarak süreçleri izole eder. macOS ve Windows masaüstünde Linux container çalıştırılırken arada bir Linux sanallaştırma katmanı bulunabilir; doğrudan macOS çekirdeğini paylaştığı düşünülmemelidir. Bu, başlatma ve kaynak kullanımı açısından avantaj sağlayabilir; karşılığında container'lar arasında güçlü bir sanal donanım sınırı varmış gibi davranılmamalıdır.
Aşağıdaki ayrım hangi yaklaşımın uygun olduğunu anlamayı kolaylaştırır:
Docker, veritabanı gibi kalıcı verisi olan servislerde tek başına yedekleme sistemi değildir. Container silindiğinde container'ın kendi yazılabilir katmanındaki veriler kaybolabilir. Kalıcı veriler için volume veya ana makinede uygun bir bağlama kullanılması ve ayrıca düzenli yedek alınması gerekir.
Ön koşul olarak Docker Engine'in kurulu ve çalışan bir makineye, ayrıca komut satırında Docker komutunu çalıştırma yetkisine sahip bir kullanıcıya ihtiyaç vardır. Kurulum yolu işletim sistemine göre değiştiği için burada yalnızca kurulum sonrası doğrulama gösterilmektedir.
Komut başarısız olursa hata metninin anlamına göre ilerleyin. Docker daemon'a bağlanılamadığı belirtiliyorsa Docker Engine çalışmıyor olabilir. Yetki hatası varsa kullanıcı hesabının Docker komutlarını çalıştırma yetkisi veya yönetici yetkisi kontrol edilmelidir. Image indirilemiyorsa ağ erişimi, registry adresi veya image adının doğruluğu incelenmelidir. Bu testin başarılı olması yalnızca Docker çalışma katmanının temel olarak çalıştığını gösterir; uygulamanızın doğru yapılandırıldığını veya üretime hazır olduğunu kanıtlamaz.
Docker nasıl çalışır?
Docker kullanımında birbirinden farklı dört kavramı ayırmak gerekir:
- Image: Uygulamanın çalışması için gereken dosyaları ve başlangıç ayarlarını içeren, değiştirilemeyen şablondur.
- Container: Bir image çalıştırıldığında oluşan izole çalışma örneğidir. Aynı image'dan birden fazla container başlatılabilir.
- Docker Engine: Image indirme, container oluşturma, başlatma ve durdurma işlerini yapan çalışma katmanıdır.
- Registry: Image'ların saklandığı depodur. Genel veya kuruma özel olabilir.
Örneğin bir web uygulaması için sunucuda ayrıca belirli bir işletim sistemi paketi, çalışma zamanı ve kütüphane kurmak yerine bunları bir image içinde tanımlayabilirsiniz. Aynı image geliştirici bilgisayarında, test sunucusunda ve üretim sunucusunda kullanıldığında ortam farklarından kaynaklanan sorunlar azalır. Ancak Docker uygulamanın hatalarını kendiliğinden düzeltmez; yanlış yapılandırılmış veya güvenlik açığı bulunan bir uygulama container içinde de sorunlu kalır.
Sanal makineden farkı
Docker container'ı, tam bir sanal bilgisayar olarak düşünmemek gerekir. Sanal makine kendi işletim sistemi çekirdeğini ve genellikle daha geniş bir sistem katmanını çalıştırır. Linux container ise üzerinde çalıştığı Linux çekirdeğini paylaşarak süreçleri izole eder. macOS ve Windows masaüstünde Linux container çalıştırılırken arada bir Linux sanallaştırma katmanı bulunabilir; doğrudan macOS çekirdeğini paylaştığı düşünülmemelidir. Bu, başlatma ve kaynak kullanımı açısından avantaj sağlayabilir; karşılığında container'lar arasında güçlü bir sanal donanım sınırı varmış gibi davranılmamalıdır.
Aşağıdaki ayrım hangi yaklaşımın uygun olduğunu anlamayı kolaylaştırır:
| İhtiyaç | Daha uygun yaklaşım | Gerekçe |
|---|---|---|
| Tek bir uygulama ve bağımlılıklarını taşımak | Docker container | Tekrarlanabilir ve hızlı dağıtım |
| Farklı işletim sistemi çekirdeklerini çalıştırmak | Sanal makine | Daha kapsamlı işletim sistemi izolasyonu |
| Bir servisin birden çok kopyasını çalıştırmak | Docker veya orkestrasyon aracı | Image üzerinden çoğaltma yapılabilir |
Docker, veritabanı gibi kalıcı verisi olan servislerde tek başına yedekleme sistemi değildir. Container silindiğinde container'ın kendi yazılabilir katmanındaki veriler kaybolabilir. Kalıcı veriler için volume veya ana makinede uygun bir bağlama kullanılması ve ayrıca düzenli yedek alınması gerekir.
Çalışan bir container ile temel deneme
Ön koşul olarak Docker Engine'in kurulu ve çalışan bir makineye, ayrıca komut satırında Docker komutunu çalıştırma yetkisine sahip bir kullanıcıya ihtiyaç vardır. Kurulum yolu işletim sistemine göre değiştiği için burada yalnızca kurulum sonrası doğrulama gösterilmektedir.
- Komut satırında aşağıdaki image'ı çalıştırın:
docker run --rm hello-world - Çıktıda Docker kurulumunun başarıyla çalıştığını belirten karşılama metnini arayın. Bu komut image yerelde yoksa onu registry'den alır, geçici bir container başlatır ve işlem bitince
--rmsayesinde container'ı siler. - Komut başarılıysa sonraki adım olarak uygulamanız için bir Dockerfile hazırlayın; image'ı oluşturun, yapılandırma ve kalıcı veri gereksinimlerini ayrıca tanımlayın.
Komut başarısız olursa hata metninin anlamına göre ilerleyin. Docker daemon'a bağlanılamadığı belirtiliyorsa Docker Engine çalışmıyor olabilir. Yetki hatası varsa kullanıcı hesabının Docker komutlarını çalıştırma yetkisi veya yönetici yetkisi kontrol edilmelidir. Image indirilemiyorsa ağ erişimi, registry adresi veya image adının doğruluğu incelenmelidir. Bu testin başarılı olması yalnızca Docker çalışma katmanının temel olarak çalıştığını gösterir; uygulamanızın doğru yapılandırıldığını veya üretime hazır olduğunu kanıtlamaz.