ders_01 / docker_giris
// Konteyner Teknolojileri Eğitimi

Docker ile
Konteyner Dünyası

Kavramlar · Ekosistem · Temel Komutlar

01 / Docker Giriş 02 / Deployment 03 / AWS

3 Derslik Yolculuğumuz

01

Docker Giriş

  • VM vs Konteyner
  • Image, Container, Dockerfile
  • Docker Hub, Compose, Swarm
02

Uygulama

  • ML modeli + FastAPI
  • Dockerfile yazıyoruz
  • Build → Run → Test
03

AWS

  • ECR, ECS, Fargate
  • Canlıya alma
  • Siz test edersiniz
Kavramlar
Deployment
Bulut
Dünyaya Açık

"Benim makinemde çalışıyordu!"

Tanıdık bir senaryo:

Bir model eğittin. Çalışıyor.
Arkadaşına gönderdin.
Arkadaşın çalıştırmaya çalıştı...

ModuleNotFoundError: No module named 'tensorflow'
AttributeError: 'Sequential' has no 'predict_classes'
# TF 2.9 → 2.15 sürüm farkı
Works on
my machine
Yazılımcının en klasik problemi

Neden Çalışmıyor?

Kodun çalışması için tüm katmanların uyumlu olması gerekiyor:

Kodunuz — main.py, model.h5
Kütüphaneler — tensorflow 2.15, numpy 1.26, pillow 10.3
Python Sürümü — 3.11.2
İşletim Sistemi — Ubuntu 22.04 / macOS 14 / Windows 11
Donanım — x86_64 / ARM (Apple Silicon)
Tek sorun ortam uyumsuzluğu değil — klasik çözüm VM ise onun da ciddi bedeli var.

VM ile izole etsek?

  • Her VM için tam OS — 2-4 GB RAM overhead
  • 10 servis = 10 OS güncellemesi, bakım, lisans
  • Yeni VM başlatmak: dakikalar, bazen saatler
  • Boşta bile kaynak tüketiyor

Maliyet gerçeği

  • 8 mikro servis × VM = yüksek bulut faturası
  • Scale etmek yavaş ve pahalı
  • DevOps zamanı: patch, güvenlik, lisans
  • Küçük ekiplerde sürdürülemez

Docker'ın Cevabı

[ ortamı da paketle ]

Eskiden

  • requirements.txt gönder, "Python 3.11 kur" de
  • CUDA versiyonunu eşleştir — OS farkı, hata
  • VM kur: her servis için 2-4 GB RAM overhead
  • 10 servis = 10 OS güncellemesi, lisans, bakım
  • Ölçekleme yavaş, bulut faturası yüksek

Docker ile

  • Image push et → docker run → bitti
  • Linux, Mac, Windows, AWS — aynı image
  • Konteyner ≈ MB, VM ≈ GB — kernel paylaşımı
  • Yeni konteyner <1 sn, --scale api=10 tek komut
  • Dev → CI → Prod → AWS: ortam farkı sıfır

Sanal Makine (VM) Nedir?

Fiziksel bir sunucunun üzerinde, sanki ayrı bir bilgisayarmış gibi çalışan tam bir işletim sistemi kopyası.

VM 1 — Ubuntu + App A
VM 2 — Windows + App B
Hypervisor (VMware / VirtualBox / KVM)
Host İşletim Sistemi
Fiziksel Sunucu

VM Özellikleri

  • Tam izolasyon (ayrı kernel)
  • Tam işletim sistemi kopyası
  • Boyut: Gigabaytlar
  • Başlangıç: Dakikalar
  • RAM/CPU ağır
  • Güçlü izolasyon

Konteyner Nedir?

Aynı işletim sistemi çekirdeğini paylaşan, izole edilmiş süreçler. Sadece uygulama katmanını paketler.

Konteyner 1 — App A
Konteyner 2 — App B
Konteyner 3 — App C
Docker Engine (Runtime)
Host OS + Kernel — paylaşımlı
Fiziksel Sunucu

Konteyner Özellikleri

  • Kernel paylaşır
  • Sadece uygulama katmanı paketlenir
  • Boyut: Megabaytlar
  • Başlangıç: Saniyeler
  • Düşük kaynak tüketimi
  • Yüksek taşınabilirlik

VM vs Konteyner

ÖzellikSanal Makine (VM)Konteyner
İzolasyonTam (ayrı kernel)Süreç seviyesi
BoyutGigabaytlarMegabaytlar
BaşlangıçDakikalarSaniyeler
Kaynak tüketimiYüksekDüşük
TaşınabilirlikOrtaÇok yüksek
Güvenlik izolasyonuÇok güçlüİyi
Kullanım alanıFarklı OS gerektiğindeUygulama dağıtımı
Analoji: VM = Ayrı bir bina kiralamak. Konteyner = Aynı binada farklı ofisler.

Docker Nasıl Çalışır?

Docker 3 bileşenden oluşur: Client (komutları gönderir) · Daemon (her şeyi yönetir) · Registry (image'ları depolar). docker run, docker build, docker pull — hepsi bu üçgen üzerinden çalışır.
Docker Mimarisi — Client, Docker Daemon ve Registry

Docker Image — "Tarif"

Image = Salt okunur şablon. Dockerfile'dan üretilir. Çalışmaz, sadece tarifi içerir.

Bir image içinde ne var?

  • Base OS (python:3.11-slim)
  • Kütüphaneler (tensorflow, fastapi...)
  • Uygulama kodu (main.py, model.py...)
  • Başlatma komutu (CMD)
Uygulama Kodu — main.py, model.py
Kütüphaneler — tensorflow, fastapi
Python 3.11
Debian Slim — linux base

Her katman önbelleğe alınır. Değişen katmandan sonrası rebuild edilir.

Image Katman Yapısı

Her Dockerfile satırı yeni bir katman (layer) oluşturur. Katmanlar read-only'dir, önbelleğe alınır ve container'lar arasında paylaşılır.

Docker Image Nedir?

docker build sonrasında Dockerfile'daki talimatlara göre read-only, statik yapıda bir image dosyası oluşturulur.

Dockerfile'daki her satıra karşılık Image içinde bir layer oluşur. Image = katmanlar topluluğudur.

Docker Image Yapısı — Katmanlar
writable — Container Layer R/W
COPY app/ app/ Image Layer
RUN pip install tensorflow Image Layer
COPY requirements.txt . Image Layer
FROM python:3.11-slim Base Image
Linux Kernel Host OS

↑ her katman üsttekini referans alır

Container — "Tarif Hayata Geçince"

Container = Image'dan çalışan örnek (instance). Bir image'dan sonsuz container açılabilir.

Image → Container

image-classifier:v1
↓ docker run
classifier-1  (:8000)
classifier-2  (:8001)
classifier-3  (:8002)

Temel Komutlar

# Image listesi
docker images

# Çalışanlar
docker ps

# Çalıştır
docker run -d -p 8000:8000 myapp:v1

# Durdur / Sil
docker stop myapp
docker rm myapp

Dockerfile — "Tarif Defteri"

# 1. Base image
FROM python:3.11-slim

# 2. Çalışma dizini
WORKDIR /app

# 3. Önce bağımlılıklar (cache!)
COPY requirements.txt .
RUN pip install -r requirements.txt

# 4. Sonra uygulama kodu
COPY app/ app/

# 5. Dinlenen port
EXPOSE 8000

# 6. Başlangıç komutu
CMD ["uvicorn", "app.main:app",
     "--host", "0.0.0.0", "--port", "8000"]
COPY requirements önce neden?
Kod değiştiğinde sadece son 2 katman rebuild edilir. pip install tekrar çalışmaz → hız!
--host 0.0.0.0 neden?
127.0.0.1 container içine kapanır. 0.0.0.0 dışarıdan port mapping ile erişimi açar.

Dockerfile vs Docker Compose

Dockerfile vs Docker Compose karşılaştırması

Dockerfile

  • Tek container tarif eder
  • Image nasıl inşa edilir?
  • docker build ile kullanılır
  • Tek servis → yeterli

Docker Compose

  • Birden fazla servisi yönetir
  • API + DB + Cache = tek YAML dosyası
  • docker compose up ile çalışır
  • Geliştirme ortamı için ideal
İkisi birbirini tamamlar. Compose, Dockerfile'ı kullanır.

Docker Hub — "Image Kütüphanesi"

Docker Hub, image'ları saklayıp paylaştığınız merkezi registry'dir.
GitHub nasıl kodun deposuysa, Hub da image'ların deposudur.

Popüler Resmi Image'lar

  • python:3.11-slim
  • nginx:latest
  • postgres:15-alpine
  • redis:7-alpine

Temel Komutlar

# İndir
docker pull nginx

# Etiketle
docker tag myapp:v1 user/myapp:v1

# Yükle
docker push user/myapp:v1
AWS karşılığı:
ECR (Elastic Container Registry) — özel, şirket içi registry

Port Mapping & Volume

Port Mapping — -p

docker run -p 8080:8000 myapp
#         ↑host  ↑container

Tarayıcıdan :8080 → container'ın :8000 portuna.

Birden fazla container:
-p 8001:8000, -p 8002:8000...

Volume — -v

Container silinince veriler gider. Volume ile kalıcı olur.

docker run -v /host/data:/app/data myapp
Kullanım: veritabanı verileri, yüklenen dosyalar, log dosyaları

Docker Compose

version: "3.8"

services:
  api:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      - redis

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

Komutlar

docker compose up -d

docker compose logs -f

# 3 api instance
docker compose up --scale api=3

docker compose down
Birden fazla servisi tek dosyayla yönet. Geliştirme ve test için ideal.

Swarm ve Ekosistem

Docker Swarm

Birden fazla sunucuya container dağıtmak için Docker'ın orkestrasyon çözümü.

  • Manager + Worker node'lar
  • Otomatik yük dağıtımı
  • --replicas 5 ile ölçekleme
  • Kurulumu basit

Kubernetes (K8s)

Endüstri standardı. Swarm'dan güçlü, daha karmaşık. AWS'de EKS olarak gelir.

Ekosistem Haritası
BULUT  ·  AWS ECS / EKS / Azure ACI
ORKESTRASYON  ·  Swarm / Kubernetes
COMPOSE  ·  çoklu container yönetimi
container
container
container
container
compose → yerel  ·  swarm / k8s → prod
Dockerfile
Image
Registry
Docker Hub / ECR / GHCR

1. Dersi Tamamladık

[ ]

Image

Salt okunur şablon. Dockerfile'dan üretilir.

Container

Image'dan çalışan örnek. Saniyeler içinde başlar.

Dockerfile

Image nasıl inşa edilir? FROM, RUN, COPY, CMD.

Sonraki ders: Gerçek bir ML modelini Docker ile paketleyip çalıştırıyoruz.