DOCKER NEDİR?

Docker balinası logosu sırtında üç container kutusu taşıyor, beyaz arka plan üzerinde tek odak, Docker mavisi

"Benim makinemde çalışıyordu" cümlesi yazılım dünyasının en yaygın klişelerinden biridir. Bir geliştirici uygulamayı laptop'unda sorunsuz çalıştırır, kodu sunucuya yükler, test ekibi açar ve uygulama çakılır. Sebep çoğu zaman ortam farkıdır: farklı Node sürümü, eksik bir kütüphane, sistem kitaplığı uyumsuzluğu, başka bir dosya yolu. Docker tam bu probleme verilen yapısal cevaptır — uygulamayı çalıştığı ortamla birlikte taşınabilir bir paket haline getirir. 2013'te ortaya çıkışından itibaren modern yazılım dağıtımının temel parçası oldu ve bugün hem geliştirici makinelerinde hem de production sunucularında standart hâle geldi.

Bu yazı Docker'a yeni başlayanlar için kavramları sıfırdan açıklar. Container ile sanal makine farkından Dockerfile yazımına, Docker Compose ile çoklu servis çalıştırmaya kadar temel pratikleri kapsar. Resmi referans olarak Docker dokümantasyon merkezi her zaman güncel bilgi için iyi bir başlangıç noktasıdır.

Docker Tam Olarak Ne Yapar

Docker bir uygulamayı çalıştırmak için gereken her şeyi — kod, runtime, kütüphaneler, sistem araçları, yapılandırma — tek bir izole pakete koyar. Bu pakete container denir. Container'lar aynı işletim sistemi çekirdeği üzerinde paylaşımlı çalışır ama birbirinden ve host sistemden bağımsız davranır.

Aynı container'ı geliştiricinin laptop'unda, test sunucusunda ve production'da çalıştırdığınızda ortam değişmediği için davranış da değişmez. Yazılım dağıtım sürecindeki sürpriz arızaların büyük kısmı bu garantiyle ortadan kalkar.

Container ile Sanal Makine Farkı

Container'lar sık sık sanal makinelerle karıştırılır ama mimari olarak çok farklıdır.

Bir sanal makine (VM) kendi başına bütün bir bilgisayar taklit eder. Hypervisor üstünde misafir bir işletim sistemi tam olarak kurulur. Her VM ayrı bir kernel, ayrı disk sürücüleri, ayrı bellek tahsisi taşır. Bir VM çoğunlukla gigabyte boyutundadır ve açılması dakikalar alır.

Bir container ise host işletim sisteminin kernel'ini paylaşır. Sadece uygulama ve onun bağımlılıkları paketlenir. Container megabyte boyutundadır ve saniyeler içinde başlar. Bu hafiflik bir sunucuda onlarca-yüzlerce container çalıştırmayı mümkün kılar.

  • Boyut: VM gigabyte, container megabyte
  • Açılış süresi: VM dakikalar, container saniyeler
  • İzolasyon: VM tam donanım izolasyonu, container process izolasyonu
  • Yoğunluk: Bir sunucuda 5-10 VM, 50-200 container

Bu fark Docker'ı CI/CD pipeline'larından mikroservis mimarilerine kadar pek çok modern senaryoda VM'lere göre daha pratik bir seçenek yapar.

VM ve container mimari karşılaştırması: solda beş katmanlı ağır VM yığını gri, sağda ince katmanlar üstünde üç mavi container

Docker'ın Temel Kavramları

Docker ekosistemini anlamak için birkaç çekirdek terim oturmalı.

Image

Image bir container'ın "şablonu"dur. Salt-okunur bir dosyalar paketidir; uygulamanızı çalıştıracak her şeyi içerir. Bir image kendi başına çalışmaz; ondan bir container örneği oluşturulur. Aynı image'tan istediğiniz kadar container yaratabilirsiniz — class ve object ilişkisine benzer.

Container

Container bir image'in çalışan örneğidir. Hayatı boyunca dosya yazabilir, çevre değişkenleri tutabilir, ağ bağlantısı kurabilir. Durdurulduğunda yazılan veriler kaybolur — bu yüzden kalıcı veri için volume kullanılır.

Dockerfile

Dockerfile bir image'i nasıl inşa edeceğinizi anlatan metin dosyasıdır. Hangi temel image'tan başlayacağı, hangi paketlerin kurulacağı, kodun nereye kopyalanacağı, uygulamanın nasıl başlatılacağı adım adım yazılır.

Registry

Image'ları paylaşmak ve depolamak için kullanılan merkezdir. En bilinen örnek Docker Hub'dır — milyonlarca hazır image barındıran resmi register'dır. Kurumlar genellikle GitHub Container Registry, AWS ECR veya kendi private registry'lerini kurar.

Volume

Container kapatıldığında verilerin kaybolmaması için kullanılan kalıcı depolama mekanizmasıdır. Veritabanı dosyaları, kullanıcı yüklemeleri, log'lar gibi kalıcı veriler volume üzerinde saklanır.

Basit Bir Dockerfile Örneği

Node.js tabanlı küçük bir uygulamayı container'a sokmak istediğinizi düşünün. Tipik bir Dockerfile şöyle görünür:

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

Bu altı satırın anlamı şudur:

  • FROM: Hazır bir Node.js 20 image'inden başla (alpine küçük Linux dağıtımı)
  • WORKDIR: Container içinde çalışma dizini olarak /app kullan
  • COPY package*.json: Önce sadece package dosyalarını kopyala (cache verimliliği için)
  • RUN npm install: Bağımlılıkları yükle
  • COPY . .: Geri kalan tüm kodu kopyala
  • EXPOSE: Container'ın 3000 portunda dinleyeceğini belirt
  • CMD: Container başladığında server.js'i çalıştır

Bu Dockerfile'ı build etmek için docker build -t my-app ., çalıştırmak için docker run -p 3000:3000 my-app komutu yeterlidir. Aynı image laptop'ta da, sunucuda da, başka bir kıtadaki cloud sağlayıcısında da aynı davranışı sergiler.

Docker Compose ile Çok Container'lı Uygulamalar

Gerçek uygulamalar nadiren tek container'dan oluşur. Web servisi + veritabanı + cache + arka plan işçisi gibi parçalar bir arada çalışır. Bu yapıyı tek tek docker run komutlarıyla yönetmek hızla yorucu hâle gelir.

Docker Compose bir docker-compose.yml dosyasında tüm servisleri tek seferde tanımlamanıza ve tek komutla başlatmanıza izin verir:

services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

docker compose up komutu hem web servisini hem PostgreSQL'i ayağa kaldırır, aralarında ağ kurar, kalıcı volume'u bağlar. Geliştirme ortamında tüm stack'i tek komutla başlatmak büyük zaman tasarrufu sağlar. Production'a geçişte aynı yapı Kubernetes manifestolarına veya Docker Swarm servislerine taşınabilir.

Üç Docker container kutusu yan yana: web glob, veri tabanı silindiri ve şimşek ikonları, çift yönlü oklarla bağlı

Docker Hangi Senaryolarda Tercih Edilir

Docker her duruma uygun değildir ama bazı senaryolarda neredeyse standart hâle gelmiştir:

  • Mikroservis mimarileri: Onlarca küçük servisi izole biçimde paketleyip dağıtmak için container'lar ideal.
  • CI/CD pipeline'ları: Test ortamını her build'de sıfırdan ve aynı şekilde kurmak için container'lar tutarlılık sağlar.
  • Geliştirme ortamı standardizasyonu: "Şu kütüphaneyi şu sürümde kur" listesi yerine ekip aynı container imajını paylaşır.
  • Veri bilimi ve ML: Karmaşık Python bağımlılıklarını ve CUDA sürümlerini container içinde sabitlemek araştırmacının makinesini kirletmez.
  • Eski uygulamaları modernleştirmek: Legacy bir PHP uygulamasını container'a alıp modern altyapıya taşımak görece düşük efor gerektirir.

Docker'ın günlük komut setine, image üretimine ve compose senaryolarına pratik yoldan hâkim olmak için Docker eğitimi uygulamalı örneklerle yapılandırılmış bir yol sunar.

Docker Hakkında Yaygın Yanlış Anlamalar

Docker etrafında dolaşan birkaç yanılgıya değinmek gerek:

  • "Docker bir sanal makinedir." Hayır. Docker container'ları paylaşılan kernel üzerinde process izolasyonu kullanır; ayrı bir işletim sistemi taşımaz.
  • "Container'lar tamamen güvenlidir." Eksik. Container izolasyonu güçlüdür ama VM seviyesinde değildir. Kernel exploit'leri tüm container'ları etkileyebilir; bu yüzden güvenlik katmanları (rootless mode, user namespace, seccomp) ayrıca düşünülmelidir.
  • "Docker production için uygun değildir." Modası geçmiş bir endişe. Bugün dünyanın en büyük platformları container teknolojisi üzerinde çalışıyor; orchestrator'lar (Kubernetes, Nomad) production yükünü taşıyabilir hâle getirdi.
  • "Docker = Kubernetes." Hayır. Docker tek tek container'ları paketler ve çalıştırır. Kubernetes container'ları cluster genelinde orkestre eden ayrı bir katmandır. Birini öğrenmek diğerini kapsamaz.

Docker Öğrenmeye Nereden Başlanır

Docker pratik bir araçtır; sadece okuyarak değil deneyerek öğrenilir. İyi bir başlangıç sırası şudur: önce docker run ile basit container'ları çalıştırmak, sonra kendi Dockerfile'ınızı yazmak, ardından Docker Compose ile çoklu servis kurmak, en son volume ve network konularına inmek. Her adımda küçük bir projeyle pratik yapmak teorik öğrenmeden çok daha kalıcıdır.

Container teknolojisi son on yılda yazılım dağıtım anlayışını köklü biçimde değiştirdi. Docker bu değişimin yüzü ve en yaygın aracı. Konsept oturduğunda sadece geliştirme süreciniz değil, sunucu ve altyapı düşünce biçiminiz de farklılaşır.