Yükleniyor...

Docker Mimarisi: Konteyner Tasarım Rehberi [2026]

Yazar: Burak Balkı | Kategori: DevOps | Okuma Süresi: 8 dk

Docker mimarisi nasıl tasarlanır? Mikroservis yapısı, multi-stage build, network ve volume yönetimi ile production rehberi.

## Docker Nedir ve Mimari Yapısı Nasıl Çalışır? **Docker**, uygulamaların tüm bağımlılıkları ile birlikte paketlenmesini, dağıtılmasını ve herhangi bir ortamda tutarlı bir şekilde çalıştırılmasını sağlayan açık kaynaklı bir konteynerizasyon platformudur. Geleneksel sanallaştırmadan (Virtual Machines) farklı olarak, Docker işletim sistemi çekirdeğini (kernel) paylaşır ve bu sayede çok daha hafif, hızlı ve verimli bir çalışma ortamı sunar. Docker mimarisi, **Client-Server** yapısına dayanır. Docker istemcisi (CLI), Docker Daemon (dockerd) ile REST API üzerinden haberleşir. Daemon; imajların oluşturulması, konteynerlerin çalıştırılması ve ağ yapılandırması gibi karmaşık işlemleri yöneten ana bileşendir. ## Docker Engine ve Temel Bileşenler Docker Engine, sistemin kalbidir ve üç ana parçadan oluşur: 1. **Server (Daemon):** Sürekli çalışan bir arka plan sürecidir. 2. **REST API:** Programların daemon ile konuşmasını sağlayan arayüzdür. 3. **Command Line Interface (CLI):** Kullanıcının komutlar aracılığıyla Docker ile etkileşime girmesini sağlar. ### Docker Nesneleri - **Images:** Bir konteyner oluşturmak için gereken salt okunur şablonlardır. - **Containers:** İmajların çalışan örnekleridir. - **Networks:** Konteynerlerin birbirleriyle ve dış dünya ile iletişimini sağlar. - **Volumes:** Verilerin kalıcı hale getirilmesini sağlayan mekanizmalardır. ## Docker Image ve Katmanlı Dosya Sistemi (UnionFS) Docker imajları, **Union File System (UnionFS)** adı verilen katmanlı bir yapı kullanır. Her bir komut (FROM, RUN, COPY) yeni bir katman oluşturur. Bu mimari, disk alanından tasarruf sağlar ve imajların çok hızlı bir şekilde transfer edilmesine olanak tanır. ```dockerfile # Temel imaj seçimi FROM node:18-alpine # Çalışma dizini oluşturma WORKDIR /app # Bağımlılıkları kopyalama ve yükleme COPY package*.json ./ RUN npm install --production # Kaynak kodları kopyalama COPY . . # Uygulama portu EXPOSE 3000 # Başlatma komutu CMD ["node", "src/index.js"] ``` ## Dockerfile Optimizasyonu: Multi-stage Builds Üretim ortamında imaj boyutlarını minimize etmek için **Multi-stage builds** stratejisi kritiktir. Bu yöntemle, derleme araçlarını içeren ağır bir imajda uygulamanızı derleyip, sadece binary dosyayı hafif bir çalışma zamanı imajına taşıyabilirsiniz. ```dockerfile # Stage 1: Derleme aşaması FROM golang:1.21-alpine AS builder WORKDIR /build COPY . . RUN go build -o main . # Stage 2: Çalışma aşaması FROM alpine:3.18 WORKDIR /app COPY --from=builder /build/main . CMD ["./main"] ``` ## Docker Networking: Ağ Modelleri ve İletişim Docker, konteynerler arası iletişimi yönetmek için farklı network sürücüleri sunar: | Sürücü | Kullanım Amacı | | :--- | :--- | | **Bridge** | Varsayılan ağ modudur. Aynı host üzerindeki konteynerlerin haberleşmesini sağlar. | | **Host** | Konteynerin doğrudan host ağını kullanmasını sağlar (yüksek performans). | | **Overlay** | Farklı Docker hostlarındaki (Swarm) konteynerleri birbirine bağlar. | | **None** | Konteynerin ağ bağlantısını tamamen keser. | Özel bir network oluşturmak ve konteyner atamak için: ```bash # Network oluşturma docker network create --driver bridge backend-net # Konteyneri bu ağda başlatma docker run -d --name db-container --network backend-net postgres:latest ``` ## Docker Storage: Veri Kalıcılığı (Volumes vs Bind Mounts) Konteynerler doğası gereği **ephemeral** (geçici) yapılardır. Konteyner silindiğinde içindeki veri de kaybolur. Veriyi kalıcı kılmak için iki ana yöntem vardır: 1. **Volumes:** Docker tarafından yönetilir. `/var/lib/docker/volumes` altında tutulur. En güvenli yöntemdir. 2. **Bind Mounts:** Host sistemindeki spesifik bir klasörü konteynere bağlar. ```bash # Volume oluşturma ve bağlama docker volume create pg_data docker run -d -v pg_data:/var/lib/postgresql/data postgres # Bind mount örneği docker run -d -v /home/user/config:/app/config my-app ``` ## Docker Compose ile Çoklu Konteyner Orkestrasyonu Mikroservis mimarilerinde birden fazla servisi (App, DB, Redis, Nginx) tek bir yapılandırma dosyası ile yönetmek için **Docker Compose** kullanılır. ```yaml version: '3.8' services: web: build: . ports: - "8080:3000" depends_on: - redis redis: image: "redis:alpine" volumes: - redis_data:/data volumes: redis_data: ``` ## Mikroservis Mimarisinde Docker Tasarımı Modern sistem tasarımlarında Docker kullanırken şu prensipler izlenmelidir: - **Single Responsibility:** Her konteyner sadece bir iş yapmalıdır. - **Statelessness:** Konteynerler durum bilgisi saklamamalıdır (State, volume veya harici DB'lerde tutulmalıdır). - **Healthchecks:** Konteynerin sadece çalışıp çalışmadığını değil, uygulamanın sağlıklı olup olmadığını kontrol edin. ```dockerfile HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost/health || exit 1 ``` ## Kaynak Yönetimi ve Performans Docker, host kaynaklarını (CPU ve Bellek) sınırlamanıza izin verir. Bu, bir konteynerin tüm sistemi çökertmesini engeller. ```bash docker run -d \ --name memory-limited-app \ --memory="512m" \ --cpus="1.5" \ my-high-load-app ``` ## Güvenlik ve Best Practices 1. **Root Kullanıcısından Kaçının:** Konteyner içinde uygulamayı `root` yerine düşük yetkili bir kullanıcı ile çalıştırın. 2. **Güncel İmajlar Kullanın:** Güvenlik açıklarını minimize etmek için imajları düzenli güncelleyin. 3. **Secret Yönetimi:** Şifreleri Dockerfile içinde değil, Environment Variables veya Docker Secrets ile yönetin. 4. **Minimal İmajlar:** `alpine` veya `distroless` imajlarını tercih ederek saldırı yüzeyini küçültün. ```dockerfile # Güvenli kullanıcı oluşturma RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser ``` ## Sık Yapılan Hatalar ve Çözümleri - **Veriyi Konteyner İçinde Tutmak:** Konteyner silindiğinde veri gider. Her zaman Volume kullanın. - **İmaj Boyutunu Önemsememek:** Gereksiz paketleri imajdan temizleyin (apt-get clean vb.). - **Hardcoded IP Kullanımı:** Konteynerler arası iletişimde IP yerine servis isimlerini kullanın (Docker DNS). - **Logging:** Logları konteyner içine yazmayın. `stdout` ve `stderr` akışlarını kullanarak Docker Logging Driver'larına bırakın. ```bash # Logları görüntüleme docker logs -f --tail 100 container_name ``` ## Sık Sorulan Sorular (FAQ) **1. Docker ve Sanal Makine (VM) arasındaki fark nedir?** VM'ler bir Hypervisor üzerinde tam bir işletim sistemi çalıştırırken, Docker host işletim sisteminin çekirdeğini paylaşır. Bu sayede Docker daha hızlı başlar ve daha az kaynak tüketir. **2. Docker imajlarını nerede saklayabilirim?** Docker Hub, GitHub Container Registry (GHCR), AWS ECR veya kendi kurduğunuz bir Docker Registry üzerinde saklayabilirsiniz. **3. Docker Compose üretim ortamında kullanılır mı?** Küçük ve orta ölçekli projelerde kullanılabilir ancak büyük ölçekli ve yüksek erişilebilirlik gerektiren sistemlerde Kubernetes veya Docker Swarm tercih edilmelidir. **4. Bir konteyner durduğunda verilerim silinir mi?** Hayır, konteyner durduğunda veriler kalır. Ancak konteyner silindiğinde (remove), Volume kullanmıyorsanız veriler kaybolur. **5. Docker Desktop ücretli mi?** Bireysel kullanım ve küçük işletmeler için ücretsizdir, ancak büyük ölçekli şirketler için Docker Business aboneliği gerekmektedir. ## Özet ve Sonuç Docker, modern DevOps süreçlerinin ve bulut bilişim mimarisinin temel taşıdır. Katmanlı dosya sistemi, izolasyon yetenekleri ve taşınabilirliği sayesinde yazılım geliştirme yaşam döngüsünü (SDLC) hızlandırır. Bu rehberde ele alınan mimari kararlar ve en iyi uygulamalar, projelerinizin ölçeklenebilir ve güvenli bir altyapı üzerinde çalışmasını sağlayacaktır.