ENBirlikte üretelim
← Argo Ajans

Kurumsal Yazılım

Docker Nedir? Konteyner Teknolojisi ve Kullanım Alanları

Mehmet Said Göksu ·

Docker Nedir? Konteyner Teknolojisi ve Kullanım Alanları

Kısa yanıt

Docker nedir sorusunun kısa cevabı şudur: Docker, bir uygulamayı kodu, bağımlılıkları ve çalışma ayarlarıyla birlikte “konteyner” denen izole, taşınabilir bir birimde paketleyen açık kaynaklı bir platformdur. Bir uygulama geliştiricinin bilgisayarında nasıl çalışıyorsa test sunucusunda ve üretim ortamında da aynı şekilde çalışır.

“benim makinemde çalışıyordu” sorununun büyük kısmı bu yüzden ortadan kalkar. Docker’ı sanal makineden ayıran temel nokta, konteynerlerin ayrı bir işletim sistemi çekirdeği taşımamasıdır; ana makinenin çekirdeğini paylaşırlar ve bu yüzden saniyeler içinde başlar, çok daha az bellek ve disk tüketirler.

Docker nedir?

Docker, 2013 yılında açık kaynaklı bir proje olarak ortaya çıktı ve kısa sürede yazılım geliştirme dünyasında konteyner teknolojisinin fiili standardı haline geldi. Temel fikir basit: bir uygulamayı çalıştırmak için gereken her şeyi (kod, çalışma zamanı, sistem araçları, kütüphaneler, yapılandırma dosyaları) tek bir pakette toplamak ve bu paketi hangi makinede çalıştırılırsa çalıştırılsın aynı sonucu verecek şekilde izole etmek. Docker’ın kendi kaynak sayfasına göre bir konteyner, “kodu ve tüm bağımlılıklarını, uygulamanın bir bilgi işlem ortamından diğerine hızlı ve güvenilir bir şekilde çalışmasını sağlayacak şekilde paketleyen standart bir yazılım birimidir.” Bu tanım, Docker’ın çözdüğü asıl sorunu özetler: ortam farklılıklarından kaynaklanan uyumsuzluk.

Geliştirme ekiplerinin klasik problemi şudur: bir uygulama geliştiricinin kendi bilgisayarında belirli bir işletim sistemi sürümü, belirli bir kütüphane sürümü ve belirli bir yapılandırmayla çalışır. Aynı uygulama test sunucusuna veya üretim sunucusuna taşındığında bu detaylardan biri bile farklıysa beklenmedik hatalar ortaya çıkabilir. Docker, uygulamayı bu ortam detaylarından bağımsızlaştırarak konteynerin içinde çalışan her şeyin, konteynerin çalıştığı makineden habersiz kalmasını sağlar.

Konteyner ile sanal makine arasındaki fark nedir?

Docker’ı anlamanın en pratik yolu, onu sanal makineyle (VM) karşılaştırmaktır. Bir sanal makine, fiziksel bir sunucu üzerinde tam bir işletim sistemini, kendi çekirdeğiyle birlikte, taklit eder; bu yüzden her VM gigabaytlarca disk alanı kaplar ve başlaması dakikalar sürebilir. Docker konteynerleri farklı çalışır: ayrı bir işletim sistemi çekirdeği taşımazlar, ana makinenin (host) çekirdeğini paylaşırlar ve sadece uygulama katmanını, dosya sistemini ve süreç alanını izole ederler.

Bu yüzden bir konteyner tipik olarak megabaytlarla ölçülür, saniyeler içinde başlar ve aynı donanımda VM’lere göre çok daha fazla sayıda çalıştırılabilir. Güvenlik izolasyonu VM’ler kadar katı olmasa da, pratikteki çoğu geliştirme ve dağıtım senaryosu için bu fark günlük işleyişi etkilemez.

Docker’ın temel bileşenleri: image, container, Dockerfile

Docker’ın çalışma mantığını oturtmak için üç kavramı birbirinden ayırmak gerekir. Dockerfile, bir image’in nasıl oluşturulacağını adım adım tanımlayan düz metin dosyasıdır; hangi temel sistemin kullanılacağı, hangi dosyaların kopyalanacağı ve hangi komutların çalıştırılacağı burada satır satır belirtilir. Image (imaj), Dockerfile derlendiğinde ortaya çıkan, çalıştırılmaya hazır ve değişmez (immutable) pakettir; kod, çalışma zamanı ve bağımlılıkların tamamını içerir. Container (konteyner) ise bir image çalıştırıldığında oluşan canlı örnektir; aynı image’den aynı anda birden fazla konteyner başlatılabilir ve her biri birbirinden bağımsız çalışır.

Bu üçü arasındaki sıralama nettir: önce Dockerfile yazılır, sonra ondan bir image derlenir, en son da o image’den bir container başlatılır. Hazır image’leri paylaşmak için kullanılan merkezi depo Docker Hub’dır; bir ekip kendi image’ini buraya yükleyebilir veya topluluğun hazırladığı resmî image’leri, örneğin bir veritabanı veya programlama dili çalışma zamanı, doğrudan indirip kullanabilir.

Docker nasıl çalışır?

Günlük kullanımda süreç genellikle aynı sırayı izler. Önce proje klasörüne bir Dockerfile eklenir ve uygulamanın ihtiyaç duyduğu temel image, dosyalar ve başlangıç komutu tanımlanır. Ardından docker build komutuyla bu Dockerfile’dan bir image derlenir. Derleme bittiğinde docker run komutuyla image’den bir konteyner başlatılır ve uygulama artık izole bir ortamda çalışmaktadır. Konteyner istendiğinde durdurulabilir, yeniden başlatılabilir veya tamamen silinip aynı image’den sıfırdan yeniden oluşturulabilir; image bozulmadığı sürece sonuç her çalıştırmada aynıdır.

Arka planda bu işi yürüten bileşen Docker Engine’dir; image’leri derleyen, konteynerleri başlatan ve bunların ağ, depolama ve kaynak erişimini yöneten çalışma zamanı katmanıdır.

Docker hangi sorunları çözer?

Docker’ın yaygınlaşmasının arkasında birkaç somut kazanım vardır. Ortam tutarlılığı en belirgin olanıdır: uygulama geliştirici makinesinde, test sunucusunda ve üretimde aynı konteyner image’inden çalıştığı için “bende çalışıyordu” türü sorunlar büyük ölçüde azalır. Taşınabilirlik ikinci kazançtır; bir image, farklı bulut sağlayıcıları veya sunucular arasında neredeyse hiç değişiklik yapmadan taşınabilir ve bu da sağlayıcı bağımlılığını azaltır. Hızlı ve tekrarlanabilir dağıtım üçüncü kazançtır; yeni bir sunucu ayağa kaldırmak, mevcut image’i yeniden çalıştırmaktan ibarettir, manuel kurulum adımlarının her sunucuda tekrarlanması gerekmez. Kaynak verimliliği de göz ardı edilmemelidir: aynı donanımda, sanal makinelere kıyasla belirgin şekilde daha fazla konteyner çalıştırılabilir, çünkü her biri ayrı bir işletim sistemi çekirdeği taşımaz.

Bu kazanımlar, özellikle birden fazla servisi (API, veritabanı, önbellekleme, arka plan işleri) aynı anda yöneten ekipler için anlamlı hale gelir.

Docker Compose nedir, ne zaman gerekir?

Gerçek uygulamalar nadiren tek bir konteynerden ibarettir; genellikle bir web sunucusu, bir veritabanı ve belki bir önbellekleme servisi birlikte çalışır. Her birini tek tek docker run komutuyla başlatmak hem uzun hem hata yapmaya açık bir süreçtir. Docker Compose, bu konteynerlerin tamamını docker-compose.yml adlı tek bir dosyada tanımlamaya ve docker compose up komutuyla hepsini birlikte başlatmaya izin verir. Hangi konteynerin hangi portu kullanacağı, hangi ortam değişkenlerini alacağı ve hangi konteynerlerin birbirine bağımlı olduğu bu dosyada tek seferde tanımlanır. Bir proje birden fazla servisten oluştuğu anda Docker Compose’u devreye almak, günlük geliştirme hızını doğrudan etkiler.

Hangi ekipler Docker’dan gerçekten fayda görür?

Docker her projede zorunlu bir araç değildir. Tek bir statik site veya tek bir basit uygulamayı tek bir sunucuda çalıştıran bir ekip için Docker’ın öğrenme eğrisi, sağladığı faydadan daha ağır basabilir. Buna karşılık şu durumlardan biri geçerliyse Docker’ı değerlendirmek anlamlı olur: birden fazla servisi aynı anda geliştiriyor ve test ediyorsanız, farklı geliştiricilerin makinelerinde “aynı kod farklı davranıyor” sorunuyla sık karşılaşıyorsanız, CI/CD hattında testlerin her zaman aynı ortamda çalıştığından emin olmanız gerekiyorsa veya ileride bulut sağlayıcısı değiştirme ihtimaliniz varsa. Bu senaryoların her biri, Docker’ın asıl çözdüğü “ortam tutarlılığı” problemine birebir denk gelir.

Sık yapılan hatalar

Docker’a yeni başlayan ekiplerde birkaç hata sık tekrarlanır. En yaygını, image boyutunu küçültmeye önem vermeden gereksiz dosyaları ve araçları image’e dahil etmektir; bu, dağıtımı yavaşlatır ve saldırı yüzeyini büyütür. İkinci sık hata, hassas bilgileri (parola, API anahtarı, SSH anahtarı) doğrudan Dockerfile’a veya image’e gömmektir; bu bilgiler image paylaşıldığı anda açığa çıkar, bu yüzden ortam değişkenleri veya özel sır yönetimi araçları kullanılmalıdır. Bir diğer hata, konteynerleri kalıcı veri depolamak için kullanmaktır; konteyner silindiğinde içindeki veri de kaybolur, bu yüzden veritabanı gibi kalıcı veri gerektiren servislerde Docker’ın “volume” (birim) mekanizması kullanılmalıdır. Son olarak, geliştirme ortamında çalışan bir image’i hiçbir değişiklik yapmadan doğrudan üretime taşımak da risklidir; üretim ortamı için ayrı, sadeleştirilmiş bir image hazırlamak hem güvenlik hem performans açısından daha sağlıklıdır.

Kontrol listesi

Docker’ı bir projeye dahil etmeden önce şu adımları sırayla değerlendirmek işe yarar; Dockerfile’ı da bu süreç boyunca mümkün olduğunca sade tutup sadece uygulamanın çalışması için gerekli dosyaları ve araçları eklemek faydalıdır.

  • Projenin gerçekten birden fazla servisten oluşup oluşmadığını ve ortam tutarlılığı sorunuyla karşılaşıp karşılaşmadığınızı belirleyin.
  • Parola, anahtar ve benzeri gizli bilgileri Dockerfile’a değil, ortam değişkenlerine veya bir sır yönetimi aracına taşıyın.
  • Kalıcı veri gerektiren servisler için Docker volume kullanın, veriyi konteynerin içine gömmeyin.
  • Birden fazla konteyner varsa bunları tek tek değil, Docker Compose ile tanımlayıp yönetin.

Sonraki adım

Docker nedir sorusunun özünde, uygulamaları ortamdan bağımsız, taşınabilir ve tekrarlanabilir şekilde çalıştırma ihtiyacı yatıyor. Tek bir sunucuda çalışan basit bir proje için zorunlu değil, ama birden fazla servisi yöneten veya dağıtım sürecini standartlaştırmak isteyen ekipler için kısa sürede karşılığını veren bir yatırım. Konteyner mantığını ekip kültürü ve otomasyon tarafıyla birlikte değerlendirmek isterseniz DevOps nedir rehberimize de bakabilirsiniz.

Sürüm kontrolü ve dağıtım alışkanlıklarınızı güçlendirmek isterseniz Git detached head durumu nasıl çözülür rehberimiz işinize yarayabilir. Ekibinizin altyapısını, konteynerleştirme stratejisini ve dağıtım hattını baştan tasarlamak için özel yazılım geliştirme hizmetimize göz atabilir ya da doğrudan bizimle iletişime geçebilirsiniz. Grup şirketimiz Web Tasarım Ofisi, web projelerinde sunucu altyapısı, dağıtım ve teknik bakım konularında destek sağlıyor.

İlgili rehberler

Sıkça sorulan sorular

Docker nedir, kısaca?

Docker, bir uygulamayı kodu, kütüphaneleri ve çalışma ayarlarıyla birlikte 'konteyner' denen izole bir birime paketleyen açık kaynaklı bir platformdur. Bu sayede uygulama, geliştiricinin bilgisayarında, test sunucusunda veya üretim ortamında aynı şekilde çalışır.

Docker ile sanal makine aynı şey midir?

Hayır. Sanal makine kendi işletim sistemi çekirdeğini taşır ve bu yüzden ağırdır; Docker konteynerleri ise ana makinenin çekirdeğini paylaşır, sadece uygulama katmanını izole eder. Bu fark, konteynerlerin neden saniyeler içinde başlayıp çok daha az kaynak tükettiğini açıklar.

Dockerfile ve Docker image arasındaki ilişki nedir?

Dockerfile, bir image’in nasıl oluşturulacağını adım adım tanımlayan metin dosyasıdır. Bu dosya derlendiğinde image ortaya çıkar; image çalıştırıldığında ise container oluşur. Yani sıralama Dockerfile → image → container şeklindedir.

Küçük bir ekip Docker kullanmalı mı?

Tek bir uygulama ve tek bir sunucuyla çalışan küçük bir ekip için Docker’ın getirisi sınırlı kalabilir, ama birden fazla servis çalıştırıyorsanız, farklı ortamlarda tutarlılık sorunu yaşıyorsanız veya bulut sağlayıcısı değiştirmeyi düşünüyorsanız Docker bu geçişi büyük ölçüde kolaylaştırır.

Docker Compose ne zaman gerekir?

Uygulamanız birden fazla konteynerden oluşuyorsa (örneğin bir web sunucusu, bir veritabanı ve bir önbellek servisi) bu konteynerleri tek tek komutla ayağa kaldırmak yerine Docker Compose ile tek bir yapılandırma dosyasından yönetmek hem daha hızlı hem daha az hata payı taşır.

Bu konuda yardım mı lazım?

Özel Yazılım

Hizmeti inceleyinHemen iletişime geçin
İyi işler, iyi bir konuşmayla başlar.

Birlikte
iz bırakalım.

İzmir ofis
Tariş Cd. (1497. Sok.) No. 5C Ofis P22
35230 Alsancak, İzmir, Türkiye
Birleşik Krallık ofis
167 Sheen Lane
SW14 8NA London, United Kingdom
Kayseri ofis
Sahabiye Mh. Buyurkan Sok. No.29
38015 Kocasinan, Kayseri, Türkiye
Projenizi bize anlatın