Tarih: 4 Şubat 2026
Kategori: DevOps
Okuma: 9 dk
Yazılım geliştirme ve dağıtım süreçlerini kökten değiştiren Docker teknolojisini, mimarisini ve pratik kullanım senaryolarını kapsamlı şekilde inceliyoruz.
Kısa Özet
Docker, uygulamaları tüm bağımlılıklarıyla birlikte izole konteynerler içinde paketleyen açık kaynaklı bir platformdur. Sanal makinelere göre çok daha hafif ve hızlıdır; geliştirme, test ve production ortamları arasında tutarlılık sağlar.
Bir uygulamayı geliştirdiniz. Kendi bilgisayarınızda sorunsuz çalışıyor. Ancak sunucuya deploy ettiğinizde farklı kütüphane versiyonları, eksik bağımlılıklar veya işletim sistemi farklılıkları yüzünden her şey alt üst oluyor. Bu hikaye size tanıdık geliyorsa, Docker tam da bu sorunu çözmek için var.
Docker, 2013 yılında Solomon Hykes tarafından geliştirilen açık kaynaklı bir konteyner platformudur. Temel amacı basit: uygulamaları tüm bağımlılıklarıyla birlikte paketleyip, herhangi bir ortamda tutarlı şekilde çalıştırabilmek. Docker, Linux çekirdeğinin namespace ve cgroup özelliklerini kullanarak izole çalışma ortamları oluşturur. Bu ortamlara "konteyner" diyoruz.
Bir konteyneri, uygulamanızın çalışması için gereken her şeyi (kod, runtime, sistem araçları, kütüphaneler, ayarlar) içeren hafif ve taşınabilir bir paket olarak düşünebilirsiniz. Konteyner nerede çalışırsa çalışsın, aynı şekilde davranır. Geliştirici makinesinde, test sunucusunda, production ortamında fark etmez.
Docker'ı anlamak için konteynerleri sanal makinelerle karşılaştırmak faydalı olur. İkisi de izolasyon sağlar ama temelden farklı yaklaşımlar benimser.
Sanal makineler (VM'ler) bir hypervisor üzerinde çalışır ve her biri kendi işletim sistemine sahiptir. Bir Ubuntu VM açtığınızda, Ubuntu çekirdeği, dosya sistemi ve tüm sistem servisleri yeniden oluşturulur. Bu da her VM'in gigabyte'larca alan kaplaması ve başlatılmasının dakikalar sürmesi anlamına gelir.
Konteynerler ise host işletim sisteminin çekirdeğini paylaşır. Her konteynerin kendi dosya sistemi, ağ yapılandırması ve proses alanı vardır, ama çekirdeğe doğrudan erişir. Sonuç olarak konteynerler megabyte'lar seviyesinde yer kaplar ve saniyeler içinde başlatılabilir. Bir sunucuda 3-4 VM çalıştırabilecekken, aynı sunucuda onlarca hatta yüzlerce konteyner çalıştırabilirsiniz.
Tabii bu, sanal makinelerin işe yaramaz olduğu anlamına gelmiyor. Farklı işletim sistemi çekirdeklerine ihtiyaç duyduğunuzda veya çok daha güçlü izolasyon gerektiğinde VM'ler hala doğru tercih. Ancak mikroservis mimarileri, hızlı geliştirme döngüleri ve ölçeklenebilirlik konularında konteynerler açık ara önde.
Docker ekosistemini anlamak için birkaç temel kavramı bilmek gerekiyor. Bunları tek tek inceleyelim.
Image, uygulamanızın çalışması için gereken tüm dosyaların salt okunur bir şablonudur. Bir image katmanlı (layered) yapıdadır. Her katman bir öncekinin üzerine değişiklikler ekler. Bu katmanlı yapı sayesinde ortak katmanlar paylaşılabilir ve disk kullanımı optimize edilir. Örneğin 10 farklı Node.js uygulamanız varsa hepsi aynı Node.js base katmanını paylaşabilir.
Konteyner, bir image'ın çalışan örneğidir. Image'ı bir sınıf, konteyneri de o sınıftan oluşturulan bir nesne olarak düşünebilirsiniz. Bir image'dan istediğiniz kadar konteyner oluşturabilirsiniz. Her konteyner birbirinden izole çalışır; birinin çökmesi diğerlerini etkilemez.
Dockerfile, image oluşturmak için kullanılan talimat dosyasıdır. Hangi base image kullanılacağını, hangi dosyaların kopyalanacağını, hangi komutların çalıştırılacağını ve uygulamanın nasıl başlatılacağını tanımlar. Basit bir Node.js uygulaması için Dockerfile şöyle görünür:
# Base image olarak Node.js 20 kullan
FROM node:20-alpine
# Çalışma dizinini belirle
WORKDIR /app
# Bağımlılık dosyalarını kopyala
COPY package*.json ./
# Bağımlılıkları yükle
RUN npm ci --only=production
# Uygulama dosyalarını kopyala
COPY . .
# Portu aç
EXPOSE 3000
# Uygulamayı başlat
CMD ["node", "server.js"]
Her satır bir katman oluşturur. Docker, değişmeyen katmanları cache'ler, bu yüzden sadece değişen katmanlar yeniden oluşturulur. Yukarıdaki örnekte, uygulama kodu değişse bile npm ci adımı tekrar çalışmaz (package.json değişmediyse). Bu, build süresini ciddi ölçüde kısaltır.
Registry, Docker image'larının depolandığı ve paylaşıldığı merkezi bir havuzdur. Docker Hub en popüler public registry'dir ve binlerce hazır image barındırır. PostgreSQL, Redis, Nginx gibi yaygın yazılımların resmi image'larını Docker Hub'dan çekebilirsiniz. Kurumsal projelerde ise AWS ECR, Google Container Registry veya kendi barındırdığınız private registry'ler kullanılır.
Docker'ın teorik faydalarını anlattık, peki gerçek dünyada nasıl kullanılıyor?
Geliştirme ortamı standardizasyonu: Yeni bir geliştirici ekibe katıldığında, projeyi çalıştırmak için saatler harcamasına gerek kalmaz. docker compose up komutuyla veritabanı, cache, message queue ve uygulama saniyeler içinde ayağa kalkar. "Bende çalışıyor" problemi ortadan kalkar çünkü herkes aynı ortamı kullanır.
Mikroservis mimarisi: Her servis kendi konteynerinde çalışır, kendi bağımlılıklarını yönetir, bağımsız olarak deploy edilir. Bir servis Node.js, diğeri Python, bir diğeri Go ile yazılabilir. Docker bu heterojen yapıyı sorunsuz şekilde yönetir.
CI/CD pipeline'ları: Test ve build ortamları konteyner olarak tanımlanır. Her commit'te aynı ortamda testler çalışır, build alınır ve deploy edilir. Ortam farklılıklarından kaynaklanan sorunlar tamamen ortadan kalkar.
Legacy uygulama modernizasyonu: Eski bir uygulamayı konteynerize ederek modern altyapılarda çalıştırabilirsiniz. Uygulamanın ihtiyaç duyduğu eski kütüphane versiyonlarını konteyner içinde tutarsınız, host sistemi etkilemezsiniz.
Gerçek dünya uygulamaları tek bir konteynerden oluşmaz. Bir web uygulaması için genellikle uygulama sunucusu, veritabanı, cache ve belki bir reverse proxy gerekir. Docker Compose, bu tür çoklu konteyner yapılarını tek bir YAML dosyasıyla tanımlamanızı ve yönetmenizi sağlar.
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:16-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
cache:
image: redis:7-alpine
volumes:
pgdata:
Bu dosyayla docker compose up -d komutunu çalıştırdığınızda, üç konteyner birbirine bağlı şekilde ayağa kalkar. Veritabanı verileri volume sayesinde konteyner silinse bile korunur. Servisler birbirine isim üzerinden erişir; db ve cache Docker'ın dahili DNS'i tarafından çözümlenir.
Docker ile günlük çalışırken en çok ihtiyaç duyacağınız komutları sıralayalım:
# Image oluştur
docker build -t uygulama:v1 .
# Konteyner çalıştır
docker run -d -p 3000:3000 --name web uygulama:v1
# Çalışan konteynerleri listele
docker ps
# Konteyner loglarını izle
docker logs -f web
# Konteynere bağlan
docker exec -it web sh
# Konteyneri durdur ve sil
docker stop web && docker rm web
# Kullanılmayan kaynakları temizle
docker system prune -a
docker ps komutu günlük en çok kullanacağınız komutlardan biridir. Çalışan konteynerlerin durumunu, port eşlemelerini ve uptime bilgilerini gösterir. docker logs -f ise production'da sorun giderirken vazgeçilmezdir; -f flag'i logları gerçek zamanlı olarak takip etmenizi sağlar.
Docker'ın bu kadar hızlı benimsenmesinin arkasında birkaç somut neden var. Birincisi, tekrarlanabilirlik. Dockerfile ve docker-compose.yml dosyaları versiyon kontrolünde tutulur; ortam konfigürasyonu kodla birlikte yaşar. İkincisi, izolasyon. Farklı projelerin farklı versiyonlarda Node.js, Python veya Java kullanması sorun olmaz. Üçüncüsü, hız. Konteynerler saniyeler içinde başlar ve durdurulur. Dördüncüsü, taşınabilirlik. Laptop'unuzda çalışan konteyner, AWS'de de, Azure'da da, bare metal sunucuda da aynı şekilde çalışır.
Ayrıca Docker Hub'daki hazır image'lar sayesinde bir PostgreSQL veritabanı kurmak için artık kurulum dokümanlarıyla uğraşmanız gerekmiyor. Tek bir docker run komutuyla hazır.
Docker'ı development ortamında kullanmak nispeten basittir. Ancak production'da işler biraz daha karmaşıklaşır. Dikkat etmeniz gereken konuları sıralayalım.
Image boyutunu minimize edin. Alpine tabanlı base image'lar kullanın. Multi-stage build'lerle build araçlarını final image'dan çıkarın. Gereksiz dosyaları .dockerignore ile dışlayın. 1 GB'lık bir image yerine 50 MB'lık bir image, pull süresini ve storage maliyetini ciddi ölçüde düşürür.
Güvenlik konuşunu ciddiye alın. Konteynerlerinizi root kullanıcısıyla çalıştırmayın. Image'larınızı düzenli olarak güvenlik taramalarından geçirin. Hassas bilgileri (API anahtarları, veritabanı şifreleri) environment variable veya secret management araçlarıyla yönetin, Dockerfile'a yazmayın.
Loglama ve monitoring kurun. Konteynerler geçicidir; çöktüğünde loglar kaybolabilir. Logları bir merkezi sisteme (ELK Stack, Grafana Loki vb.) yönlendirin. Container metric'lerini Prometheus ile toplayın ve Grafana ile görselleştirin.
Orchestration düşünün. Tek bir sunucuda birkaç konteyner çalıştırıyorsanız Docker Compose yeterlidir. Ancak birden fazla sunucuya ölçeklendirmeniz, otomatik failover ve load balancing gerekiyorsa, Kubernetes veya Docker Swarm gibi orkestrasyon araçlarına bakmanız gerekir.
Docker'a başlamak son derece kolay. Docker Desktop'ı indirip kurun (Windows, macOS ve Linux için mevcut). Ardından terminal açın ve ilk konteynerinizi çalıştırın:
# Docker kurulumunuzu doğrulayın
docker --version
# İlk konteynerinizi çalıştırın
docker run hello-world
# Nginx web sunucusu başlatın
docker run -d -p 8080:80 nginx
# Tarayıcıda http://localhost:8080 adresini açın
Yukarıdaki komutlarla birkaç dakika içinde çalışan bir web sunucunuz olur. Buradan sonra kendi uygulamalarınız için Dockerfile yazmaya, Docker Compose ile çoklu servis ortamları kurmaya başlayabilirsiniz. Docker Hub'daki resmi dokümantasyon ve topluluk kaynakları oldukça kapsamlıdır.
Docker, modern yazılım geliştirmenin olmazsa olmazı haline geldi. DevOps hizmetlerimiz kapsamında Docker altyapı kurulumu ve yönetimi desteği sunuyoruz. Konteynerlerin sağladığı taşınabilirlik, tutarlılık ve hız, ekiplerin daha güvenli ve daha hızlı yazılım teslim etmesini mümkün kılıyor. Eğer henüz Docker kullanmıyorsanız, başlamak için bundan daha iyi bir zaman yok.
Alphacore Yazılım Ekibi
İstanbul merkezli Alphacore Yazılım, konteyner teknolojileri ve DevOps altyapı kurulumu alanında deneyimli mühendis kadrosuyla projeler geliştirmektedir. İletişime geçin
Konteyner mimarileri, CI/CD pipeline'ları ve bulut altyapıları konusunda uzman ekibimizle tanışın.
Bize Ulaşın