Docker Kurulum Rehberi: Sıfırdan Başlayanlar İçin 2026

Konu İçeriği
Docker Nedir?
Docker’i ilk duyduğumda “bir sanal makine daha mı” diye düşünmüştüm. Ama ilk kez bir projede farklı sürümlerde PHP çalıştırma sorunu yaşadığımda Docker’in ne kadar hayat kurtardığını anladım. Ekip arkadaşlarımdan biri “bilgisayarımde çalışıyor” diyordu, benim bilgisayarmda ise hata veriyordu. Docker ile her iki ortamı da aynı hale getirdik ve sorun çözüldü. O günden beri her projemi Docker ile başlatıyorum.
Docker, uygulamalarınızı konteyner adı verilen izole ortamlarda çalıştırmanızı sağlayan bir platform. Her konteyner, uygulamanızın ihtiyacı olan her şeyi içinde barındırıyor: işletim sistemi, kütüphaneler, ayar dosyaları. Böylece uygulama nerede çalışırsa çalışsın, aynı davranışı gösteriyor. “Benim bilgisayarmda çalışıyor” sorununu tamamen ortadan kaldırıyor.
Docker vs Geleneksel Sanallastirma
Docker’i anlamak için sanal makineyle farkını bilmek önemli. İlk başta kavramlar karışıyor, ben de çok karıştırmıştım. Ama aslında çok basit bir fark var.
| Özellik | Sanal Makine | Docker |
|---|---|---|
| İşletim sistemi | Her VM için ayrı işletim sistemi | Ana işletim sistemini paylaşır |
| Boyut | Gigabaytlar | Megabaytlar |
| Başlama süresi | Dakikalar | Saniyeler |
| Kaynak tüketimi | Yüksek | Düşük |
| Yönetim | Karmaşık | Basit |
Sanal makine, bilgisayarınızın içinde çalışan başka bir bilgisayar gibi düşünün. Kendi işletim sistemi var, kendi belleği var, kendi depolama alanı var. Bu yüzden hem ağır hem yavaş. Docker ise ana işletim sisteminin çekirdeğini kullanıp sadece uygulamanın ihtiyacı olan kısmı izole ediyor. Bu yüzden hem hafif hem hızlı. Ben bir sunucuda beş sanal makine çalıştırıyordum, geçince Docker’e geçince aynı sunucuda on beş konteyner çalıştırabildim.
Docker Kurulumu
Kurulum, düşündüğünüzden çok daha basit. Ben ilk kurulumumu yirmi dakikada tamamladım. Şimdi on dakikamı bile almaz.
Ubuntu/Debian
Linux kullanıcıları için kurulum terminalden yapılıyor. Aşağıdaki komutları sırasıyla çalıştırın:
# Paket listesini güncelle
sudo apt-get update
# Gerekli paketleri kur
sudo apt-get install ca-certificates curl gnupg
# Docker resmi GPG anahtarını ekle
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Docker deposunu ekle
sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable"
# Docker'ı kur
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Kurulum bittikten sonra kullanıcınızı docker grubuna eklemeyi unutmayın. Aksi halde her docker komutunun başına sudo yazmanız gerekir. Ben bunu ilk kurulumda atlamıştım ve her seferinde sudo yazmaktan sıkılmıştım.
# Kullanıcınızı docker grubuna ekle
sudo usermod -aG docker $USER
# Docker'in calistigini kontrol et
docker --version
docker run hello-world
hello-world konteyneri başarıyla çalıştıysa Docker kurulmuş demektir. İlk seferinde görüntüyü indirmesi biraz sürebilir ama sonraki çalıştırmalarda anında başlar.
Windows ve macOS
Windows ve macOS kullanıcıları için kurulum çok daha kolay. Docker Desktop adlı uygulamayı indirip kuruyorsunuz, hepsi bu.
- Windows: Docker Desktop’ı indirin ve kurun. WSL 2 gerektiriyor, kurulum sırasında otomatik olarak ayarlıyor. Ben Windows’ta Docker kullanırken WSL 2’ye geçtikten sonra performansın ciddi şekilde arttığını fark ettim. Hyper-V’ye göre çok daha hızlı.
- macOS: Docker Desktop’ı indirin ve Applications klasörüne sürükleyin. Apple Silicon (M1/M2/M3/M4) işlemcilerde native olarak çalışıyor. Ben M1 MacBook’ta Docker kullanıyorum, Intel dönemine göre çok daha performanslı.
Temel Docker Komutları
Docker’da en çok kullanılan komutları listeleyeyim. Ben günlük işlerimde bu komutların hepsini kullanıyorum.
| Komut | Açıklama | Örnek |
|---|---|---|
docker pull |
Görüntü indirir | docker pull nginx |
docker run |
Konteyner başlatır | docker run -d -p 8080:80 nginx |
docker ps |
Çalışan konteynerleri listeler | docker ps -a |
docker stop |
Konteyner durdurur | docker stop container_id |
docker rm |
Konteyner siler | docker rm container_id |
docker images |
Görüntüleri listeler | docker images |
docker build |
Görüntü oluşturur | docker build -t myapp . |
docker logs |
Konteyner loglarını gösterir | docker logs container_id |
docker run komutunu açıklayayım çünkü en çok kullanacaksınız. -d parametresi konteyneri arka planda çalıştırıyor. -p 8080:80 ise host bilgisayarın 8080 portunu konteynerin 80 portuna yönlendiriyor. Yani tarayıcıda localhost:8080 yazdığınızda konteynerin içindeki web sunucusuna erişiyorsunuz.
Ben bir projede hem MySQL hem Redis hem de uygulama sunucusu çalıştırıyordum. Her biri için ayrı konteyner başlatmıştım. docker ps ile hepsini görüyordum, docker logs ile hangi sorun varsa anında buluyordum. Eskiden her servisi ayrı ayrı kurardım, saatler sürerdi. Docker ile her şey saniyelerde hazır.
Docker Compose ile Coklu Konteyner
Gerçek projelerde tek konteyner yetmiyor. Bir web uygulaması için en az üç konteyner gerekli: uygulama, veritabanı ve cache. Her birini tek tek başlatmak yerine Docker Compose ile hepsini bir dosyadan yönetebilirsiniz. Ben Docker Compose öğrenene kadar her konteyneri tek tek başlatıyordum ve sıralama sorunları yaşıyordum. Veritabanı henüz hazır değilken uygulama başlıyordu, hata veriyordu. Compose ile bu sorun tamamen çözüldü.
# docker-compose.yml
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
- redis
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: sifre123
MYSQL_DATABASE: uygulama
volumes:
- db_data:/var/lib/mysql
redis:
image: redis:7-alpine
volumes:
db_data:
Bu dosyayı docker-compose up -d komutuyla çalıştırdığınızda üç konteyner birden başlıyor. depends_on parametresi veritabanının önce başlamasını sağlıyor. Volumes ise veritabanı verilerinin kalıcı olmasını garanti ediyor. Konteyner silinse bile veriler kaybolmuyor.
Ben bu dosyayı her projemde kullanıyorum. Projeyi yeni bir bilgisayara taşımak için tek yapmam gereken docker-compose.yml dosyasını kopyalamak ve docker-compose up -d çalıştırmak. Her şey otomatik olarak kuruluyor ve çalışıyor.
Docker En Iyi Uygulamalar
Birkaç yıl sonra öğrendiğim Docker pratiklerini paylasmak istiyorum. Başlangıçta bunları bilmediğim için gereksiz yere çok büyük görüntüler oluşturdum ve disk alanını boşa harcadım.
- Hafif temel görüntü kullanın: Ubuntu yerine Alpine Linux tercih edin. Alpine sadece beş megabayt, Ubuntu ise yüzlerce megabayt. Ben ilk Dockerfile’ımı Ubuntu ile yazmıştım, görüntü boyutu bir buçuk gigabayttı. Alpine’a geçince seksen megabayta düştü. Tabii Alpine’ın paket yönetimi farklı, önce alışmanız gerekiyor.
- .dockerignore kullanın: Gereksiz dosyaların görüntüye girmesini engelleyin. node_modules, .git, .env gibi dosyalar görüntüde olmamalı. Ben bunu öğrenene kadar node_modules klasörünü de görüntüye ekliyordum, boyut şişiyordu.
- Katmanları minimize edin: Her RUN komutu yeni bir katman oluşturuyor. Birden fazla komutu tek bir RUN satırında birleştirin. Görüntü boyutunu ciddi şekilde düşürüyor.
- Etiketleme kuralları belirleyin:
latestetiketini üretimde kullanmayın. Spesifik sürüm numaraları kullanın. Ben bir kez latest ile güncelleme yaptım ve uygulama çöktü çünkü yeni sürümde breaking change vardı. O günden beri her görüntüde sürüm numarası yazıyorum. - Sırları görüntüye koymayın: Şifreler, API anahtarları gibi hassas bilgileri Dockerfile’a yazmayın. Ortam değişkenleri veya Docker secrets kullanın. Ben bir kez yanlışlıkla veritabanı şifremini görüntüye gömmüştüm ve görüntüyü paylasmak zorunda kaldığımda panikledim.
Sonuç
Docker öğrenmek başta zorlayıcı gelebilir ama yatırım yapmaya değer. Ben bir ayda temel komutları öğrendim, üç ayda Docker Compose’u kavradım. Şimdi yeni bir projeye başlarken Docker kurulumunu yapıştırmak ilk işim. “Benim bilgisayarmda çalışıyor” cümlesini hiç duymuyorum artık. Her ortamda aynı şekilde çalışıyor. Başlangıç için bir web sunucusu konteyneri başlatın, bir veritabanı bağlayın ve docker-compose.yml dosyanızı yazın. Zamanla daha karmaşık yapıları da keşfedeceksiniz.


