Docker nedir sorusunun en kısa yanıtı şudur: Docker, uygulamaları tüm bağımlılıklarıyla birlikte konteyner adı verilen taşınabilir, izole paketler içinde çalıştırmanızı sağlayan açık kaynaklı bir platformdur. 2013 yılında yayımlandığından beri "benim makinemde çalışıyordu" sorununu büyük ölçüde tarihe gömdü: konteyner haline getirilen bir uygulama, geliştiricinin dizüstü bilgisayarında da üretim sunucusunda da aynı şekilde çalışır.
Docker Nedir ve Sanal Makineden Farkı Ne?
Konteynerler sıklıkla sanal makinelerle (VM) karıştırılır, ancak çalışma prensipleri farklıdır:
- Sanal makine, hypervisor üzerinde tam bir işletim sistemi (çekirdek dahil) çalıştırır. Her VM gigabaytlarca yer kaplar ve dakikalar içinde açılır.
- Konteyner, ana işletim sisteminin çekirdeğini paylaşır; yalnızca uygulamayı ve bağımlılıklarını izole eder. Megabaytlarla ölçülür ve saniyeler içinde başlar.
- İmaj (image): Uygulamanın, çalışma zamanının ve bağımlılıkların salt okunur şablonu. Katmanlardan oluşur ve bir kez oluşturulduktan sonra değişmez.
- Konteyner (container): Bir imajdan başlatılan çalışan örnek. Aynı imajdan istediğiniz kadar konteyner ayağa kaldırabilirsiniz.
Benzetme: Sanal makine müstakil bir ev gibidir; her şeyi (tesisat, elektrik, temel) kendine aittir. Konteyner ise apartman dairesidir; binanın altyapısını paylaşır ama kapısı ve yaşam alanı ayrıdır.
Bu fark sayesinde tek bir sunucuda onlarca konteyner sorunsuz çalışabilir. İzolasyon, Linux çekirdeğinin namespace ve cgroups özellikleriyle sağlanır. Tam donanım izolasyonu veya farklı bir işletim sistemi çekirdeği gerekiyorsa VM hâlâ doğru tercihtir; Windows ve macOS üzerinde Docker Desktop da aslında konteynerleri hafif bir Linux sanal makinesi içinde çalıştırır.
İmaj ve Konteyner Kavramları
Docker'ın iki temel yapı taşı vardır:
Nesne yönelimli programlama biliyorsanız şu benzetme oturur: imaj sınıf, konteyner o sınıftan üretilmiş nesne gibidir. Hazır imajlar Docker Hub deposunda barınır; nginx, postgres, python, node gibi resmi imajlar buradan çekilir.
Temel Komutlar: run, ps, stop
Docker'ı kurduktan sonra (kurulum adımları için docs.docker.com adresine bakın) ilk konteynerinizi çalıştırın:
docker run hello-world
Bu komut imajı Docker Hub'dan indirir, konteyneri başlatır ve doğrulama mesajı yazdırır. Daha gerçekçi bir örnek olarak Nginx web sunucusunu çalıştıralım:
docker run -d -p 8080:80 --name web nginx
Parametrelerin anlamı:
-d: Konteyneri arka planda (detached) çalıştırır.-p 8080:80: Bilgisayarınızın 8080 portunu konteynerin 80 portuna bağlar; tarayıcıda http://localhost:8080 adresini açtığınızda Nginx karşılar.--name web: Konteynere okunabilir bir isim verir.Günlük yönetim komutları:
docker ps # çalışan konteynerleri listele
docker ps -a # durmuş olanlar dahil hepsini listele
docker logs web # konteynerin loglarını göster
docker exec -it web bash # konteynerin içine terminal aç
docker stop web # konteyneri durdur
docker rm web # konteyneri sil
docker images # indirilen imajları listele
Dockerfile ile Kendi İmajınızı Oluşturma
Kendi uygulamanızı paketlemek için proje köküne Dockerfile adında bir dosya yazarsınız. Basit bir Python uygulaması için örnek:
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
Satır satır ne olduğuna bakalım:
FROM: Temel alınacak imajı belirler; burada hafif bir Python 3.12 imajı.WORKDIR: Konteyner içindeki çalışma dizinini ayarlar.COPY ve RUN: Önce bağımlılık listesi kopyalanıp kurulur, sonra kaynak kod kopyalanır. Bu sıralama, Docker'ın katman önbelleğini verimli kullanmasını sağlar: kod değiştiğinde bağımlılıklar yeniden kurulmaz.EXPOSE: Uygulamanın dinlediği portu belgeler.CMD: Konteyner başladığında çalışacak komutu tanımlar.İmajı derleyip çalıştırmak için:
docker build -t benim-uygulamam:1.0 .
docker run -d -p 5000:5000 benim-uygulamam:1.0
-t parametresi imaja isim ve etiket verir; sondaki nokta, derleme bağlamının bulunduğunuz dizin olduğunu söyler.
Docker Compose ile Çoklu Konteyner
Gerçek uygulamalar genellikle birden fazla servisten oluşur: web uygulaması, veritabanı, önbellek... Docker Compose, hepsini tek bir compose.yaml dosyasında tanımlamanızı sağlar:
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: gizli_parola
volumes:
- db-verisi:/var/lib/postgresql/data
volumes:
db-verisi:
Tüm sistemi tek komutla ayağa kaldırırsınız:
docker compose up -d # servisleri başlat
docker compose logs -f # logları izle
docker compose down # hepsini durdur ve kaldır
Buradaki volumes tanımı önemlidir: konteynerler silinince içlerindeki veri de gider; kalıcı olması gereken veritabanı dosyaları volume adı verilen yönetilen alanlarda saklanır.
Temizlik ve Pratik İpuçları
Docker kullandıkça diskte kullanılmayan imajlar, durmuş konteynerler ve sahipsiz volume'lar birikir. Düzenli temizlik için şu komutlar işinizi görür:
docker system df # Docker'ın ne kadar disk kullandığını göster
docker container prune # durmuş konteynerleri sil
docker image prune -a # kullanılmayan tüm imajları sil
docker system prune # hepsini tek seferde temizle (onay ister)
Birkaç pratik ipucu daha:
latest yerine sürüm numarası kullanın (postgres:16 gibi); latest her zaman aynı imajı işaret etmez ve sürprizlere yol açar..dockerignore dosyası oluşturup node_modules, .git gibi klasörleri derleme bağlamından çıkarın; build süresi belirgin şekilde kısalır.slim veya alpine tabanlı küçük imajları tercih edin.Nereden Devam Etmeli?
Docker'ı öğrenmenin en iyi yolu kendi projelerinizden birini konteyner haline getirmektir. Resmi dokümantasyondaki Get Started serisi, bu yazıda değindiğimiz kavramları uygulamalı atölyelerle pekiştirir. Konteyner sayınız arttığında Kubernetes gibi orkestrasyon araçları gündeme gelir; ancak oraya geçmeden önce imaj, konteyner, Dockerfile ve Compose dörtlüsüne hakim olmak sağlam bir temel oluşturur.
Yorumlar (0)
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yazın