yandex metrika
Docker Öğrenmeye Çalışırken Yaşadıklarım (ve Yaptığım 7 Hata) - Tecrübe Güncesi
Bilgi Teknolojileri

Docker Öğrenmeye Çalışırken Yaşadıklarım (ve Yaptığım 7 Hata)

Bir yıl önce “Docker öğrenmeliyim” dedim. Her yerde Docker vardı: iş ilanlarında, tutorial’larda, GitHub projelerinde… Ama her seferinde bir şey yanlış gitti. Container’larımı sildim, volume’larımı kaybettim, network’üm birbirine girdi.

Şimdi o süreci başından anlatacağım. Belki siz benim yaptığım hataları yapmazsınız.

Docker Nedir ve Neden Herkes Çıldırmış Durumda?

Docker, uygulamalarınızı “container” denen hafif sanal ortamlarda çalıştıran bir araç. Sanal makineden farkı: tüm işletim sistemini değil, sadece gerekli parçaları kopyalar. Hafif, hızlı, taşınabilir.

Neden popüler? Çünkü “benim bilgisayarımda çalışıyordu” derdini bitiriyor. Container’da çalışan bir uygulama, her yerde aynı şekilde çalışır. Geliştirici bilgisayarında, test sunucusunda, production’da — fark etmez.

2025 itibarıyla Docker’ı kullanan geliştirici oranı %80’i geçmiş durumda. Stack Overflow’un 2024 anketine göre, geliştiricilerin %63’ü Docker’ı düzenli olarak kullanıyor. Bu rakam her yıl artıyor.

Terminal ekranında Docker komutları, geliştirici çalışma alanı

İlk Gün: “Hello World” ve Hemen Bir Face-Palm

İlk komutumu çalıştırdığımda çok heyecanlıydım:

docker run hello-world

Ekranda “Hello from Docker!” yazısını gördüğümde kendimi hacker gibi hissettim. Ama bu his çok kısa sürdü. Çünkü hemen ardından şunu denedim:

docker run -d -p 8080:80 nginx

Nginx çalıştı. Tarayıcıda localhost:8080’i açtım. “Welcome to nginx!” Hoş. Ama sonra durdurmaya çalıştım:

docker stop nginx

“Error: No such container: nginx” — ne? Az önce çalıştırdım, ismi yok mu? İşte burada öğrendim: Docker container’lara otomatik isim veriyor (nostalgic_turing, happy_einstein gibi komik isimler). İsim vermek için –name parametresini kullanmanız gerekiyormuş.

docker run -d -p 8080:80 --name benim-nginx nginx

İlk ders: her zaman –name kullanın.

İkinci Hafta: Volume Faciası

Docker’ı biraz anladığımı sanıyordum. Bir PostgreSQL container’ı çalıştırdım, veritabanımı oluşturdum, tablolarımı ekledim. Her şey güzel. Sonra container’ı durdurdum ve tekrar başlattım.

Verilerim yoktu.

Container’ı silip tekrar oluşturduğumda her şey sıfırlanmıştı. Çünkü Docker container’lar geçici — silindiğinde içindeki her şey gidiyor. Verilerin kalıcı olması için “volume” kullanmanız gerekiyor.

docker run -d -v postgres-data:/var/lib/postgresql/data postgres

Volume, container’dan bağımsız bir depolama alanı. Container’ı silseniz bile veriler volume’da kalıyor. Bu öğeyi öğrenene kadar üç kez veritabanımı sıfırdan oluşturdum. Eğlenceli miydi? Değildi.

Docker Compose: Kurtarıcı Mı, Karmaşıklık Kaynağı Mı?

Tek container’la işim olmayacağını anladıktan sonra Docker Compose’a geçtim. Compose, birden fazla container’ı tek bir dosyadan yönetmenizi sağlıyor.

İlk docker-compose.yml dosyam şöyle görünüyordu:

version: "3"
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: sifre123

Çalıştırdım: docker-compose up -d. İki container birden ayağa kalktı. Harika! Ama sonra veritabanına bağlanmaya çalıştığımda sorun başladı. “Connection refused” hatası. Neden? Çünkü web container’ı, db container’ına “localhost” ile bağlanmaya çalışıyordu. Docker’da container’lar birbirine service ismiyle ulaşıyor. Yani “localhost:5432” değil, “db:5432” olması gerekiyor.

Bu basit ama can sıkıcı detayı öğrenmem iki günümü aldı. Docker networking konusu gerçekten kafa karıştırıcı.

Mikroservis mimarisi, container network görselleştirmesi

Network Cehennemi ve Öğrendiklerim

Docker network’leri başlı başına bir macera. Üç tip var:

  1. Bridge: Varsayılan. Container’lar birbirine isimle ulaşabilir.
  2. Host: Container, host’un network’ünü kullanır. Port mapping gerekmez.
  3. None: Network yok. İzole container.

Benim en büyük yanlış anlayışım: her container’ın kendi localhost’u olduğunu sanıyordum. Hayır. Aynı network’teki container’lar birbirine servis ismiyle erişir. Farklı network’teyse erişemez.

Bir proje için 6 container’ım vardı: web, api, db, redis, worker, celery. Hepsini aynı network’e koymam gerektiğini anlamam bir hafta sürdü. O hafta boyunca container’lar birbirini bulamıyordu.

Dockerfile Yazmak: Sanattan Zanaata

Hazır image’ları kullanmak kolay. Ama kendi image’ınızı oluşturmak başka bir hikaye.

İlk Dockerfile’ım:

FROM ubuntu:latest
RUN apt-get update
RUN apt-get install python3
RUN apt-get install pip
RUN pip install flask
COPY . /app
CMD ["python3", "/app/main.py"]

Çalışktı ama boyutu 1.2 GB’dı. Bir Flask uygulaması için 1.2 GB! Sonra öğrendim: her RUN komutu yeni bir “layer” oluşturuyor ve hepsi image’a ekleniyor. Doğru yaklaşım:

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python3", "main.py"]

Boyut: 180 MB. Sekiz kat küçüldü. Slim tabanlı image’lar, layer birleştirme, cache kullanmama — bunları öğrendikçe image’larım küçüldü.

Gerçek Projede Docker: Neler Öğrendim?

Bir yıl sonra artık Docker’ı production’da kullanıyorum. İşte öğrendiğim kritik noktalar:

  1. .dockerignore şart: node_modules, .git, __pycache__ gibi dosyalar image’a girmemeli. Her proje için .dockerignore dosyası oluşturun.
  1. Environment variable’ları hardcode etmeyin: Şifreler, API key’ler Dockerfile’a yazılmaz. .env dosyası veya environment variable olarak geçirin.
  1. Container’ı root olarak çalıştırmayın: Güvenlik açısından non-root user oluşturun ve onunla çalıştırın.
  1. Health check ekleyin: Docker’ın container’ınızın gerçekten çalışıp çalışmadığını bilmesi lazım.
  1. Logları yönetin: Container logları sürekli büyür. Log rotation yapılmazsa disk dolar.

Hangi Durumlarda Docker Aşırıya Kaçar?

Docker harika ama her projede gerekli değil:

  1. Statik bir web sitesi: HTML-CSS-JS’den oluşan bir site için Docker gereksiz. Netlify, Vercel daha pratik.
  1. Basit bir cron job: Tek bir Python script’ini periyodik çalıştırmak için Docker’a gerek yok. Crontab yeterli.
  1. Öğrenme aşamasında: Yeni bir dil/framework öğrenirken Docker ek karmaşıklık getirir. Önce dili öğrenin, sonra Docker’la taşıyın.

Bir Yıllık Özet: Debian Sunucumda Ne Değişti?

Docker öncesi: her uygulama için ayrı kurulum, ayrı bağımlılık, ayrı baş ağrısı. Sunucu güncellemesi kabus. Bir şey bozulduğunda “neydi bu, hangi paket, hangi versiyon?” diye aramak.

Docker sonrası: her uygulama kendi container’ında. Güncelleme? Yeni image çek, container’ı yeniden başlat. Sorun mu oldu? Eski image’a dön. Temiz, izole, yönetilebilir.

Sunucumda şu an 8 container çalışıyor: web sitelerim, veritabanlarım, monitoring araçlarım, n8n otomasyonum… Hepsi docker-compose.yml dosyasında tanımlı. Tek komutla hepsini başlatıyorum, tek komutla durduruyorum.

Docker öğrenmek zor muydu? Evet. Değer miydi? Kesinlikle.


Sıkça Sorulan Sorular

Docker’ı öğrenmek ne kadar sürer?

Temel düzeyde kullanmak 1-2 hafta. Production’a hazır olmak 2-3 ay. Gerçekten rahat hissetmek 6 ay+. Ama ilk container’ınızı çalıştırmak 10 dakikanızı alır.

Docker sanal makine mi değil mi?

Hayır. Docker container, sanal makineden çok daha hafif. Sanal makine tüm işletim sistemini kopyalar. Container ise sadece gerekli olan kısmı paylaşır. Bir sunucuda 100 container çalıştırabilirsiniz ama 100 sanal makine çalıştıramazsınız.

Docker ücretsiz mi?

Evet, Docker Engine açık kaynaklı ve ücretsiz. Docker Desktop kişisel kullanım için ücretsiz, büyük şirketler için ücretli. Linux’ta Docker Engine kullanırsanız tamamen ücretsiz.

Docker vs Kubernetes hangisi?

İkisi farklı şeyler. Docker tek bir sunucuda container çalıştırır. Kubernetes binlerce container’ı yüzlerce sunucuda yönetir. Tek sunucunuz varsa Docker yeterli. Büyük ölçekli sistemlerde Kubernetes gerekir.

Docker verilerimi kaybeder mi?

Volume kullanırsanız hayır. Volume’lar container’dan bağımsızdır. Container’ı silseniz bile volume’daki veriler kalır. Ama volume kullanmadan container’ı silerseniz veriler gider.


Kaynaklar:

  • Stack Overflow Developer Survey, 2024
  • Docker Official Documentation, 2025
  • Docker Hub Usage Statistics, 2025
  • Kişisel Docker deneyimi, 2025-2026

Türkay

Teknoloji, bilgisayar güvenliği, WordPress ve yapay zeka konularında içerik üreten Tecrübe Güncesi'nin editörü. Linux sistem yönetimi, ağ güvenliği ve web geliştirme alanlarında yılların getirdiği tecrübeye sahip. 2015'ten bu yana Türkçe teknoloji içerikleri üreterek okuyuculara yol göstermeyi hedefliyor.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


Başa dön tuşu