İçeriğe geç

Docker Nedir? Container Teknolojisi Rehberi

T
Tolgahan
· · 16 dk okuma · 92 görüntülenme

Docker Nedir? Container Teknolojisi Rehberi

Bir sahne hayal et: geliştirici olarak haftalardır bir uygulama üzerinde çalışıyorsun. Kendi bilgisayarında her şey mükemmel çalışıyor. Uygulamayı sunucuya deploy ediyorsun ve... çalışmıyor. "Ama benim bilgisayarımda çalışıyordu!" diye söyleniyorsun. Sunucudaki Node.js versiyonu farklı, bir kütüphane eksik, işletim sistemi farklı davranıyor. Bu sahne, yazılım dünyasının en eski ve en sinir bozucu problemidir.

Docker, tam olarak bu problemi çözmek için doğdu. Uygulamanı, tüm bağımlılıklarıyla birlikte izole bir paket (container) içine koyar ve "nerede çalıştırırsan çalıştır, aynı şekilde davranacağını" garanti eder. Bu yazıda Docker nedir, container teknolojisi nasıl çalışır, neden bu kadar popüler oldu ve nasıl öğrenebilirsin — hepsini sade bir dille, gerçek örneklerle anlatacağız.


1. Docker Nedir?

Docker, uygulamaları container adı verilen hafif, taşınabilir ve izole ortamlarda çalıştırmayı sağlayan açık kaynaklı bir platformdur. 2013 yılında Solomon Hykes tarafından dotCloud şirketinde geliştirilmiş ve kısa sürede yazılım dünyasını kökünden değiştirmiştir.

Docker'ın sloganı her şeyi özetliyor: "Build, Ship, Run" — Oluştur, Gönder, Çalıştır. Yani uygulamanı bir kere paketlersin, herhangi bir yere gönderirsin ve her yerde aynı şekilde çalıştırırsın.

Docker'ı anlamak için bir analogiye başvuralım: nakliye konteynerleri. 1950'lerden önce mallar gemilere tek tek yüklenirdi — farklı boyutlarda kutular, çuvallar, variller. Her limanda farklı yükleme-boşaltma yöntemi gerekiyordu. Sonra standart konteynır icat edildi: aynı boyut, aynı bağlantı noktaları, dünyanın her limanında aynı vinçle yüklenip boşaltılabilen kutular. İçinde ne olduğu farketmez — elektronik, gıda, tekstil — konteynır aynı şekilde taşınır.

Docker da yazılım dünyasında aynı devrimi yaptı. Uygulamanın ne olduğu önemli değil — Python web uygulaması, Java microservice, Node.js API — hepsini standart bir container'a koy, her yerde çalıştır.

💡 Kısaca: Docker nedir sorusunun en sade cevabı — uygulamaları ve bağımlılıklarını izole container'lar içinde paketleyip çalıştıran bir platformdur.


2. Container Nedir? VM vs Container

Container nedir sorusunu anlamak için önce sanal makineleri (VM) bilmek gerekir.

Sanal Makine (VM) Nedir?

Sanal makine, fiziksel bir bilgisayar üzerinde tamamen ayrı bir işletim sistemi çalıştıran teknolojidir. Her VM kendi kernel'ı, kendi kütüphaneleri ve kendi uygulamalarıyla birlikte gelir.

Container Nedir?

Container ise uygulamayı ve bağımlılıklarını izole bir ortamda çalıştırır, ancak host işletim sisteminin kernel'ını paylaşır. Kendi başına tam bir işletim sistemi taşımaz.

VM vs Container Karşılaştırma

ÖzellikSanal Makine (VM)Container (Docker)
BoyutGigabyte'lar (GB)Megabyte'lar (MB)
Başlatma süresiDakikalarSaniyeler (hatta milisaniyeler)
İşletim sistemiKendi OS'u var (tam)Host OS kernel'ını paylaşır
İzolasyonTam izolasyon (hypervisor)Proses seviyesinde izolasyon
Kaynak kullanımıYüksek (her VM'e RAM/CPU ayrılır)Düşük (paylaşımlı kernel)
TaşınabilirlikDüşük (VM imajları büyük)Yüksek (image'lar küçük ve taşınabilir)
YoğunlukBir sunucuda 10-20 VMBir sunucuda yüzlerce container
HypervisorGerekli (VMware, Hyper-V, KVM)Gerekli değil (Docker Engine yeterli)

Analogiyle anlatayım: VM bir müstakil ev gibidir — kendi temeli, çatısı, su ve elektrik tesisatı var. Container ise bir apartman dairesi — temel altyapıyı (kernel) paylaşır ama kendi iç mekanına (uygulama + bağımlılıklar) sahiptir. Apartman hem daha az kaynak tüketir hem de daha çok "kiracı" barındırır.

⚠️ Dikkat: Container'lar VM'lerin yerine geçmez — tamamlayıcıdır. Güvenlik gereksinimleri çok yüksek ortamlarda veya farklı OS kernel'ları gerektiğinde (Linux üzerinde Windows çalıştırmak gibi) hâlâ VM'ler tercih edilir.


3. Docker Ne İşe Yarar?

Docker ne işe yarar sorusunun cevabını somut problemlerle anlatayım:

Problem 1: "Benim Bilgisayarımda Çalışıyordu"

Developer'ın bilgisayarında Python 3.11, sunucuda Python 3.8 yüklü. Developer Redis 7 kullanıyor, sunucuda Redis 6 var. Docker ile uygulamayı, Python ve Redis'in doğru versiyonlarıyla birlikte paketlersin. Nerede çalıştırırsan çalıştır, aynı ortam.

Problem 2: Yeni Developer Ekibe Katıldı

Yeni bir developer ekibe katıldığında, projenin çalışması için PostgreSQL, Redis, Elasticsearch, Node.js'in belirli versiyonlarını kurması gerekiyor. Bu süreç saatler sürebilir ve "bende çalışmadı" döngüsüne girebilir. Docker Compose ile tek bir komutla tüm ortam ayağa kalkar:

docker compose up -d

Problem 3: Microservice'lerin Yönetimi

10 farklı microservice'in var — her biri farklı dilde, farklı bağımlılıklarla. Her birini ayrı ayrı kurmak, çalıştırmak ve yönetmek kabus. Docker ile her service bir container'da çalışır, birbirinden izole ama aynı ağda iletişim kurabilir.

Problem 4: CI/CD Pipeline

Kodun her commit'te otomatik test edilmeli ve deploy edilmeli. Docker ile test ortamını bir container'da oluşturursun — her seferinde temiz, tutarlı bir ortam. Build artefaktını Docker image olarak paketler ve production'a ship edersin.

Problem 5: Ölçeklendirme (Scaling)

Black Friday geldi, trafik 10 kat arttı. Docker container'ları saniyeler içinde çoğaltılabilir. Trafik düşünce container'lar kapatılır. Kaynaklar verimli kullanılır, fatura düşer.


4. Docker'ın Temel Kavramları

Docker ekosistemini anlamak için altı temel kavramı bilmelisin:

Docker Image (İmaj)

Image, bir uygulamanın şablonudur — read-only (salt okunur) bir pakettir. İçinde uygulamanın kodu, runtime'ı, kütüphaneleri, çevre değişkenleri ve ayar dosyaları bulunur.

Image'ı bir reçete gibi düşün. Pastanın tarifi (image) farklı, pişmiş pasta (container) farklıdır. Tek bir reçeteden istediğin kadar pasta yapabilirsin.

# Mevcut image'ları listele
docker images

# Docker Hub'dan bir image indir
docker pull nginx:latest
docker pull python:3.12-slim

Docker Container

Container, bir image'ın çalışan örneğidir. Image'ı alırsın, ondan bir container oluşturursun ve çalıştırırsın. Aynı image'dan birden fazla container oluşturabilirsin — her biri bağımsız çalışır.

# Image'dan container oluştur ve çalıştır
docker run -d --name my-nginx -p 8080:80 nginx:latest

# Çalışan container'ları listele
docker ps

# Tüm container'ları listele (durmuş olanlar dahil)
docker ps -a

Dockerfile

Dockerfile, bir Docker image'ının nasıl oluşturulacağını tanımlayan metin dosyasıdır. Her satır bir "katman" (layer) oluşturur ve bu katmanlar cache'lenir.

# Temel image
FROM python:3.12-slim

# Çalışma dizini
WORKDIR /app

# Bağımlılıkları kopyala ve yükle
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Uygulama kodunu kopyala
COPY . .

# Portu aç
EXPOSE 8000

# Uygulamayı başlat
CMD ["python", "app.py"]

Docker Registry

Registry, Docker image'larının depolandığı yerdir. Docker Hub en popüler public registry'dir — GitHub'ın Docker versiyonu gibi düşün. Ayrıca özel (private) registry'ler de kurulabilir (AWS ECR, Google GCR, Azure ACR, GitHub Container Registry).

# Docker Hub'a image push et
docker push username/my-app:1.0

# Özel registry'den image çek
docker pull registry.example.com/my-app:latest

Docker Volume

Container'lar varsayılan olarak ephemeral (geçici) dir — container silindiğinde içindeki veriler de silinir. Volume'lar, verileri container'dan bağımsız olarak kalıcı saklamanı sağlar.

# Volume oluştur
docker volume create my-data

# Container'a volume bağla
docker run -d \
  --name my-postgres \
  -v my-data:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  postgres:16

Docker Network

Container'lar birbirleriyle ve dış dünyayla iletişim kurmak için network'lere bağlanır. Docker varsayılan olarak bridge, host ve none network'leri sağlar.

# Özel network oluştur
docker network create my-network

# Container'ı network'e bağla
docker run -d --name api --network my-network my-api:latest
docker run -d --name db --network my-network postgres:16

Aynı network'teki container'lar birbirlerine isimle ulaşabilir. Yukarıdaki örnekte api container'ı db container'ına db:5432 adresiyle bağlanabilir.


5. Docker Nasıl Çalışır?

Docker'ın teknik mimarisini sade bir dille anlatalım:

Docker Engine

Docker Engine, Docker'ın kalbidir. Üç ana bileşenden oluşur:

  1. Docker Daemon (dockerd): Arka planda çalışan servis. Container'ları oluşturur, çalıştırır ve yönetir. Image'ları build eder.

  2. Docker Client (docker CLI): Kullanıcının Docker ile etkileşim kurduğu komut satırı aracı. docker run, docker build, docker push gibi komutları daemon'a gönderir.

  3. Docker Registry: Image'ların depolandığı yer. Client, image'ları registry'den çeker (pull) veya gönderir (push).

Tipik bir akış şöyle çalışır:

Sen (terminal) → Docker Client → Docker Daemon → Container çalışır
                                       ↕
                               Docker Registry
                              (Docker Hub vb.)

Container İzolasyonu Nasıl Sağlanır?

Docker, Linux kernel'ının iki temel özelliğini kullanır:

  • Namespaces: Her container'a kendi PID, network, mount, user namespace'ini verir. Container, sadece kendi proseslerini görür — host'taki diğer proseslerden habersizdir.

  • cgroups (Control Groups): Her container'ın kullanabileceği CPU, RAM, disk I/O miktarını sınırlar. Bir container'ın tüm sistem kaynaklarını tüketmesini engeller.

Bu ikisi birlikte, container'ların birbirinden ve host'tan izole çalışmasını sağlar — sanal makine kadar ağır olmadan.


6. Docker ile İlk Container

Hadi Docker'ı pratikte görelim. Adım adım ilk container'ını çalıştıralım.

Adım 1: Docker Kurulumu

# Ubuntu/Debian
sudo apt update
sudo apt install docker.io docker-compose-v2
sudo systemctl start docker
sudo systemctl enable docker

# Kullanıcını docker grubuna ekle (sudo'suz kullanmak için)
sudo usermod -aG docker $USER

macOS ve Windows için [Docker Desktop](https://www.docker.com/products/docker-desktop/) uygulamasını kurabilirsin.

Adım 2: İlk Container'ı Çalıştır

# Nginx web sunucusunu çalıştır
docker run -d --name web -p 8080:80 nginx:latest

Bu komut ne yapar?

  • -d → Arka planda (detached) çalıştır

  • --name web → Container'a "web" ismini ver

  • -p 8080:80 → Host'un 8080 portunu container'ın 80 portuna yönlendir

  • nginx:latest → Nginx image'ının en son versiyonunu kullan

Tarayıcıda http://localhost:8080 adresine git — Nginx karşılama sayfasını göreceksin.

Adım 3: Container ile Etkileşim

# Çalışan container'ları listele
docker ps

# Container loglarını görüntüle
docker logs web

# Container'ın içine gir (interaktif shell)
docker exec -it web bash

# Container içinde komut çalıştır
ls /usr/share/nginx/html/
cat /etc/nginx/nginx.conf
exit

# Container'ı durdur
docker stop web

# Container'ı başlat
docker start web

# Container'ı sil (önce durdurulmalı)
docker stop web
docker rm web

Adım 4: Python Uygulaması Çalıştır

# Python container'da interaktif çalış
docker run -it --rm python:3.12-slim python -c "
import sys
print(f'Python versiyonu: {sys.version}')
print('Docker container içinde çalışıyorum!')
for i in range(5):
    print(f'  Sayı: {i+1}')
"

--rm flag'i, container durduğunda otomatik olarak silinmesini sağlar. Geçici işlemler için idealdir.


7. Dockerfile Yazma

Kendi uygulamanı Docker image'ına dönüştürmek için Dockerfile yazman gerekir. Basit bir Python web uygulamasını container'layalım.

Uygulama Kodu

# app.py
from flask import Flask, jsonify
import os
import datetime

app = Flask(__name__)

@app.route('/')
def home():
    return jsonify({
        'message': 'Merhaba, Docker!',
        'hostname': os.uname().nodename,
        'timestamp': datetime.datetime.now().isoformat()
    })

@app.route('/health')
def health():
    return jsonify({'status': 'healthy'}), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
# requirements.txt
flask==3.0.0

Dockerfile

# 1. Temel image — Python'un hafif versiyonu
FROM python:3.12-slim

# 2. Metadata
LABEL maintainer="developer@example.com"
LABEL description="Basit Flask web uygulaması"

# 3. Çalışma dizini oluştur
WORKDIR /app

# 4. Önce bağımlılıkları kopyala ve yükle (cache optimizasyonu)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 5. Uygulama kodunu kopyala
COPY . .

# 6. Root olmayan kullanıcı oluştur (güvenlik)
RUN adduser --disabled-password --gecos "" appuser
USER appuser

# 7. Portu belge olarak belirt
EXPOSE 5000

# 8. Uygulamayı başlat
CMD ["python", "app.py"]

Image'ı Build Et ve Çalıştır

# Image'ı build et
docker build -t my-flask-app:1.0 .

# Container olarak çalıştır
docker run -d --name flask-app -p 5000:5000 my-flask-app:1.0

# Test et
curl http://localhost:5000
# {"hostname":"a1b2c3d4e5f6","message":"Merhaba, Docker!","timestamp":"2026-02-28T14:30:00.123456"}

Dockerfile Best Practice'leri

1. Küçük base image kullan:

# ❌ Büyük (1GB+)
FROM python:3.12

# ✅ Küçük (~150MB)
FROM python:3.12-slim

# ✅ Çok küçük (~50MB, ama dikkat gerektirir)
FROM python:3.12-alpine

2. Layer cache'ini optimize et:

# ❌ Kötü — her kod değişikliğinde bağımlılıklar yeniden yüklenir
COPY . .
RUN pip install -r requirements.txt

# ✅ İyi — bağımlılıklar sadece requirements.txt değişince yüklenir
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

3. `.dockerignore` dosyası kullan:

# .dockerignore
.git
__pycache__
*.pyc
.env
node_modules
.vscode
README.md

8. Docker Compose Nedir?

Gerçek dünyada uygulamalar nadiren tek başına çalışır. Bir web uygulaması genellikle bir veritabanına, bir cache sistemine, belki bir mesaj kuyruğuna ihtiyaç duyar. Docker Compose, birden fazla container'ı tek bir YAML dosyasıyla tanımlayıp birlikte yönetmeni sağlar.

docker-compose.yml Örneği

Bir web uygulaması + PostgreSQL + Redis ortamını tanımlayalım:

# docker-compose.yml
services:
  # Web uygulaması
  web:
    build: .
    ports:
      - "5000:5000"
    environment:
      - DATABASE_URL=postgresql://postgres:secret@db:5432/myapp
      - REDIS_URL=redis://cache:6379
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
    restart: unless-stopped

  # PostgreSQL veritabanı
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: secret
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

  # Redis cache
  cache:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

Docker Compose Komutları

# Tüm servisleri başlat (arka planda)
docker compose up -d

# Logları izle
docker compose logs -f

# Belirli bir servisin logları
docker compose logs -f web

# Servislerin durumunu kontrol et
docker compose ps

# Tüm servisleri durdur
docker compose down

# Servisleri durdur ve volume'ları da sil
docker compose down -v

# Sadece belirli bir servisi yeniden başlat
docker compose restart web

# Image'ı yeniden build et ve başlat
docker compose up -d --build web

Docker Compose ile tek bir komutla tüm geliştirme ortamını ayağa kaldırabilirsin. Yeni bir ekip üyesi projeye dahil olduğunda docker compose up -d komutu yeterli — saatlerce kurulum yapmasına gerek yok.

💡 İpucu: Docker Compose dosyasını her zaman projenin kök dizininde tutun. Bu, ekipteki herkesin aynı ortamda çalışmasını garanti eder.


9. Docker Kullanım Senaryoları

Docker, yazılım geliştirme sürecinin her aşamasında kullanılır:

Development (Geliştirme Ortamı)

Her developer'ın aynı ortamda çalışmasını sağlar. "Benim bilgisayarımda çalışıyordu" problemi tarihe karışır. Farklı projelerin bağımlılıkları birbirini etkilemez — bir projede Python 3.8, diğerinde Python 3.12 kullanabilirsin.

CI/CD Pipeline

Her commit'te otomatik build ve test:

# GitHub Actions örneği
name: Build and Test
on: [push]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build Docker image
        run: docker build -t my-app:test .
      - name: Run tests
        run: docker run --rm my-app:test python -m pytest
      - name: Push to registry
        if: github.ref == 'refs/heads/main'
        run: |
          docker tag my-app:test registry.example.com/my-app:latest
          docker push registry.example.com/my-app:latest

Microservices

Her microservice kendi container'ında çalışır. Farklı dillerde yazılmış servisler birlikte çalışabilir. Her servis bağımsız deploy edilebilir ve ölçeklendirilebilir.

Testing (Test Ortamı)

Her test çalıştırmasında temiz bir ortam. Testler birbirini etkilemez. Veritabanı testleri için gerçek bir PostgreSQL container'ı ayağa kaldırılabilir — mock'a gerek kalmaz.

// Spring Boot — Testcontainers ile gerçek DB testi
@Testcontainers
@SpringBootTest
class UserServiceTest {

    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine");

    @Test
    void shouldCreateUser() {
        // Gerçek PostgreSQL'de test çalışır
    }
}

Legacy Uygulama Modernizasyonu

Eski bir uygulamayı Docker container'ına alarak ilk modernizasyon adımını atabilirsin. Uygulama değişmez, ama deployment ve yönetimi kolaylaşır.


10. Docker vs Kubernetes: Kısa Karşılaştırma

Docker ve Kubernetes sıkça karıştırılır, ama farklı problemleri çözerler:

ÖzellikDockerKubernetes
Ne yapar?Container oluşturur ve çalıştırırContainer'ları orkestre eder (yönetir)
ÖlçekTek sunucuBirden fazla sunucu (cluster)
KullanımDevelopment, küçük projelerProduction, büyük ölçekli sistemler
Öğrenme eğrisiKolay-OrtaDik
Auto-scalingYok (manuel)Var (otomatik)
Self-healingSınırlı (restart policy)Gelişmiş (pod yeniden oluşturma)
Load balancingManuelDahili
Rollout/RollbackManuelOtomatik (zero-downtime)

Basit kural:

  • 1-10 container, tek sunucu → Docker (+ Docker Compose) yeterli

  • 10+ container, birden fazla sunucu, auto-scaling → Kubernetes gerekli

Docker ve Kubernetes rakip değildir. Kubernetes, Docker container'larını (veya OCI uyumlu container'ları) yönetir. Yani Docker ile container oluşturursun, Kubernetes ile onları orkestre edersin. Önce Docker'ı öğren, sonra Kubernetes'e geç.


11. Docker Güvenlik Temelleri

Docker container'ları izole çalışır, ama güvenliği ciddiye almak gerekir:

Root Olmayan Kullanıcı Kullan

# ❌ Tehlikeli — container root olarak çalışır
FROM node:20
COPY . .
CMD ["node", "app.js"]

# ✅ Güvenli — dedicated user ile çalışır
FROM node:20
RUN groupadd -r appgroup && useradd -r -g appgroup appuser
WORKDIR /app
COPY --chown=appuser:appgroup . .
USER appuser
CMD ["node", "app.js"]

Multi-Stage Build

Multi-stage build, hem güvenliği artırır hem de image boyutunu küçültür. Build araçları final image'a dahil edilmez:

# Stage 1: Build
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

# Stage 2: Run (sadece JRE, build araçları yok)
FROM eclipse-temurin:21-jre-alpine
RUN adduser -D appuser
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
USER appuser
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Bu Dockerfile ile:

  • Build stage'de Maven ve JDK kullanılır (~800MB)

  • Final image'da sadece JRE ve JAR dosyası bulunur (~200MB)

  • Build araçları, kaynak kodu ve ara dosyalar final image'a dahil edilmez

Diğer Güvenlik İpuçları

  • Güvenilir base image'lar kullan: Docker Official Images veya Verified Publisher image'larını tercih et

  • Image'ları tara: docker scout cve my-image ile güvenlik açıklarını kontrol et

  • Secrets'ları image'a gömme: Şifreleri environment variable veya Docker secrets ile yönet

  • Image'ları düzenli güncelle: Base image'lardaki güvenlik yamaları için image'ları periyodik olarak yeniden build et

  • Read-only filesystem: Mümkünse container filesystem'ini read-only olarak çalıştır

docker run --read-only --tmpfs /tmp my-app:latest

12. Docker Öğrenme Yol Haritası

Docker'ı sistematik bir şekilde öğrenmek için şu sırayı takip etmeni öneriyorum:

Aşama 1: Temel Kavramlar (1-2 hafta)

  • Docker nedir, container nedir kavramlarını anlama

  • Docker kurulumu

  • Temel komutlar: run, stop, rm, ps, logs, exec

  • Docker Hub'dan image çekme ve kullanma

  • Port mapping, environment variables

Aşama 2: Dockerfile ve Image Oluşturma (1-2 hafta)

  • Dockerfile yazma kuralları

  • Layer cache optimizasyonu

  • Multi-stage build

  • .dockerignore kullanımı

  • Image tagging ve versiyonlama

Aşama 3: Docker Compose (1-2 hafta)

  • docker-compose.yml yazma

  • Multi-container uygulamalar

  • Volume yönetimi

  • Network yapılandırması

  • Health check'ler

  • Environment-specific konfigürasyon

Aşama 4: Docker Networking ve Storage (1 hafta)

  • Bridge, host, overlay network'ler

  • Container'lar arası iletişim

  • Volume türleri (named volume, bind mount, tmpfs)

  • Veri kalıcılığı stratejileri

Aşama 5: Production ve CI/CD (2 hafta)

  • Docker güvenlik best practice'leri

  • CI/CD pipeline'larında Docker

  • Docker Registry (özel registry kurulumu)

  • Monitoring ve logging

  • Docker Swarm veya Kubernetes'e giriş

💡 İpucu: Docker'ı sıfırdan uzmanlık seviyesine öğrenmek için [60 derslik ücretsiz Docker kursumuz](https://tolgahan.dev) ile hemen başlayabilirsiniz. Kurs, yukarıdaki yol haritasını uygulamalı olarak kapsar ve gerçek proje örnekleriyle desteklenmiştir.


13. Docker Kariyer Fırsatları

Docker bilmek, modern yazılım dünyasında temel bir yetkinlik haline geldi. Artık sadece DevOps mühendislerinin değil, backend developer'ların, full-stack developer'ların ve hatta QA mühendislerinin bilmesi bekleniyor.

İlgili Pozisyonlar

  • DevOps Engineer: CI/CD pipeline'ları, altyapı otomasyonu, container orchestration

  • Site Reliability Engineer (SRE): Sistem güvenilirliği, monitoring, incident response

  • Cloud Engineer: AWS, Azure, GCP üzerinde container tabanlı altyapı yönetimi

  • Platform Engineer: Geliştirici deneyimini iyileştiren iç platformlar oluşturma

  • Backend Developer: Container'lı uygulama geliştirme ve deployment

  • Full-Stack Developer: Hem frontend hem backend'i container'larda yönetme

Maaş Beklentileri (2025-2026 Türkiye)

PozisyonDeneyimAylık Net Maaş (TL)
Junior DevOps0-2 yıl45.000 - 75.000
Mid DevOps/SRE2-5 yıl80.000 - 140.000
Senior DevOps/SRE5+ yıl140.000 - 250.000+
Cloud Architect7+ yıl200.000 - 400.000+

Docker ile Birlikte Öğrenilmesi Gerekenler

Docker tek başına yeterli değildir. Aşağıdaki teknolojilerle birlikte öğren:

  • Kubernetes: Container orchestration (Docker'ın doğal devamı)

  • Terraform: Infrastructure as Code (altyapıyı kod olarak yönetme)

  • Ansible: Configuration management

  • GitHub Actions / GitLab CI: CI/CD otomasyonu

  • AWS ECS/EKS, Azure AKS, Google GKE: Cloud container servisleri

  • Prometheus + Grafana: Monitoring ve dashboarding

Global Fırsatlar

Docker ve Kubernetes bilmek, remote çalışma imkanlarını büyük ölçüde artırır. DevOps ve Cloud mühendisleri global olarak en çok aranan pozisyonlar arasındadır. EUR/USD bazlı remote pozisyonlarla çalışma şansın yüksektir.


14. Kaynaklar ve Sonraki Adımlar

Ücretsiz Öğrenme Kaynakları

  • [tolgahan.dev Docker Kursu](https://tolgahan.dev): 60 derslik, Türkçe, sıfırdan uzmanlık seviyesine Docker eğitimi. Uygulamalı örnekler ve gerçek proje senaryolarıyla desteklenmiştir.

  • [Docker Resmi Dokümantasyonu](https://docs.docker.com): En güncel ve kapsamlı kaynak (İngilizce).

  • [Docker Hub](https://hub.docker.com): Official image'ları keşfet, Dockerfile'larını incele.

  • [Play with Docker](https://labs.play-with-docker.com): Tarayıcıda Docker dene — kurulum gerektirmez.

Pratik Yapabileceğin Projeler

  1. Kendi web uygulamanı container'la: Mevcut bir projeyi Dockerfile ile paketleme

  2. WordPress + MySQL: Docker Compose ile tam bir blog altyapısı kurma

  3. Microservice mimarisi: 3 farklı servis + veritabanı + message queue

  4. CI/CD pipeline: GitHub Actions ile otomatik build → test → deploy

  5. Monitoring stack: Prometheus + Grafana + cAdvisor ile container monitoring

Yararlı Docker Komutları Cheat Sheet

# === IMAGE İŞLEMLERİ ===
docker images                        # Image listesi
docker pull nginx:latest             # Image indir
docker build -t my-app:1.0 .         # Image oluştur
docker rmi image_id                  # Image sil
docker image prune                   # Kullanılmayan image'ları temizle

# === CONTAINER İŞLEMLERİ ===
docker run -d --name app -p 80:80 nginx  # Container çalıştır
docker ps                            # Çalışan container'lar
docker ps -a                         # Tüm container'lar
docker stop container_id             # Durdur
docker start container_id            # Başlat
docker rm container_id               # Sil
docker logs -f container_id          # Log izle
docker exec -it container_id bash    # Container'a gir

# === TEMİZLİK ===
docker system prune -a               # Her şeyi temizle (dikkat!)
docker volume prune                  # Kullanılmayan volume'ları sil
docker network prune                 # Kullanılmayan network'leri sil

# === BİLGİ ===
docker stats                         # Kaynak kullanımı (CPU, RAM)
docker inspect container_id          # Detaylı bilgi
docker system df                     # Disk kullanımı

15. Sıkça Sorulan Sorular (FAQ)

Docker ücretsiz mi?

Docker Engine (CLI ve daemon) tamamen ücretsiz ve açık kaynaktır. Docker Desktop ise küçük işletmeler (250 çalışan altı ve 10M$ gelir altı) ve kişisel kullanım için ücretsizdir. Büyük şirketler için ücretli planları vardır. Alternatif olarak Linux'ta Docker Engine'i doğrudan kullanabilirsin.

Docker öğrenmek ne kadar sürer?

Temel kavramları (image, container, Dockerfile) 1-2 haftada öğrenebilirsin. Docker Compose ile multi-container uygulamalar kurmak 2-3 hafta daha alır. Production seviyesinde Docker kullanımı (güvenlik, networking, CI/CD entegrasyonu) için 2-3 ay düzenli pratik gerekir.

Docker sadece Linux'ta mı çalışır?

Hayır. Docker, Windows ve macOS'ta da çalışır. Ancak container'ların kendisi Linux kernel özelliklerini (namespaces, cgroups) kullandığı için, Windows ve macOS'ta Docker Desktop arka planda hafif bir Linux VM çalıştırır. Linux'ta ise doğrudan native olarak çalışır — en iyi performans Linux'tadır.

Docker container'ları güvenli mi?

Container'lar, doğru yapılandırıldığında güvenlidir. Ancak varsayılan ayarlarla çalıştırmak riskli olabilir. Root olmayan kullanıcı kullanma, güvenilir base image seçme, image'ları tarama ve secret yönetimi gibi güvenlik pratiklerini uygulamak gerekir. VM'ler kadar güçlü bir izolasyon sağlamaz, ama çoğu kullanım senaryosu için yeterlidir.

Docker ve sanal makine (VM) aynı şey mi?

Hayır. VM, kendi işletim sistemi kernel'ını taşır ve hypervisor üzerinde çalışır. Container ise host OS kernel'ını paylaşır ve çok daha hafiftir. VM dakikalar içinde başlarken container saniyeler içinde başlar. VM gigabyte'larca yer kaplarken container megabyte'larca yer kaplar. Detaylı karşılaştırmayı yazının 2. bölümünde bulabilirsin.

Docker Compose ve Docker Swarm farkı nedir?

Docker Compose, tek bir makinede birden fazla container'ı yönetmek için kullanılır — development ortamı için idealdir. Docker Swarm ise birden fazla makineyi (cluster) yönetmek için kullanılan orchestration aracıdır — production için tasarlanmıştır. Ancak Swarm'ın yerini büyük ölçüde Kubernetes almıştır.

Hangi programlama dilleri Docker ile kullanılabilir?

Tamamı. Docker, programlama diline bağımlı değildir. Python, Java, JavaScript (Node.js), Go, Rust, C++, Ruby, PHP, .NET — hangi dilde yazarsan yaz, Docker container'ına koyabilirsin. Docker Hub'da her dil için resmi base image'lar mevcuttur.

Docker image boyutunu nasıl küçültürüm?

Slim veya alpine base image'lar kullan, multi-stage build uygula, .dockerignore dosyası ekle, gereksiz paketleri yükleme, layer sayısını minimize et (birden fazla RUN komutunu && ile birleştir) ve --no-cache-dir gibi flag'lerle cache dosyalarını temizle.

Docker'da veri kaybı olur mu?

Container silindiğinde içindeki veriler de silinir — container'lar ephemeral (geçici) dir. Kalıcı veri saklamak için volume kullanmalısın. Volume'lar container lifecycle'ından bağımsızdır ve container silinse bile veriler korunur.

Docker Desktop alternatifleri var mı?

Evet. Podman (Red Hat), Docker CLI ile uyumlu, daemon'sız çalışan bir alternatiftir. Rancher Desktop ve Colima (macOS) da popüler seçeneklerdir. Linux'ta Docker Engine'i doğrudan kullanmak en hafif seçenektir.


Sonuç

Docker nedir sorusunun cevabını artık derinlemesine biliyorsun: Docker, uygulamaları container'lar içinde paketleyip her ortamda tutarlı şekilde çalıştırmayı sağlayan bir platformdur. "Benim bilgisayarımda çalışıyordu" problemini kökünden çözer, geliştirme süreçlerini hızlandırır ve deployment'ı basitleştirir.

Bugün yazılım dünyasında Docker bilmek artık bir "nice to have" değil, "must have" yetkinliktir. Backend developer'dan DevOps mühendisine, QA'den system administrator'a kadar herkesin Docker'ı en azından temel seviyede bilmesi beklenir.

Özetleyelim:

  • Container, uygulamayı ve bağımlılıklarını izole bir ortamda çalıştırır

  • Image, container'ın şablonudur (reçete)

  • Dockerfile, image'ı nasıl oluşturacağını tanımlar

  • Docker Compose, birden fazla container'ı birlikte yönetir

  • Volume, verileri kalıcı saklar

  • Network, container'lar arası iletişimi sağlar

Docker'ı öğrenmeye bugün başla. Docker'ı sıfırdan uzmanlık seviyesine öğrenmek için [tolgahan.dev'deki 60 derslik ücretsiz Docker kursumuz](https://tolgahan.dev) ile yolculuğuna hemen başlayabilirsin. İlk container'ını çalıştırdığında, "neden daha önce başlamadım" diyeceksin. 🐳

Paylaş:
Son güncelleme: Jun 05, 2026

Yorumlar

Giriş yapın ve yorum bırakın.

Henüz yorum yok

Düşüncelerinizi paylaşan ilk siz olun!

Bu yazıyı beğendiniz mi?

Bültene abone olun ve yeni yazılardan ilk siz haberdar olun. Spam yok, söz.

Bu konuyu derinlemesine öğrenmek ister misin?

Docker: Sıfırdan Uzmanlığa

60 ders Ücretsiz
Kursa Git

İlgili Yazılar