Docker Temelleri
Docker, uygulamaları container adı verilen hafif, taşınabilir ve izole ortamlarda paketleyip çalıştırmanızı sağlayan bir platformdur. "Benim makinemde çalışıyor" problemini kökten çözer — bir container, geliştirme ortamından production'a kadar her yerde aynı şekilde çalışır. Bu derste Docker'ın temel kavramlarını, mimarisini ve en sık kullanılan komutlarını öğreneceğiz.
Container vs Virtual Machine (VM)
Her iki teknoloji de izolasyon sağlar, ancak temelden farklı yaklaşımlar kullanır:
Virtual Machine: Her VM, kendi tam işletim sistemi (guest OS) çalıştırır. Hypervisor, fiziksel donanımı sanallaştırarak birden fazla VM'in aynı makinede çalışmasını sağlar.
┌─────────┐ ┌─────────┐ ┌─────────┐
│ App A │ │ App B │ │ App C │
│ Bins │ │ Bins │ │ Bins │
│ Guest OS │ │ Guest OS │ │ Guest OS │ ← Her VM kendi OS'u
├─────────┴─┴─────────┴─┴─────────┤
│ Hypervisor │
├──────────────────────────────────┤
│ Host OS / Hardware │
└──────────────────────────────────┘Container: Host OS'un çekirdeğini paylaşır (Linux kernel). Her container, process-level izolasyon sağlayan bir namespace ve kaynak sınırlaması sağlayan cgroup kullanır. Kendi OS'unu taşımaz.
┌─────────┐ ┌─────────┐ ┌─────────┐
│ App A │ │ App B │ │ App C │
│ Bins │ │ Bins │ │ Bins │
├─────────┴─┴─────────┴─┴─────────┤
│ Docker Engine │ ← Paylaşılan kernel
├──────────────────────────────────┤
│ Host OS / Hardware │
└──────────────────────────────────┘| Kriter | Virtual Machine | Container |
|---|---|---|
| Başlatma süresi | Dakikalar | Saniyeler (veya milisaniyeler) |
| Boyut | GB'lar (OS dahil) | MB'lar (sadece uygulama + bağımlılıklar) |
| Kaynak kullanımı | Yüksek | Düşük |
| İzolasyon | Donanım seviyesi (güçlü) | Process seviyesi (yeterli) |
| Taşınabilirlik | Hypervisor'a bağlı | Her yerde çalışır |
| Yoğunluk | Az VM/makine | Çok container/makine |
Docker Mimarisi
Docker, client-server mimarisi kullanır:
┌──────────────┐ ┌──────────────────────────────────┐
│ Docker CLI │──API──▶│ Docker Daemon (dockerd) │
│ (docker build │ │ │
│ docker run │ │ ┌──────────┐ ┌──────────────┐ │
│ docker push) │ │ │ Images │ │ Containers │ │
│ │ │ └──────────┘ └──────────────┘ │
└──────────────┘ │ ┌──────────┐ ┌──────────────┐ │
│ │ Volumes │ │ Networks │ │
│ └──────────┘ └──────────────┘ │
└──────────────────────────────────┘
│
▼
┌──────────────────────────┐
│ Docker Registry │
│ (Docker Hub, ECR, GCR) │
└──────────────────────────┘Docker Client (CLI): Kullanıcının Docker daemon ile etkileşimini sağlayan komut satırı aracı.
Docker Daemon (dockerd): Container'ları oluşturan, çalıştıran ve yöneten arka plan servisi.
Docker Registry: Docker image'larının depolandığı merkezi havuz (Docker Hub, Amazon ECR, Google GCR).
Image Layers (Katmanlar)
Docker image'ları katmanlı bir dosya sistemi kullanır. Her Dockerfile talimatı yeni bir katman oluşturur. Katmanlar read-only ve paylaşılabilir'dir.
┌─────────────────────────────┐
│ Layer 4: COPY app.jar │ ← Uygulama (değişken)
├─────────────────────────────┤
│ Layer 3: RUN apt-get update │ ← Bağımlılıklar
├─────────────────────────────┤
│ Layer 2: ENV JAVA_HOME ... │ ← Ortam değişkenleri
├─────────────────────────────┤
│ Layer 1: FROM eclipse-temurin:21 │ ← Base image (JDK)
└─────────────────────────────┘Katman sistemi iki büyük avantaj sağlar:
Paylaşım: Aynı base image'ı kullanan farklı container'lar, alt katmanları paylaşır. 10 Spring Boot uygulamanız aynı JDK image'ını kullanıyorsa, JDK katmanı disktte yalnızca bir kez saklanır.
Cache: Build sırasında değişmeyen katmanlar cache'ten gelir. Sadece değişen katmanlar yeniden oluşturulur — bu, build süresini dramatik şekilde kısaltır.
Dockerfile Talimatları
Dockerfile, bir Docker image'ının nasıl oluşturulacağını tanımlayan metin dosyasıdır. Temel talimatlar:
# FROM — Base image seçimi (zorunlu, ilk talimat olmalı)
FROM eclipse-temurin:21-jre-alpine
# LABEL — Metadata
LABEL maintainer="dev@example.com"
LABEL version="1.0"
# ENV — Ortam değişkeni
ENV APP_HOME=/app
ENV JAVA_OPTS="-Xmx512m -Xms256m"
# WORKDIR — Çalışma dizini (yoksa oluşturulur)
WORKDIR $APP_HOME
# COPY — Dosya kopyalama (host → image)
COPY target/myapp.jar app.jar
COPY config/ config/
# ADD — COPY gibi ama URL indirme ve tar açma desteği var
# ADD https://example.com/file.tar.gz /tmp/
# RUN — Build sırasında komut çalıştırma
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
RUN chmod +x app.jar
# USER — Container'ın çalışacağı kullanıcı
USER appuser
# EXPOSE — Hangi port'un kullanılacağını belgeleme (dökümantasyon amaçlı)
EXPOSE 8080
# HEALTHCHECK — Sağlık kontrolü
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD wget -qO- http://localhost:8080/actuator/health || exit 1
# CMD — Container başlatıldığında çalışacak varsayılan komut
CMD ["java", "-jar", "app.jar"]
# ENTRYPOINT — Her zaman çalışacak komut (CMD ile birlikte kullanılabilir)
# ENTRYPOINT ["java", "-jar", "app.jar"]CMD vs ENTRYPOINT farkı:
CMD: Varsayılan komut.docker runsırasında override edilebilir.ENTRYPOINT: Sabit giriş noktası.docker runargümanları ENTRYPOINT'e eklenir.Birlikte kullanım:
ENTRYPOINT ["java", "-jar"]+CMD ["app.jar"]→docker run myapp other.jarile JAR adı değiştirilebilir.
Temel Docker Komutları
# Image oluşturma
docker build -t myapp:1.0 .
docker build -t myapp:latest -f Dockerfile.prod .
# Container çalıştırma
docker run -d --name myapp -p 8080:8080 myapp:1.0
docker run -d -p 8080:8080 -e SPRING_PROFILES_ACTIVE=prod myapp:1.0
docker run --rm -it myapp:1.0 /bin/sh # interaktif shell
# Container yönetimi
docker ps # çalışan container'lar
docker ps -a # tüm container'lar (durmuş dahil)
docker logs myapp # logları görüntüle
docker logs -f myapp # logları canlı takip
docker exec -it myapp sh # çalışan container'a shell aç
docker stop myapp # durdur
docker rm myapp # sil
# Image yönetimi
docker images # listeye
docker rmi myapp:1.0 # sil
docker tag myapp:1.0 registry.example.com/myapp:1.0
# Registry işlemleri
docker login # Docker Hub'a giriş
docker push registry.example.com/myapp:1.0
docker pull eclipse-temurin:21-jre-alpine
AI Asistan
Sorularını yanıtlamaya hazır