Uygulaman senin makinende sorunsuz çalışıyor ama sunucuda bir türlü ayağa kalkmıyor. Bu tanıdık geliyorsa yalnız değilsin. Docker tam da bu "bende çalışıyordu" sorununu çözmek için var ve bu rehber temelden başlamak isteyenler için.Konteynerleştirme, uygulamanı çalıştırmak için gereken her şeyi tek bir pakete koymak demek. Kod, kütüphaneler, çalışma ortamı; hepsi içeride. Bu paket nereye taşınırsa taşınsın aynı şekilde davranır. Geliştirme makinen, test sunucun ve canlı ortamın arasındaki farklar artık seni uğraştırmaz.
Docker tam olarak nedir?
Docker, uygulamaları konteyner adı verilen izole birimler içinde paketleyip çalıştıran bir platformdur. Her konteyner kendi dosya sistemi, ağ arayüzü ve süreçleriyle gelir. Ama sanal makinelerden farklı olarak, işletim sistemi çekirdeğini host ile paylaşır. Bu yüzden çok daha hafiftir ve saniyeler içinde başlar.Sanal makine bütün bir işletim sistemini taşırken konteyner sadece uygulamanı ve bağımlılıklarını taşır. Bir sunucuda onlarca konteyneri rahatça çalıştırabilirsin. Resmi belgelerdeki başlangıç rehberi bu mantığı uygulamalı örneklerle anlatıyor.Bu hafiflik pratikte ne anlama geliyor? Bir konteyner birkaç saniyede başlar ve gerektiğinde aynı hızla durur. Geliştirme sırasında bir servisi kapatıp açmak işini yavaşlatmaz. Aynı imajdan onlarca örnek çalıştırmak, sanal makinelerde aklından bile geçirmeyeceğin kadar ucuza gelir.
İmaj ve konteyner arasındaki fark
Yeni başlayanların en çok karıştırdığı iki kavram bunlar. Aralarındaki ilişki aslında basit. İmaj bir şablondur, konteyner ise o şablondan üretilen canlı kopyadır.
KavramNe işe yararDurumu
İmaj | Uygulamanın tüm dosyalarını ve bağımlılıklarını içeren salt okunur şablon | Disk üzerinde durur
Konteyner | İmajdan üretilen, kendi süreciyle çalışan canlı örnek | Çalışır durumdadır
Bir imajdan istediğin kadar konteyner üretebilirsin. Mimari için bir blueprint düşün; aynı plandan birden çok bina yaparsın. İmajı sadece bir kez tanımlarsın, sonra defalarca çalıştırırsın.
Dockerfile ile imaj oluşturma
İmaj üretmenin yolu Dockerfile adlı bir metin dosyasından geçer. Bu dosya, imajın nasıl kurulacağını anlatan adımları içerir. Hangi temel imajı kullanacağın, hangi dosyaları kopyalayacağın ve uygulamanın nasıl başlayacağı burada tanımlanır.Basit bir Node.js uygulaması için Dockerfile şöyle görünebilir:
FROM node:20-alpine WORKDIR /app COPY package.json . RUN npm install COPY . . EXPOSE 3000 CMD ["node", "server.js"]
Her satır imaja yeni bir katman ekler. Docker bu katmanları önbelleğe alır, böylece sonraki yapılar çok daha hızlı tamamlanır. Bağımlılıkları kodundan önce kopyalaman da bu önbellekleme yüzünden önemlidir.Temel imaj seçimi de imaj boyutunu doğrudan etkiler. Yukarıdaki örnekte alpine etiketli küçük bir imaj kullandık. Bu tercih, üretilen imajı megabaytlar düzeyinde tutar. Tam sürümlü bir imaj daha fazla araç getirir ama gereksiz şişkinlik de katar. İhtiyacın olmayan paketleri imaja koymamak iyi bir alışkanlıktır.
İlk pratik adımların
Docker yüklendikten sonra ihtiyacın olan komutlar az sayıdadır. Aşağıdaki sıra, bir uygulamayı paketlemekten çalıştırmaya kadar tüm akışı kapsıyor.
- Projenin kök dizinine bir Dockerfile yerleştir.
- İmajı üret: docker build -t uygulamam .
- Konteyneri başlat: docker run -p 3000:3000 uygulamam
- Çalışan konteynerleri gör: docker ps
Bir de .dockerignore dosyası eklemeyi unutma. node_modules, .git ve .env gibi şeyleri dışarıda bırakır. Hem imaj boyutun küçülür hem de gizli bilgilerin yanlışlıkla imaja sızmaz.Konteyner içine girip bir şeyleri incelemek istersen docker exec komutu işini görür. Logları takip etmek için docker logs yeterli. İşin bittiğinde durdurduğun konteynerleri ve kullanılmayan imajları temizlemeyi unutma; disk alanın zamanla bunlarla dolar.
Birden fazla servisi yönetmek
Gerçek uygulamalar genelde tek konteynerle bitmez. Bir veritabanın, bir önbellek katmanın ve uygulama sunucun olur. Docker Compose tam burada devreye girer. Tüm servisleri tek bir YAML dosyasında tanımlar, hepsini tek komutla ayağa kaldırırsın.Compose dosyasında her servisi ayrı tanımlarsın, aralarındaki ağ bağlantısını Docker otomatik kurar. Eski sürümlerdeki version alanına artık gerek yok; doğrudan services bloğuyla başlayabilirsin. Sağlık kontrolleri eklersen Docker, bozulan bir servisi fark edip yeniden başlatabilir.
Üretime giderken
Konteynerlerin asıl gücü, onları bir sunucuda çalıştırdığında ortaya çıkar. Hafif yapıları sayesinde NVMe diskli, garantili CPU ve RAM sunan bir VPS üzerinde rahatça ölçeklenirler. Trafik arttığında yeni konteyner örnekleri eklemek dakikalar sürer.Kritm Cloud Solutions olarak Türkiye lokasyonlu bulut altyapımız bu iş yükleri için tasarlandı. Saatlik faturalama ve dakikalar içinde sunucu oluşturma ile Docker projelerini hızlıca yayına alabilirsin. Bulut çözümlerimizi inceleyebilir, ihtiyacına uygun bir yapı için bizimle iletişime geçebilirsin.Özetle Docker, uygulamalarını ortamdan bağımsız hale getirir. Imaj ve konteyner farkını kavradıktan sonra ilk Dockerfile'ını yazmak yarım saatini almaz. Küçük bir projeyle başla, komutları pratik et, sonra Compose ile çok servisli yapılara geç.
