Docker (Container) Nedir?
Kısa tanım
Docker, uygulamaları bağımlılıklarıyla birlikte container (konteyner) adı verilen yalıtılmış ve taşınabilir birimler hâlinde paketleyip çalıştırmayı sağlayan bir platformdur. Uygulama, Dockerfile'daki talimatlarla bir imaja (image) dönüştürülür; container ise bu imajın çalışan bir örneğidir. Container'lar sanal makinelerden farklı olarak ana makinenin işletim sistemi çekirdeğini paylaştığı için çok daha hafiftir.
Diğer adları: Container, Konteyner, Docker container, Docker imajı

Container kavramı Docker'dan büyüktür
Container, bir uygulamayı çalışması için gereken her şeyle (çalışma ortamı, kütüphaneler, yapılandırma) birlikte paketleyen ve onu sistemin geri kalanından yalıtan bir çalışma birimidir. Bu yalıtım Linux çekirdeğinin iki özelliğine dayanır: süreçlerin, ağın ve dosya sisteminin ayrı bir görünümünü sağlayan namespace'ler ve CPU ile bellek kullanımını sınırlayan cgroups. Docker bu yetenekleri herkesin kullanabileceği basit bir araç setine dönüştürerek container'ları yaygınlaştırdı. Bugün imaj biçimi ve çalışma zamanı OCI (Open Container Initiative) standartlarıyla tanımlanır; Docker ile oluşturulan bir imaj Podman, containerd ya da Kubernetes üzerinde de çalışır.
Pratikteki kazanım şudur: "Benim bilgisayarımda çalışıyordu" sorunu büyük ölçüde ortadan kalkar. Geliştiricinin dizüstü bilgisayarında, test ortamında ve canlı sunucuda aynı imaj çalışır.
İmaj ve container farkı
| İmaj (image) | Container | |
|---|---|---|
| Nedir? | Uygulamanın ve bağımlılıklarının salt okunur, katmanlı paketi | İmajın çalışan bir örneği |
| Değişir mi? | Hayır; değişiklik yeni bir imaj sürümü demektir | Üstünde geçici, yazılabilir bir katman vardır |
| Nerede durur? | Bir imaj kayıt deposunda (registry) | Bir sunucuda çalışır, durdurulur, silinir |
Yazılımcılara tanıdık bir benzetmeyle: imaj bir sınıfa, container o sınıftan oluşturulmuş bir nesneye benzer. Aynı imajdan aynı anda onlarca container çalıştırılabilir.
Örnek bir Dockerfile
Aşağıdaki Dockerfile, bir Node.js API'sini paketler:
FROM node:24-alpine
WORKDIR /app
# Önce bağımlılık tanımları: kod değişse de bu katman önbellekten gelir
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
ENV NODE_ENV=production
USER node
EXPOSE 3000
CMD ["node", "server.js"]docker build -t siparis-api:1.4.0 .
docker run -d -p 3000:3000 --name siparis-api siparis-api:1.4.0Her talimat bir katman üretir ve Docker değişmeyen katmanları önbellekten kullanır. Bu yüzden önce yalnızca package.json kopyalanır: uygulama kodu değiştiğinde bağımlılıklar yeniden kurulmaz. Talimatların ayrıntıları resmî Dockerfile referansında yer alır.
Container mı, sanal makine mi?
| Container | Sanal makine (VM) | |
|---|---|---|
| Ne sanallaştırılır? | İşletim sistemi düzeyi; ana makinenin çekirdeği paylaşılır | Donanım; her VM kendi işletim sistemini çalıştırır |
| Başlama süresi | Genellikle saniyeler, hatta daha az | Genellikle daha uzun; bir işletim sistemi açılır |
| Boyut | Çoğunlukla megabaytlar | Çoğunlukla gigabaytlar |
| Yalıtım | Hafif; çekirdek ortak | Daha güçlü bir güvenlik sınırı |
İkisi rakip değil, çoğu zaman tamamlayıcıdır: bulutta container'lar genellikle sanal makinelerin içinde çalışır. macOS ve Windows'ta Docker Desktop da Linux container'larını arka planda hafif bir sanal makine üzerinde çalıştırır.
Sık yapılan hatalar
- Kalıcı veriyi container içinde tutmak: Container silindiğinde yazılabilir katmanı da gider. Veritabanı dosyaları ve yüklenen içerikler için volume kullanılmalıdır.
- Sırları imaja gömmek:
.envdosyasını kopyalamak ya da parolayıENVile yazmak, sırrı imaj katmanlarına kalıcı olarak işler. Sırlar çalışma anında verilmelidir. - Her şeyi
latestetiketiyle yayımlamak: Hangi sürümün çalıştığını izlemeyi ve geri dönmeyi zorlaştırır; sürüm numarası ya da commit kimliği kullanın. - Root kullanıcıyla çalıştırmak ve şişkin imajlar:
USERtalimatı,.dockerignoredosyası ve çok aşamalı (multi-stage) derlemeler hem güvenliği hem boyutu iyileştirir.
Birden fazla container'ı birlikte tanımlamak için Docker Compose, çok sayıda sunucuda yönetmek için Kubernetes gibi orkestrasyon araçları kullanılır. Bu yüzden Docker, mikroservis mimarilerinin ve CI/CD hatlarının en yaygın yapı taşlarından biridir.

