Bir uygulamayı geliştirme makinenizde sorunsuz çalıştırıp sunucuya taşıdığınızda her şeyin dağıldığı o anı çoğu sistem yöneticisi yaşamıştır. Bağımlılık çakışmaları, farklı kütüphane sürümleri ve eksik sistem paketleri bu sancının başlıca kaynaklarıdır. Konteyner teknolojisi tam olarak bu kopukluğu ortadan kaldırmak için doğdu ve bugün modern sunucu yönetiminin temel taşlarından biri haline geldi.

Docker Tam Olarak Ne İşe Yarar?

Docker, bir uygulamayı çalışması için gereken her şeyle (kod, çalışma zamanı, sistem kütüphaneleri, ayar dosyaları) birlikte tek bir taşınabilir paket içine kapsülleyen açık kaynaklı bir konteynerleştirme platformudur. Bu paketin adı imaj, imajdan üretilen çalışan örneğin adı ise konteynerdir. Sanal makinelerden farkı, her örnek için ayrı bir işletim sistemi çekirdeği başlatmaması; bunun yerine ana sunucunun Linux çekirdeğini paylaşmasıdır.

Bu paylaşım sayesinde konteynerler saniyeler içinde ayağa kalkar, çok daha az bellek tüketir ve aynı donanım üzerinde sanal makinelere kıyasla belirgin biçimde daha yüksek yoğunlukta çalıştırılabilir.

Platformun kalbinde üç bileşen yatar: imajları katman katman saklayan bir depo, bu katmanları üst üste bindirerek çalışan konteyneri oluşturan çalışma zamanı (containerd) ve geliştiricinin komut verdiği istemci. Bir imajı her güncellediğinizde Docker yalnızca değişen katmanı yeniden indirir; bu da tekrar eden dağıtımlarda hem bant genişliğinden hem de zamandan tasarruf sağlar.

Konteyner ile Sanal Makine Arasındaki Fark

İkisi de izolasyon sağlar ama mimari yaklaşımları temelden ayrışır. Sanal makineler hipervizör üzerinde tam bir misafir işletim sistemi barındırırken, konteynerler çekirdek seviyesinde namespace ve cgroup özelliklerini kullanarak süreçleri yalıtır.

ÖzellikDocker KonteyneriSanal Makine
İzolasyon katmanıÇekirdek namespace / cgroupHipervizör + misafir OS
Başlangıç süresiGenellikle saniyelerÇoğu durumda dakikalar
Disk boyutuYaklaşık onlarca MBYaklaşık birkaç GB
Kaynak yüküDüşükDaha yüksek
Çekirdek paylaşımıEvet (ana sistemle)Hayır (ayrı çekirdek)

Bu tablo neden tek bir ihtiyaçlarınıza uygun bir sanal sunucu üzerinde onlarca konteyneri rahatça çalıştırabileceğinizi de özetliyor: konteynerler kaynakları cömertçe paylaşır.

VDS Üzerinde Docker Kurulumu

Ubuntu ve Debian tabanlı bir VDS için en güvenilir yöntem, resmi Docker deposunu eklemektir. Dağıtımla gelen eski docker.io paketi yerine güncel sürümü almak için aşağıdaki adımları izleyebilirsiniz.

# Gerekli yardımcı paketler
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg

# Docker resmi GPG anahtarı
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

# Depoyu ekle ve motoru kur
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# Servisi başlat ve sunucu açılışında otomatik çalışacak şekilde ayarla
sudo systemctl enable --now docker
docker --version

Kurulum sonrası sudo usermod -aG docker $USER komutuyla kullanıcınızı docker grubuna ekleyerek her komutta sudo yazma zorunluluğundan kurtulabilirsiniz; değişikliğin etkin olması için oturumu kapatıp açmanız gerekir.

İlk Konteynerinizi Çalıştırmak

Motorun çalıştığını doğrulamak ve temel akışı görmek için basit bir Nginx konteyneri başlatabilirsiniz. Aşağıdaki komut imajı çeker, arka planda çalıştırır ve sunucunun 8080 portunu konteynerin 80 portuna yönlendirir.

docker run -d --name web --restart unless-stopped -p 8080:80 nginx:1.27-alpine
docker ps
docker logs web

Sık kullanacağınız temel komutlar arasında şunlar öne çıkar:

  • docker images: Yerel imaj listesini gösterir.
  • docker exec -it web sh: Çalışan konteynerin içinde kabuk açar.
  • docker stop / docker rm: Konteyneri durdurur ve siler.
  • docker system prune: Kullanılmayan imaj, ağ ve katmanları temizleyerek disk alanı geri kazandırır.

Dockerfile ve Docker Compose

Kendi uygulamanızı imaj haline getirmek için proje kökünde bir Dockerfile tanımlarsınız. Birden çok servisi (uygulama, veritabanı, önbellek) birlikte yönetmek istediğinizde ise docker compose devreye girer. Aşağıdaki compose.yaml, bir web uygulamasını PostgreSQL ile birlikte ayağa kaldırır.

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://app:secret@db:5432/appdb
    depends_on:
      - db
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: appdb
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

Tüm yığını docker compose up -d ile başlatır, docker compose down ile durdurursunuz. Veritabanı verisinin pgdata adlı bir hacimde tutulduğuna dikkat edin; konteyner silinse bile veriniz korunur.

Veri Kalıcılığı ve Ağ Yönetimi

Konteynerler doğaları gereği geçicidir; içine yazdığınız dosyalar konteyner silindiğinde kaybolur. Kalıcı veri için iki temel yöntem vardır. Adlandırılmış hacimler Docker tarafından yönetilir ve veritabanları için idealdir. Bind mount ise ana sistemdeki belirli bir dizini konteynere bağlar, ki bu da konfigürasyon dosyaları için pratiktir.

Ağ tarafında ise aynı kullanıcı tanımlı ağa bağlı konteynerler birbirini servis adıyla bulabilir. Yani yukarıdaki örnekte uygulama, veritabanına db ana makine adı üzerinden ulaşır; sabit IP yazmanıza gerek kalmaz. Yedekleme stratejinizi kurarken de bu ayrımı gözetin: kodunuz imajda durduğu için yedeklemeniz gereken asıl değerli kısım hacimlerdir. docker run --rm -v pgdata:/data -v $(pwd):/backup alpine tar czf /backup/db.tar.gz /data gibi tek satırlık bir komutla bir hacmin tamamını sıkıştırılmış bir arşive alabilir, böylece felaket senaryolarında veriyi temiz bir sunucuya saniyeler içinde geri yükleyebilirsiniz.

Bogahost Önerisi: Üretim ortamında konteyner trafiğini doğrudan dışarı açmak yerine bir ters proxy (Nginx ya da Traefik) arkasına alın, hassas portları sadece yerel ağa bağlayın ve düzenli olarak docker compose pull ile imajlarınızı güncel tutarak güvenlik yamalarını kaçırmayın.

Üretim İçin Performans ve Güvenlik İpuçları

Konteynerleri canlı ortamda sağlıklı yürütmek birkaç temel alışkanlığa bağlıdır:

  • Kaynak sınırı koyun: --memory ve --cpus bayraklarıyla bir konteynerin tüm sunucuyu tüketmesini engelleyin.
  • Sağlık kontrolü tanımlayın: HEALTHCHECK direktifiyle Docker'ın takılan servisi otomatik yeniden başlatmasını sağlayın.
  • Küçük temel imajlar seçin: alpine veya slim etiketli imajlar saldırı yüzeyini ve disk kullanımını azaltır.
  • Root kullanıcıdan kaçının: Dockerfile içinde USER tanımlayarak konteyneri ayrıcalıksız bir kullanıcıyla çalıştırın.

Yoğun konteyner iş yükleri, sürekli yüksek saat hızından faydalanır. Tek çekirdek başına performansın belirleyici olduğu derleme ve veritabanı işlerinde, yüksek frekanslı bir Ryzen tabanlı VDS sanal sunucu tercih etmek konteyner başlatma ve yanıt sürelerinde gözle görülür fark yaratır.

Özetle

Docker, uygulamalarınızı taşınabilir ve tekrarlanabilir paketlere dönüştürerek "benim makinemde çalışıyordu" sorununu kökten çözer. VDS üzerinde kurulumu birkaç komutluk bir iştir; asıl değer ise tutarlı dağıtım, hızlı ölçekleme ve temiz izolasyonla ortaya çıkar. Temel komutları ve Compose mantığını oturttuğunuzda, sunucunuzu çok daha esnek ve bakımı kolay bir altyapıya dönüştürmüş olursunuz.

Reklam Alanı

İçerik Altı (728x90)

Yorumlar (0)

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Yorum Yap

Maksimum 2000 karakter