Blog
Guide

Docker Nedir? Container Mantığını Sıfırdan Anlatan Rehber

Recep Erdoğan10 min
Docker Nedir? Container Mantığını Sıfırdan Anlatan Rehber

Docker nedir sorusu, sunucu ve dağıtım dünyasına adım atan hemen herkesin karşısına çıkar. Kısa cevabı şudur: Docker, bir uygulamayı çalışması için gereken her şeyle birlikte taşınabilir tek bir pakete koyup, bu paketi herhangi bir makinede aynı şekilde çalıştırmanızı sağlayan bir platformdur. Böylece bir uygulamanın sizin bilgisayarınızda çalışıp sunucuda çalışmaması gibi klasik sorunlar büyük ölçüde ortadan kalkar.

Bu rehberde Docker'ın ne olduğunu, image ve container kavramlarının ne anlama geldiğini, Dockerfile mantığını, sanal makinelerden farkını ve üretim ortamında işlerin nasıl yürüdüğünü sade bir dille açıklıyoruz. Amaç, kavramı ilk kez duyan bir geliştiricinin de rahatça takip edebileceği net bir zemin kurmak.

Kısaca: Docker, bir uygulamayı kodu, çalışma zamanı, kütüphaneleri ve ayarlarıyla birlikte "image" adı verilen taşınabilir bir pakete koyan ve bu paketi "container" olarak izole biçimde çalıştıran bir platformdur. Container'lar işletim sistemi çekirdeğini paylaştığı için sanal makinelerden çok daha hafiftir ve saniyeler içinde başlar. Aynı image, dizüstü bilgisayarınızda da sunucuda da birebir aynı şekilde çalışır.

Docker nedir?

Docker, uygulamaları "container" adı verilen izole birimler içinde paketleyip çalıştıran açık kaynaklı bir platformdur. Bir uygulamanın yalnızca kendi kodunu değil, çalışması için gereken çalışma zamanını, sistem kütüphanelerini ve yapılandırmayı da tek bir yerde toplar. Bu paket her ortamda aynı içeriği taşıdığı için, uygulama nerede çalışırsa çalışsın davranışı tutarlı olur.

Docker, uygulamayı bağımlılıklarıyla birlikte taşınabilir bir image'a paketleyip container olarak çalıştıran bir platformdur. Container, uygulamayı ana sistemden yalıtır ama işletim sistemi çekirdeğini onunla paylaşır, bu yüzden hafiftir ve hızlı başlar.

Docker'ın çözdüğü asıl dert, ortamlar arasındaki tutarsızlıktır. Bir geliştiricinin bilgisayarında farklı bir kütüphane sürümü, sunucuda ise başka bir sürüm olduğunda uygulama beklenmedik biçimde bozulabilir. Docker, bu değişkenleri image'ın içine sabitleyerek "benim makinemde çalışıyordu" cümlesini geçmişte bırakır. Konunun resmi tanımı ve başlangıç adımları için Docker'ın kendi dokümantasyonu iyi bir kaynaktır.

Image ve container arasındaki fark

Docker'ı anlamanın anahtarı, image ile container arasındaki farkı kavramaktır. Bu ikisi sık sık karıştırılır ama aralarındaki ilişki oldukça nettir.

Image, bir uygulamanın ve bağımlılıklarının dondurulmuş, salt-okunur bir şablonudur. Container ise bu şablondan üretilen, çalışan canlı bir örnektir. Aynı image'dan birbirinden bağımsız çok sayıda container başlatabilirsiniz.

Bir benzetmeyle anlatmak gerekirse: image bir yemek tarifi gibidir, container ise o tarifle pişirilmiş bir tabak yemektir. Tarif değişmez ve tekrar tekrar kullanılabilir. Ondan istediğiniz kadar tabak çıkarabilirsiniz ve her tabak birbirinden bağımsızdır. Bir container'ı silmek, image'a dokunmaz; image durduğu sürece yeni container'lar üretmeye devam edebilirsiniz.

Image'lar katmanlardan oluşur. Her katman bir önceki katmanın üzerine eklenir ve yalnızca değişen kısımlar yeniden oluşturulur. Bu katmanlı yapı, image'ları hem küçük hem de yeniden kullanılabilir kılar. Hazır image'lar genellikle Docker Hub gibi kayıt defterlerinde (registry) saklanır ve docker pull ile indirilir.

Dockerfile mantığı

Bir image'ı sıfırdan nasıl oluşturursunuz? İşte burada Dockerfile devreye girer. Dockerfile, image'ın nasıl kurulacağını adım adım tarif eden düz bir metin dosyasıdır. Her satır bir talimattır ve genellikle image'a yeni bir katman ekler.

dockerfile
# Temel image olarak resmi Node.js image'ını kullan
FROM node:20-alpine

# Uygulama dizinini belirle
WORKDIR /app

# Önce bağımlılık tanımlarını kopyala ve kur
COPY package*.json ./
RUN npm ci --omit=dev

# Ardından uygulama kodunu kopyala
COPY . .

# Uygulamanın dinleyeceği portu belirt
EXPOSE 3000

# Container başladığında çalışacak komut
CMD ["node", "server.js"]

Buradaki sıralama bilinçlidir. Önce yalnızca package.json dosyalarını kopyalayıp bağımlılıkları kurmak, sonra kodu kopyalamak, katman önbelleğini daha verimli kullanmanızı sağlar. Kod değiştiğinde bağımlılık kurulum katmanı yeniden çalışmaz, bu da derlemeleri hızlandırır. Talimatların tam listesi için Dockerfile referansına bakabilirsiniz.

Temel Docker komutları

Docker'la günlük çalışma birkaç temel komutla döner. En sık kullanacaklarınız şunlardır:

bash
docker build -t uygulamam:1.0 .   # Dockerfile'dan image oluştur
docker run -d -p 3000:3000 uygulamam:1.0   # Container'ı arka planda çalıştır
docker ps            # Çalışan container'ları listele
docker logs <id>     # Bir container'ın günlüklerini gör
docker stop <id>     # Container'ı durdur

docker build komutu, Dockerfile'ı okuyup bir image üretir. -t bayrağı image'a bir ad ve etiket verir. docker run ise bu image'dan bir container başlatır; -d bayrağı container'ı arka planda çalıştırır, -p 3000:3000 ise container içindeki portu dışarıya açar. Bu birkaç komut, yerel geliştirmenin büyük kısmını kapsar.

Docker ile sanal makine arasındaki fark

Docker sık sık sanal makinelerle (VM) karşılaştırılır çünkü ikisi de yalıtım sağlar. Ancak çalışma biçimleri temelden farklıdır ve bu fark, Docker'ın neden bu kadar hafif olduğunu açıklar.

Sanal makine, kendi tam işletim sistemini içeren ve bir hipervizör üzerinde çalışan yalıtılmış bir bilgisayar taklididir. Container ise ana makinenin işletim sistemi çekirdeğini paylaşır ve yalnızca uygulama katmanını yalıtır, bu yüzden çok daha az kaynak tüketir.

Bir sanal makine, donanımı taklit eder ve her VM kendi işletim sistemini baştan yükler. Bu, gigabaytlarca disk ve dakikalarca başlangıç süresi demektir. Container ise ana sistemin çekirdeğini paylaşır, yalnızca uygulamayı ve bağımlılıklarını taşır. Sonuç, megabaytlar mertebesinde boyut ve saniyeler içinde başlangıçtır.

ÖlçütSanal makine (VM)Docker container
Yalıtım birimiTam işletim sistemiUygulama süreci
ÇekirdekHer VM kendi çekirdeğini yüklerAna sistemle paylaşılır
BoyutGenellikle gigabaytlarGenellikle megabaytlar
Başlangıç süresiDakikalar mertebesindeSaniyeler mertebesinde
Kaynak tüketimiYüksekDüşük
En uygun kullanımTam sistem yalıtımı, farklı çekirdeklerUygulama paketleme ve dağıtımı

Bu tablo, ikisinin rakip değil farklı işler için tasarlandığını gösterir. Farklı işletim sistemi çekirdekleri çalıştırmanız gerekiyorsa sanal makine mantıklıdır. Aynı çekirdek üzerinde çok sayıda uygulamayı verimli biçimde paketleyip taşımak istiyorsanız container doğru araçtır.

Üretimde Docker: container'ı kim çalıştırır?

Yerel makinenizde docker run yazmak kolaydır. Ama bir uygulamayı üretimde 7/24 ayakta tutmak, güncellemek, HTTPS ile yayınlamak ve çökerse yeniden başlatmak ayrı bir iştir. Burada iki yol vardır.

Birinci yol, container'ı kendi sunucunuzda elle yönetmektir. Bir sunucu kiralarsınız, üzerine Docker kurarsınız, image'ınızı çalıştırırsınız ve işletim sistemi güncellemelerinden yeniden başlatmalara kadar her şeyden siz sorumlu olursunuz. Kontrol tamamen sizdedir ama bu, sürekli bakım gerektiren bir sorumluluktur. Uygulamayı yayına almanın ne demek olduğunu deploy nedir yazımızda daha ayrıntılı anlatıyoruz.

İkinci yol, container'ı sizin yerinize çalıştıran bir platform kullanmaktır. Bir PaaS (Platform as a Service), Dockerfile'ınızı alır, image'ı sizin adınıza derler ve container'ı çalışır durumda tutar. Docker daemon kurmaz, sunucu yamalarıyla uğraşmaz, HTTPS sertifikasını elle yönetmezsiniz. Bu modeli ayrıntısıyla PaaS nedir yazısında bulabilirsiniz.

Out Plane tam olarak bu ikinci yolu izler. Deponuzdaki Dockerfile'dan image'ı derler, container'ı çalıştırır, otomatik olarak HTTPS verir ve isterseniz yanına yönetilen bir PostgreSQL veritabanı koyar. Uygulamanız {name}-{port}-{teamSlug}.outplane.app biçiminde herkese açık bir adreste yayına girer. Kalıcı veri gereken durumlar için kalıcı disk (volume) desteği vardır. Böylece Docker'ın gücünden yararlanırken bir sunucuyu yönetme yükünü üstlenmezsiniz. Container tabanlı bir servisi otomasyon için nasıl kullanabileceğinize dair somut bir örnek için n8n nedir yazısına göz atabilirsiniz.

Sıkça Sorulan Sorular

Docker tam olarak ne işe yarar?

Docker, bir uygulamayı kodu ve tüm bağımlılıklarıyla birlikte taşınabilir bir image'a paketler ve bu image'ı her ortamda aynı şekilde çalışan bir container olarak başlatır. Böylece ortamlar arası tutarsızlıkları ortadan kaldırır, dağıtımı hızlandırır ve uygulamayı ana sistemden yalıtır.

Docker image ile container aynı şey mi?

Hayır. Image, uygulamanın salt-okunur, dondurulmuş şablonudur. Container ise bu şablondan üretilen, çalışan canlı örnektir. Bir image bir kez oluşturulur, ondan birbirinden bağımsız çok sayıda container başlatabilirsiniz. Container'ı silmek image'a zarar vermez.

Docker bir sanal makine midir?

Değildir. Sanal makine kendi tam işletim sistemini yükler ve donanımı taklit eder. Docker container'ı ise ana sistemin çekirdeğini paylaşır ve yalnızca uygulama katmanını yalıtır. Bu yüzden container'lar megabaytlar mertebesinde kalır ve saniyeler içinde başlarken, sanal makineler gigabaytlar ve dakikalar gerektirir.

Docker ücretsiz mi?

Docker Engine açık kaynaklıdır ve ücretsiz kullanılır. Masaüstü uygulaması olan Docker Desktop, büyük şirketler için ücretli lisans gerektirebilir ama bireysel geliştiriciler, küçük ekipler ve eğitim kullanımı için ücretsizdir. Sunucularda genellikle doğrudan Docker Engine çalıştırılır.

Dockerfile ne işe yarar?

Dockerfile, bir image'ın nasıl oluşturulacağını adım adım tarif eden düz bir metin dosyasıdır. Her talimat image'a bir katman ekler: temel image seçme, dosya kopyalama, bağımlılık kurma ve başlangıç komutunu belirleme gibi. docker build komutu bu dosyayı okuyarak image'ı üretir.

Docker'ı üretimde tek başına kullanmak yeterli mi?

Küçük ölçekte tek bir sunucuda Docker yeterli olabilir. Ancak çok sunuculu, yüksek erişilebilirlik gerektiren kurulumlarda container'ları orkestre eden Kubernetes gibi araçlar veya container'ı sizin yerinize çalıştıran bir PaaS devreye girer. Çoğu küçük ekip için bir PaaS, karmaşıklığı üstlenmeden ihtiyacı karşılar.

Sonuç

Docker nedir sorusunun özü şudur: uygulamanızı bağımlılıklarıyla birlikte taşınabilir bir image'a paketleyip her yerde aynı şekilde çalışan bir container olarak başlatan bir platform. Image ile container ayrımını, Dockerfile'ın katmanlı mantığını ve container'ın sanal makineye göre neden çok daha hafif olduğunu kavradığınızda, modern dağıtımın büyük kısmı yerine oturur.

Üretimde asıl soru, container'ı kimin çalıştıracağıdır. Dockerfile'ınızı yazın ve bir platformun onu sizin yerinize güvenilir biçimde derleyip çalıştırmasına izin verin. Konsolda bir uygulama oluşturarak başlayabilir, ücretsiz Hobby katmanını ve kullandıkça öde Pro ayrıntılarını fiyatlandırma sayfasında görebilirsiniz.


Start deploying in minutes

Connect your GitHub repository and deploy your first application today. $20 free credit. No credit card required.