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.