Docker Mimarisi: Kurumsal Backend Sistemleri Rehberi
Yazar: Burak Balkı | Kategori: Backend Development | Okuma Süresi: 9 dk
Docker ile ölçeklenebilir backend mimarisi. Konteyner yapısı, ağ yönetimi ve deployment best practices rehberi.
## Docker Nedir ve Mimari Bileşenleri Nelerdir?
**Docker**, uygulamaları tüm bağımlılıklarıyla birlikte izole edilmiş birimler halinde paketlemeyi, dağıtmayı ve çalıştırmayı sağlayan açık kaynaklı bir platformdur. Yazılım dünyasında 'benim makinemde çalışıyordu' sorununa kökten çözüm getiren Docker, sanallaştırmayı işletim sistemi seviyesinde (OS-level virtualization) gerçekleştirir.
Docker'ın temel mimarisi, **Docker Engine** adı verilen ve istemci-sunucu (client-server) modeline dayanan bir yapı üzerine kuruludur. Bu yapı üç ana bileşenden oluşur:
1. **Docker Daemon (dockerd):** Arka planda çalışan ve Docker objelerini (imajlar, konteynerler, ağlar, hacimler) yöneten süreçtir.
2. **Rest API:** İstemcinin Daemon ile konuşmasını sağlayan arayüzdür.
3. **Docker CLI (docker):** Kullanıcının komut satırı üzerinden Docker ile etkileşime girdiği araçtır.
## Docker Engine ve İstemci-Sunucu Mimarisi
Docker mimarisi, işlemlerin ayrıştırılması prensibine dayanır. Docker istemcisi, Docker daemon'a komutlar gönderir ve daemon bu komutları yürüterek konteynerlerin oluşturulmasını, çalıştırılmasını ve dağıtılmasını sağlar. Bu iletişim yerel bir soket üzerinden veya uzak bir ağ üzerinden REST API aracılığıyla gerçekleşebilir.
| Özellik | Sanal Makine (VM) | Docker Konteyner |
| :--- | :--- | :--- |
| **İzolasyon** | Donanım Seviyesinde | İşletim Sistemi Seviyesinde |
| **Hız** | Dakikalar içinde başlar | Saniyeler içinde başlar |
| **Boyut** | GB mertebesinde | MB mertebesinde |
| **Kaynak Kullanımı** | Yüksek (Guest OS içerir) | Düşük (Host OS kernelını paylaşır) |
## Docker Image ve Layered File System (UnionFS) Mantığı
Docker imajları, bir konteyneri oluşturmak için gereken salt okunur (read-only) talimatlar bütünüdür. Docker, imajları oluştururken **Union File System (UnionFS)** adı verilen katmanlı bir dosya sistemi kullanır. Her bir Dockerfile komutu, imaj üzerinde yeni bir katman oluşturur.
```dockerfile
# Katman 1: Temel imaj
FROM node:18-alpine
# Katman 2: Çalışma dizini oluşturma
WORKDIR /app
# Katman 3: Bağımlılıkları kopyalama
COPY package*.json ./
# Katman 4: Bağımlılıkları yükleme
RUN npm install
# Katman 5: Kaynak kodu kopyalama
COPY . .
# Katman 6: Uygulamayı başlatma
CMD ["npm", "start"]
```
> **Not:** Katmanlı yapı sayesinde, sadece değişen katmanlar yeniden inşa edilir. Bu, build sürelerini dramatik şekilde düşürür ve depolama alanından tasarruf sağlar.
## Docker Container Yaşam Döngüsü ve Yönetimi
Bir konteyner, bir imajın çalıştırılabilir örneğidir. Konteynerler, ana makinenin çekirdeğini paylaşır ancak kendi dosya sistemine, işlem alanına (process space) ve ağ arayüzüne sahiptir. Konteyner yaşam döngüsü şu aşamalardan oluşur: `Created -> Running -> Paused -> Stopped -> Deleted`.
Konteyner oluşturmak için temel komut:
```bash
docker run -d --name my-backend-api -p 8080:3000 my-node-app:v1
```
Bu komut, `my-node-app:v1` imajından `my-backend-api` adında, arka planda çalışan (`-d`) ve ana makinenin 8080 portunu konteynerin 3000 portuna bağlayan bir konteyner oluşturur.
## Docker Network Mimarisi ve İletişim Stratejileri
Docker, konteynerlerin birbirleriyle ve dış dünya ile nasıl iletişim kuracağını belirleyen esnek bir ağ sürücüsü (network drivers) yapısına sahiptir.
1. **Bridge:** Varsayılan ağ sürücüsüdür. Aynı ana makinedeki konteynerlerin birbirleriyle konuşmasını sağlar.
2. **Host:** Konteynerin ağ izolasyonunu kaldırır ve doğrudan ana makinenin ağını kullanmasını sağlar.
3. **Overlay:** Farklı fiziksel makinelerdeki (Docker Swarm) konteynerlerin birbirine bağlanmasını sağlar.
4. **None:** Konteynerin tüm ağ bağlantısını keser.
Özel bir bridge ağı oluşturmak izolasyon için kritiktir:
```bash
docker network create backend-net
docker run -d --name database --network backend-net postgres:15
docker run -d --name api --network backend-net my-api-app
```
## Docker Volume ve Veri Kalıcılığı Tasarımı
Konteynerler doğası gereği geçicidir (ephemeral). Konteyner silindiğinde içindeki veriler de silinir. Veriyi kalıcı hale getirmek için **Volumes** ve **Bind Mounts** kullanılır.
- **Volumes:** Docker tarafından yönetilen, ana makinenin dosya sisteminde özel bir alanda tutulan yapılardır. En güvenli yöntemdir.
- **Bind Mounts:** Ana makinedeki herhangi bir dizinin konteynere bağlanmasıdır.
```bash
# Named Volume kullanımı
docker run -d \
--name pg-data \
-v postgres_data:/var/lib/postgresql/data \
postgres:15
```
## Dockerfile Yazım Standartları ve Optimizasyon Teknikleri
Profesyonel bir Dockerfile, hem güvenli hem de optimize olmalıdır. **Multi-stage build** tekniği, üretim ortamı imajlarını küçültmek için standart bir yaklaşımdır.
```dockerfile
# Aşama 1: Build aşaması
FROM golang:1.21-alpine AS builder
WORKDIR /build
COPY . .
RUN go build -o main .
# Aşama 2: Final aşaması (Sadece binary dosyasını alıyoruz)
FROM alpine:latest
WORKDIR /app
COPY --from=builder /build/main .
EXPOSE 8080
CMD ["./main"]
```
Bu yöntemle 800MB'lık bir build imajından 20MB'lık bir production imajı elde edilebilir.
## Docker Compose ile Çoklu Konteyner Orkestrasyonu
Docker Compose, karmaşık uygulamaları (frontend, backend, database, cache) tek bir YAML dosyası ile tanımlayıp yönetmeyi sağlar.
```yaml
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- redis
redis:
image: "redis:alpine"
volumes:
- redis_data:/data
volumes:
redis_data:
```
Çalıştırmak için: `docker-compose up -d`
## Kurumsal Docker Güvenliği ve İmaj Tarama
Kurumsal sistemlerde güvenlik en öncelikli konudur. Docker güvenliği için şu adımlar izlenmelidir:
1. **Root Olmayan Kullanıcı Kullanın:** Konteyner içindeki işlemlerin root yetkisiyle çalışmasını engelleyin.
2. **İmaj Taraması:** `docker scan` veya Trivy gibi araçlarla zafiyet taraması yapın.
3. **Secret Yönetimi:** Şifreleri Dockerfile içinde değil, environment variables veya Docker Secrets ile yönetin.
```dockerfile
# Güvenli kullanıcı oluşturma
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
```
## Performans Optimizasyonu ve Kaynak Sınırlandırma
Bir konteynerin ana makine kaynaklarını (CPU/RAM) sömürmesini engellemek için limitler tanımlanmalıdır.
```bash
docker run -d \
--name heavy-app \
--memory="512m" \
--cpus="0.5" \
my-app
```
Docker Compose üzerinde ise şu şekilde tanımlanır:
```yaml
deploy:
resources:
limits:
cpus: '0.50'
memory: 512M
```
## Sık Yapılan Hatalar ve Çözüm Yolları
1. **Büyük İmaj Boyutları:** Gereksiz dosyaları `.dockerignore` ile hariç tutmamak.
2. **Veriyi Konteyner İçinde Saklamak:** Volume kullanmamak veri kaybına yol açar.
3. **Tek Bir Konteynerde Birden Fazla Servis Çalıştırmak:** Her konteyner tek bir sorumluluğa (Single Responsibility) sahip olmalıdır.
4. **'Latest' Tag'ini Kullanmak:** Production ortamında sürüm karmaşasına yol açar. Daima spesifik versiyonlar kullanın (örn: `node:18.1.0`).
5. **Zombi Süreçler:** `init` sistemini kullanmamak (tini gibi araçlar kullanılabilir).
## Sık Sorulan Sorular (FAQ)
**1. Docker ve Sanal Makine (VM) arasındaki fark nedir?**
Docker işletim sistemi çekirdeğini paylaşırken, VM'ler her biri için ayrı bir işletim sistemi (Guest OS) barındırır. Bu da Docker'ı çok daha hafif ve hızlı kılar.
**2. Docker Compose ve Kubernetes farkı nedir?**
Docker Compose tek bir makinede çoklu konteynerleri yönetmek için kullanılırken, Kubernetes (K8s) yüzlerce makineden oluşan kümeleri (cluster) yönetmek için kullanılan bir orkestrasyon aracıdır.
**3. Docker imajlarımı nerede saklayabilirim?**
Docker Hub, GitHub Container Registry (GHCR), Amazon ECR veya Google Container Registry gibi platformlarda saklayabilirsiniz.
**4. Dockerfile içindeki CMD ve ENTRYPOINT farkı nedir?**
ENTRYPOINT konteynerin ana komutunu belirler ve değiştirilmesi zordur; CMD ise varsayılan parametreleri belirler ve `docker run` sırasında kolayca ezilebilir.
**5. Docker Desktop ücretli mi?**
Bireysel kullanım ve küçük ölçekli işletmeler için ücretsizdir, ancak büyük kurumsal şirketler için ücretli abonelik gerektirir.
## Sonuç: Modern Backend Dünyasında Docker'ın Yeri
Docker, modern yazılım geliştirme süreçlerinin (CI/CD) kalbinde yer almaktadır. Mimari tasarımda sağladığı izolasyon, taşınabilirlik ve ölçeklenebilirlik avantajları, kurumsal sistemlerin stabilitesini artırır. Doğru yapılandırılmış bir Docker ekosistemi, geliştirme maliyetlerini düşürürken operasyonel mükemmelliği beraberinde getirir.