froquiz-logoFroquiz
  • Anasayfa
  • Quizler
  • Blog
  • Hakkımızda
Froquiz

Yazılım mühendisleri için en kapsamlı quiz platformu. 5000+ soru ile kendinizi test edin ve kariyerinizi geliştirin.

LinkedIn

Platform

  • Quizlere Başla
  • Konular
  • Blog
  • Profilim
  • Giriş Yap

Hakkında

  • Biz Kimiz?
  • İletişim

Yasal

  • Gizlilik Politikası
  • Kullanım Koşulları

© 2026 Froquiz. Tüm hakları saklıdır.Teknoloji tutkuyla yapıldı
Blog/Docker Nedir? Container Teknolojisini Gerçekten Anlamak

Docker Nedir? Container Teknolojisini Gerçekten Anlamak

Docker sadece bir araç değil, yazılımı paketleme ve dağıtma biçimini kökten değiştiren bir düşünce şekli. "Bende çalışıyor" problemini sonsuza kadar çözen container teknolojisini anlıyoruz.

Yusuf SeyitoğluYusuf Seyitoğlu|
5 Mart 20265 Mar
|
16 görüntülenme
|
10 dk okuma

Docker Nedir? Container Teknolojisini Gerçekten Anlamak

"Bende çalışıyor ama senin makinende neden çalışmıyor?" — yazılım geliştirmenin belki de en klasik cümlesi. Docker bu cümleyi tarihe gömdü.

2013'te Docker'ın ortaya çıkışı, yazılımın nasıl paketlendiğini ve dağıtıldığını kökten değiştirdi. Bugün neredeyse her modern uygulamanın altyapısında Docker ya da container teknolojisi var. Ama çoğu geliştirici Docker'ı "sanal makine gibi bir şey" olarak tanımlıyor ve orada kalıyor. Bu yazı o tanımın çok ötesine geçiyor.

Problem: Ortam Tutarsızlığı

Bir uygulamanın çalışması için tek başına kod yetmez. Python 3.9'a mı yoksa 3.11'e mi ihtiyacı var? Hangi sistem kütüphanelerine bağımlı? Hangi ortam değişkenlerini bekliyor? Hangi port'ta çalışacak?

Geliştirici makinesinde her şey kurulu ve ayarlı. CI/CD sunucusunda biraz farklı. Production'da daha da farklı. Bu tutarsızlık bug'ların en sinsi kaynağıdır — kod doğru, ama ortam yanlış.

Docker bu problemi şöyle çözer: uygulamayı çalışması için gereken her şeyle birlikte paketler. Kod, runtime, kütüphaneler, sistem araçları, ayarlar — hepsi bir arada. Nereye taşırsanız taşıyın, aynı ortamda çalışır.

Container vs Sanal Makine: Kritik Fark

Docker container'ları çoğunlukla sanal makineyle (VM) karıştırılır. İkisi de izolasyon sağlar ama çok farklı çalışır.

Sanal makine, fiziksel bir bilgisayarın tamamını simüle eder. Kendi işletim sistemi çekirdeği, kendi bellek yönetimi, kendi her şeyi var. Bu yüzden ağırdır — birkaç GB disk alanı, başlaması dakikalar alır.

Container ise host işletim sisteminin çekirdeğini paylaşır. Sadece uygulamanın ihtiyacı olan kütüphaneleri ve dosyaları paketler. Megabyte'lar mertebesinde, saniyeler içinde başlar.

Sanal Makine:              Container:
┌──────────────┐           ┌──────────────┐
│   Uygulama   │           │   Uygulama   │
├──────────────┤           ├──────────────┤
│  Guest OS    │           │  Kütüphane   │
├──────────────┤           ├──────────────┤
│  Hypervisor  │           │ Container    │
├──────────────┤           │ Engine       │
│   Host OS    │           ├──────────────┤
├──────────────┤           │   Host OS    │
│   Donanım    │           ├──────────────┤
└──────────────┘           │   Donanım    │
                           └──────────────┘

Image ve Container: İki Temel Kavram

Docker'ı anlamak için iki kavramı net ayırt etmek gerekir: image ve container.

Image, bir şablondur. Uygulamanın nasıl paketleneceğini tanımlar. Salt okunurdur, değiştirilemez. Bir sınıf tanımı gibi düşünün.

Container, image'dan çalıştırılan örnektir. Bir sınıftan oluşturulan nesne gibi. Aynı image'dan onlarca container çalıştırabilirsiniz, hepsi birbirinden bağımsız.

# Image'ı indir docker pull nginx:latest # Image'dan container oluştur ve çalıştır docker run -d -p 8080:80 --name my-nginx nginx:latest # Çalışan container'ları gör docker ps # Container'ı durdur docker stop my-nginx # Container'ı sil docker rm my-nginx

Dockerfile: Image Nasıl Oluşturulur

Dockerfile, image'ın nasıl inşa edileceğini adım adım tanımlayan dosyadır. Her satır bir katman (layer) oluşturur ve Docker bu katmanları önbelleğe alır — bu da build süresini dramatik biçimde kısaltır.

# Base image: Node.js 20 (Alpine Linux - küçük boyutlu) FROM node:20-alpine # Çalışma dizinini ayarla WORKDIR /app # Önce sadece package.json'ları kopyala (cache optimizasyonu) COPY package*.json ./ # Bağımlılıkları yükle RUN npm ci --only=production # Uygulama kodunu kopyala COPY . . # Uygulamanın hangi portu kullandığını belirt EXPOSE 3000 # Container başladığında çalışacak komut CMD ["node", "src/index.js"]

Neden package.json önce kopyalanıyor? Docker katman önbelleği sayesinde, bağımlılıklar değişmediği sürece npm ci adımı tekrar çalışmaz. Sadece kod değiştiğinde COPY . . katmanından itibaren yeniden build alınır. Bu büyük projelerde dakikalar kazandırır.

Multi-Stage Build: Production'a Hazır Image

Geliştirme ortamı için gereken araçlar (TypeScript compiler, test framework'leri, build tool'ları) production image'ına girmemeli. Multi-stage build ile build ortamını ve production ortamını ayırırsınız.

# Stage 1: Builder FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # TypeScript'i compile et # Stage 2: Production FROM node:20-alpine WORKDIR /app # Sadece production bağımlılıklarını yükle COPY package*.json ./ RUN npm ci --only=production # Builder stage'inden sadece compile edilmiş kodu al COPY --from=builder /app/dist ./dist USER node EXPOSE 3000 CMD ["node", "dist/index.js"]

Sonuç: Build araçları dahil ~800MB yerine ~150MB'lık production image.

Docker Compose: Birden Fazla Container'ı Yönetmek

Gerçek uygulamalar tek bir container'dan oluşmaz. Backend API, PostgreSQL database, Redis cache, Nginx reverse proxy — bunların hepsi ayrı container'larda çalışır ve birbirleriyle konuşmaları gerekir.

docker-compose.yml bu container'ları bir arada tanımlar ve tek komutla ayağa kaldırır.

version: '3.8' services: # Backend API api: build: . ports: - "3000:3000" environment: - DATABASE_URL=postgresql://user:password@db:5432/myapp - REDIS_URL=redis://cache:6379 depends_on: - db - cache volumes: - .:/app # geliştirme için hot reload - /app/node_modules # PostgreSQL Database db: image: postgres:15-alpine environment: POSTGRES_DB: myapp POSTGRES_USER: user POSTGRES_PASSWORD: password volumes: - postgres_data:/var/lib/postgresql/data # veriyi kalıcı sakla # Redis Cache cache: image: redis:7-alpine volumes: - redis_data:/data volumes: postgres_data: redis_data:
docker-compose up -d # tüm servisleri arka planda başlat docker-compose logs -f # log'ları takip et docker-compose down # tüm servisleri durdur docker-compose down -v # volume'ları da sil (veriyi temizle)

Volume'lar: Veriyi Kalıcı Hale Getirmek

Container'lar geçicidir. Bir container silindiğinde içindeki veri de gider. Database verisi, upload edilen dosyalar, log'lar — bunların kaybolmaması için volume kullanılır.

Volume, host makinedeki bir dizini container'ın içine bağlar. Container silinse bile volume'daki veri kalır.

# Named volume oluştur docker volume create myapp-data # Container'a volume bağla docker run -v myapp-data:/app/data myapp # Development için: kod dizinini doğrudan bağla (hot reload) docker run -v $(pwd):/app -v /app/node_modules myapp

Networking: Container'lar Nasıl Konuşur

Docker Compose ile oluşturulan container'lar otomatik olarak aynı ağa dahil olur ve birbirlerine servis adlarıyla ulaşırlar. api servisi, db servisine localhost yerine db hostname'i ile bağlanır.

Bu izolasyon önemlidir — container ağı dış dünyadan ayrıdır. Hangi port'ların dışarıya açılacağını siz belirlersiniz. Database'inizi dışarıya açmadan sadece API'nize erişim sağlayabilirsiniz.

Docker Olmadan Ne Kaybedersiniz

Docker öğrenmek başlangıçta zahmetli gelebilir. Ama sağladığı şeyleri düşünün: geliştirici ortamı kurulumu dakikalara düşer, "bende çalışıyor" problemi ortadan kalkar, production ile aynı ortamda geliştirme yapılır, ölçeklendirme tek komuta iner.

Kubernetes, Docker Swarm, AWS ECS gibi orkestrasyon platformlarının tamamı container teknolojisi üzerine kuruludur. Container'ları anlamadan bu platformlara geçiş yapmak kör uçuş gibidir.

Docker bir araç öğrenmekten çok bir düşünce şekli benimsemektir: uygulamanın çalışması için gereken her şey kodla birlikte paketlenir, ortam dışarıdan değil içeriden taşınır.

Yazar Hakkında

Yusuf Seyitoğlu

Yusuf Seyitoğlu

View Profile →

Diğer Yazılar

  • CI/CD Pipeline Nedir? Kod Yazmaktan Production'a Giden Otomatik Yol

    6 Mar

  • TypeScript Nedir? JavaScript Geliştiricisinin Tip Sistemine Gerçek Giriş

    6 Mar

  • Kubernetes Nedir? Container Orkestrasyon'u Sıfırdan Anlamak

    6 Mar

← Tüm Bloglar