Adım 1 — Docker ve Konteyner Kavramı
Docker konteynerleri, bir uygulamanın çalışması için gerekli tüm bağımlılıkları ve konfigürasyonları tek bir paket içinde barındırır. Bu sayede:
- “It works on my machine” sorununu ortadan kaldırır.
- Aynı imaj farklı ortamlarda aynı şekilde çalışır.
- Uygulamalar hızlı şekilde başlatılıp durdurulabilir.
Konteynerlerin temelini Linux namespace ve cgroups mekanizmaları oluşturur. Namespace, her konteynerin kendi ağ, süreç, kullanıcı uzayına sahip olmasını sağlar. Cgroups ise kaynak sınırlandırması yapar (CPU, RAM, disk).
Adım 2 — Docker Kurulumu
Ubuntu/Debian üzerinde kurulum
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Kurulum sonrası kontrol:
docker --version
docker compose version
Docker servisinin aktif çalıştığını doğrulayın:
sudo systemctl status docker
Adım 3 — Docker Images Yönetimi
Docker imajları, konteynerlerin çalıştırılabilmesi için gereken dosya sistemini ve bağımlılıkları içerir.
# İmaj çekme
docker pull nginx:latest
# İmaj listesi
docker images
# İmaj silme
docker rmi nginx:latest
# İmaj etiketleme
docker tag nginx:latest myrepo/nginx:v1
# İmaj kaydetme ve yükleme
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
İmajlar katmanlı bir yapıya sahiptir. Bu yapı sayesinde disk kullanımı ve build süreleri optimize edilir. Best practice olarak her Dockerfile satırı mantıklı şekilde gruplandırılmalı ve gereksiz paketler kaldırılmalıdır.
Adım 4 — Docker Containers Yönetimi
Konteynerler, imajların çalışan örnekleridir.
# Konteyner başlatma
docker run -d --name web -p 8080:80 nginx:latest
# Çalışan konteynerleri listeleme
docker ps
# Tüm konteynerleri listeleme
docker ps -a
# Konteyner logları
docker logs -f web
# Konteyner içine bağlanma
docker exec -it web bash
# Konteyner durdurma/başlatma
docker stop web
docker start web
# Konteyner silme
docker rm web
Konteynerler ephemeral doğadadır; kalıcı veri için volume kullanılmalıdır.
Adım 5 — Volumes ve Veri Yönetimi
Volumes, verilerin konteyner yaşam döngüsünden bağımsız olarak saklanmasını sağlar.
# Volume oluşturma
docker volume create mydata
# Volume detayları
docker volume inspect mydata
# Volume kullanma
docker run -d -v mydata:/var/lib/mysql mysql:8
# Bind mount örneği
docker run -d -v $(pwd)/html:/usr/share/nginx/html nginx:latest
# Volume yedekleme
docker run --rm -v mydata:/data -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
Volume kullanımı veri güvenliği, yedekleme ve paylaşılan dosya yönetimi açısından kritiktir.
Adım 6 — Network Yönetimi
Docker network’leri konteynerler arası iletişimi sağlar.
# Network listesi
docker network ls
# Network oluşturma
docker network create mynet
# Network detayları
docker network inspect mynet
# İki konteyneri aynı network üzerinde çalıştırma
docker run -d --name db --network=mynet mysql:8
docker run -d --name app --network=mynet myapp:latest
Network türleri:
- bridge (default)
- host (host network kullanımı)
- overlay (Swarm/K8s cluster)
- macvlan (fiziksel network entegrasyonu)
Adım 7 — Docker Compose
Docker Compose, birden fazla servisi tanımlamak için YAML dosyası kullanır.
docker-compose.yml örneği:
version: '3.8'
services:
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: appdb
app:
build: ./app
ports:
- "5000:5000"
depends_on:
- db
Çalıştırma:
docker compose up -d
docker compose ps
docker compose logs -f
Adım 8 — Registry Kullanımı
# Docker Hub’a login
docker login
# İmaj push etme
docker tag myapp:latest mydockerhub/myapp:1.0
docker push mydockerhub/myapp:1.0
# Private registry çalıştırma
docker run -d -p 5000:5000 --name registry registry:2
# İmaj push/pull
docker tag myapp:latest localhost:5000/myapp:1.0
docker push localhost:5000/myapp:1.0
docker pull localhost:5000/myapp:1.0
Registry yönetimi ile imaj paylaşımı ve versiyonlama kolaylaşır.
Adım 9 — Dockerfile ve Multi-stage Build
Örnek Dockerfile:
# Stage 1 — Builder
FROM golang:1.20 AS builder
WORKDIR /src
COPY . .
RUN go build -o app .
# Stage 2 — Runtime
FROM debian:bookworm-slim
WORKDIR /app
COPY --from=builder /src/app .
CMD ["./app"]
Multi-stage build sayesinde gereksiz dosyalar final imaja dahil edilmez ve imaj boyutu küçülür.
Adım 10 — Orkestrasyon (Swarm & kısa K8s karşılaştırması)
# Swarm başlatma
docker swarm init
# Service oluşturma
docker service create --name web --replicas 3 -p 80:80 nginx
# Servis listesi
docker service ls
# Servis ölçeklendirme
docker service scale web=5
Swarm basit orkestrasyon için yeterliyken, Kubernetes çok daha gelişmiş özellikler sunar.
Adım 11 — Güvenlik
- Rootless Docker
- Least privilege ilkesi
- Image tarama (Trivy)
- Secrets yönetimi
- TLS ile güvenli iletişim
Adım 12 — Monitoring ve Logging
# Resource kullanımı
docker stats
# Log izleme
docker logs -f web
Prometheus, cAdvisor, ELK veya Loki entegrasyonları ile gözlemlenebilirlik artırılır.
Adım 13 — Örnek Senaryo: Web Uygulaması Dockerize Etme
Flask tabanlı bir Python uygulamasını Dockerize etme adımları:
- Dockerfile oluşturma
- docker-compose.yml ile veritabanı ekleme
- Build ve run adımları
Sonuç
Bu makalede Docker’ın temellerinden ileri kullanımına kadar adım adım öğrendiniz. Images, containers, volumes, networks, Compose, registry ve Swarm konularını deneyimlediniz. Artık kendi projelerinizi Dockerize edebilir ve daha büyük orkestrasyon çözümlerine geçiş yapabilirsiniz.
Sonraki Adımlar
- Docker resmi belgelerini inceleyin
- Kubernetes öğrenmeye başlayın
- CI/CD pipeline’ınıza Docker entegrasyonu ekleyin