Docker Nedir? Container Teknolojisi Rehberi
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
| Özellik | Sanal Makine (VM) | Container (Docker) |
|---|---|---|
| Boyut | Gigabyte'lar (GB) | Megabyte'lar (MB) |
| Başlatma süresi | Dakikalar | Saniyeler (hatta milisaniyeler) |
| İşletim sistemi | Kendi OS'u var (tam) | Host OS kernel'ını paylaşır |
| İzolasyon | Tam izolasyon (hypervisor) | Proses seviyesinde izolasyon |
| Kaynak kullanımı | Yüksek (her VM'e RAM/CPU ayrılır) | Düşük (paylaşımlı kernel) |
| Taşınabilirlik | Düşük (VM imajları büyük) | Yüksek (image'lar küçük ve taşınabilir) |
| Yoğunluk | Bir sunucuda 10-20 VM | Bir sunucuda yüzlerce container |
| Hypervisor | Gerekli (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 -dProblem 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-slimDocker 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 -aDockerfile
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:latestDocker 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:16Docker 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:16Aynı 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:
Docker Daemon (dockerd): Arka planda çalışan servis. Container'ları oluşturur, çalıştırır ve yönetir. Image'ları build eder.
Docker Client (docker CLI): Kullanıcının Docker ile etkileşim kurduğu komut satırı aracı.
docker run,docker build,docker pushgibi komutları daemon'a gönderir.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 $USERmacOS 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:latestBu 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önlendirnginx: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 webAdı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.0Dockerfile
# 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-alpine2. 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.md8. 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 webDocker 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:latestMicroservices
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:
| Özellik | Docker | Kubernetes |
|---|---|---|
| Ne yapar? | Container oluşturur ve çalıştırır | Container'ları orkestre eder (yönetir) |
| Ölçek | Tek sunucu | Birden fazla sunucu (cluster) |
| Kullanım | Development, küçük projeler | Production, büyük ölçekli sistemler |
| Öğrenme eğrisi | Kolay-Orta | Dik |
| Auto-scaling | Yok (manuel) | Var (otomatik) |
| Self-healing | Sınırlı (restart policy) | Gelişmiş (pod yeniden oluşturma) |
| Load balancing | Manuel | Dahili |
| Rollout/Rollback | Manuel | Otomatik (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-imageile güvenlik açıklarını kontrol etSecrets'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:latest12. 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,execDocker 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
.dockerignorekullanımıImage tagging ve versiyonlama
Aşama 3: Docker Compose (1-2 hafta)
docker-compose.ymlyazmaMulti-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)
| Pozisyon | Deneyim | Aylık Net Maaş (TL) |
|---|---|---|
| Junior DevOps | 0-2 yıl | 45.000 - 75.000 |
| Mid DevOps/SRE | 2-5 yıl | 80.000 - 140.000 |
| Senior DevOps/SRE | 5+ yıl | 140.000 - 250.000+ |
| Cloud Architect | 7+ yıl | 200.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
Kendi web uygulamanı container'la: Mevcut bir projeyi Dockerfile ile paketleme
WordPress + MySQL: Docker Compose ile tam bir blog altyapısı kurma
Microservice mimarisi: 3 farklı servis + veritabanı + message queue
CI/CD pipeline: GitHub Actions ile otomatik build → test → deploy
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. 🐳
Bu yazıyı beğendiniz mi?
Bültene abone olun ve yeni yazılardan ilk siz haberdar olun. Spam yok, söz.
İlgili Yazılar
Docker Compose: Çoklu Container Uygulamalarını Tek Komutla Yönetme Rehberi
Docker Compose ile birden fazla container'ı nasıl tanımlar, yapılandırır ve tek bir komutla ayağa kaldırırsınız? Servis...
Docker Compose Rehberi: Çoklu Container Yönetimi
Docker Compose nedir, nasıl kurulur, docker-compose.yml nasıl yazılır? Services, volumes, networks, environment variable...
Docker Multi-Stage Build ile Küçük ve Güvenli Image'lar
Docker multi-stage build ile image boyutunu 800MB'den 150MB'ye düşürün. Spring Boot, Node.js ve Go örnekleri ile product...