Docker nedir sorusunun en kısa cevabı şudur: uygulamanı, çalışması için gereken her şeyle (kod, kütüphaneler, çalışma zamanı, sistem araçları) birlikte tek bir taşınabilir pakete koyan bir araçtır. Bu paket bir container içinde çalışır ve senin makinende nasıl çalışıyorsa sunucuda, bir arkadaşının dizüstünde ya da bulut sağlayıcıda da aynı şekilde çalışır. "Bende çalışıyordu ama sunucuda çalışmadı" sorunu büyük ölçüde böylece ortadan kalkar.
Docker nedir, neden ortaya çıktı?
Bir uygulamayı kurmanın klasik yolu, sunucuya tek tek bağımlılık yüklemektir: doğru PHP sürümü, doğru Node.js sürümü, doğru kütüphaneler, doğru ortam değişkenleri. Bu süreç hem yavaştır hem de hataya açıktır. İki projenin farklı sürümlere ihtiyaç duyması işi iyice karıştırır.
Docker bu sorunu standartlaştırma ile çözer. Uygulamanı ve bağımlılıklarını bir imaj (image) içine paketlersin; sonra bu imajdan istediğin kadar container başlatırsın. Her container kendi izole alanında çalışır, ama hepsi aynı işletim sistemi çekirdeğini paylaşır. Sonuç: hızlı başlangıç, düşük kaynak tüketimi ve her ortamda tutarlılık.
Container ile sanal makine arasındaki fark
İkisi de izolasyon sağlar, ama farklı katmanlarda çalışırlar. Bir sanal makine (VM), donanımı taklit eden bir hypervisor üzerinde komple bir işletim sistemi çalıştırır. Her VM'in kendi çekirdeği (kernel) vardır, bu yüzden gigabaytlarca yer kaplar ve açılması dakikalar sürebilir.
Bir container ise ayrı bir işletim sistemi çalıştırmaz; ana makinenin (host) Linux çekirdeğini paylaşır ve sadece uygulama katmanını izole eder. İzolasyon için Linux çekirdeğinin namespaces (görünürlük ayrımı) ve cgroups (kaynak sınırlandırma) özellikleri kullanılır.
- Boyut: Container'lar genelde megabaytlar, VM'ler gigabaytlar mertebesindedir.
- Başlangıç: Container saniyeler içinde, çoğu zaman milisaniyelerle ayağa kalkar; VM çok daha yavaştır.
- İzolasyon: VM daha güçlü, donanım seviyesinde izolasyon sağlar; container daha hafiftir ama çekirdeği paylaşır.
Pratikte ikisi rakip değildir: container'ları çoğu zaman bir VM'in içinde çalıştırırsın. macOS ve Windows'ta Docker zaten arka planda küçük bir Linux VM kullanır, çünkü container'lar Linux çekirdeğine ihtiyaç duyar.
İmaj, container ve katman mantığı
İki kavramı karıştırmamak önemli. İmaj salt okunur bir şablondur: dosya sistemi, bağımlılıklar ve başlangıç komutu içinde sabittir. Container ise bu imajın çalışan bir örneğidir. Aynı sınıf ve nesne ilişkisi gibi düşünebilirsin: bir imajdan onlarca container üretebilirsin.
İmajlar katmanlardan oluşur. Dockerfile içindeki her komut yeni bir katman ekler ve bu katmanlar önbelleğe alınır. Aynı temel imajı kullanan projeler bu katmanları paylaşır, yani yer ve indirme süresi tasarrufu sağlar. Bir şeyi değiştirdiğinde sadece o katmandan sonrası yeniden inşa edilir.
İlk Dockerfile: küçük bir Node.js örneği
Bir imajı nasıl tanımladığını görelim. Basit bir Node.js uygulaması için Dockerfile şöyle görünebilir:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Satır satır: FROM temel imajı seçer (burada hafif Alpine tabanlı Node 20). WORKDIR çalışma dizinini belirler. Önce sadece package.json dosyalarını kopyalayıp npm ci çalıştırmak, katman önbelleğinden faydalanmak için bilinçli bir tekniktir: kodun değişse bile bağımlılıklar değişmediği sürece bu katman yeniden indirilmez. EXPOSE belgeleme amaçlı portu işaret eder, CMD ise container başlayınca çalışacak komuttur.
Temel Docker komutları
Günlük kullanımda en çok ihtiyaç duyacağın komutlar şunlardır:
# İmajı bu klasördeki Dockerfile'dan inşa et ve etiketle
docker build -t benim-uygulama .
# İmajdan bir container başlat, 3000 portunu host'a bağla
docker run -p 3000:3000 benim-uygulama
# Çalışan container'ları listele
docker ps
# Bir container'ı durdur
docker stop <container-id>
# Bir container'ın günlüklerini (log) izle
docker logs -f <container-id>
Birden fazla servisi (örneğin uygulama + veritabanı) birlikte yönetmek istediğinde Docker Compose devreye girer. Tek bir compose.yaml dosyasında tüm servisleri tanımlar, docker compose up ile hepsini ayağa kaldırırsın.
Docker'ı ne zaman kullanmalı?
Docker her zaman gerekli değildir, ama şu durumlarda ciddi fayda sağlar:
- Tutarlı ortam: Ekipteki herkes ve sunucu aynı sürümlerle çalışsın istiyorsan.
- Kolay dağıtım: Aynı imajı test, hazırlık (staging) ve canlı ortama değişmeden gönderebilirsin.
- Mikroservisler: Her servisi kendi container'ında izole çalıştırmak yönetimi netleştirir.
- Hızlı deneme: Bir veritabanını ya da aracı kalıcı kurulum yapmadan tek komutla deneyip silebilirsin.
Tek bir basit statik site için Docker bazen fazladan karmaşıklık olabilir; aracı, çözdüğü soruna göre seç.
Sık Sorulan Sorular
Docker'ı öğrenmek için Linux bilmek şart mı?
Şart değil ama çok yardımcı olur. Container'lar Linux çekirdeği üzerine kurulu olduğu için temel terminal komutlarını, dosya izinlerini ve ortam değişkenlerini bilmek işini büyük ölçüde kolaylaştırır. Windows ve macOS'ta Docker Desktop arka planda bir Linux ortamı sağladığı için başlangıç için yeterlidir.
Container'lar güvenli mi?
Doğru yapılandırıldığında oldukça güvenlidir, ama çekirdeği paylaştıkları için izolasyon bir VM kadar güçlü değildir. Güvenilmeyen kodları çalıştırırken resmi temel imajları kullanmak, container'ı root olmayan kullanıcıyla çalıştırmak ve imajları güncel tutmak iyi alışkanlıklardır.
İmaj ile container arasındaki fark nedir?
İmaj salt okunur şablondur (sınıf gibi), container ise o imajın çalışan örneğidir (nesne gibi). Bir imajdan istediğin kadar container başlatabilirsin ve her biri birbirinden bağımsız çalışır.
Projeni container'lara taşımak mı istiyorsun? Uygulamanı Docker ile paketlemek, deploy sürecini otomatikleştirmek veya altyapını düzenlemek için benimle iletişime geç — birlikte sade ve sürdürülebilir bir kurulum tasarlayalım.