Yazılım

Docker Nedir, Ne İşe Yarar? Yazılımcılar İçin Sıfırdan Docker ve Container Rehberi

Talha AslanTalha Aslan 15 dk okuma 2 görüntülenme

Docker nedir ve yazılımcıya ne kazandırır?

Docker, bir uygulamayı kodu, çalışma zamanı, kütüphaneleri ve ayarlarıyla birlikte container adı verilen ayrı bir paket içinde çalıştıran açık kaynak platformdur. Böylece uygulama geliştiricinin dizüstü bilgisayarında, test sunucusunda ve canlı ortamda aynı sonucu verir; "bende çalışıyordu" sorunu büyük ölçüde ortadan kalkar.

Ben 2012'den beri web projeleriyle uğraşıyorum ve Docker nedir sorusunu bana en çok soranlar, ekibine yeni katılan geliştiriciyi iki gün kurulumla uğraştıran firmalar oldu. Bu rehberde container kavramını, Dockerfile yazmayı, image ile container farkını, Docker Compose kullanımını ve sanal makineyle farkını sıfırdan anlatıyorum. Örnekleri kendi projelerimde kullandığım sade kalıplardan seçtim.

Resmi tanım için Docker dokümantasyonundaki genel bakış sayfasına de göz atabilirsiniz. Ancak dokümantasyon çok geniş; bu yüzden ben burada önce zihinsel modeli kurmaya, ardından komutlara geçmeye çalışacağım.

Container kavramı tam olarak ne anlama geliyor?

Container, işletim sisteminin çekirdeğini paylaşan ama kendi dosya sistemi, ağ arayüzü ve süreç ağacı olan ayrı bir çalışma alanıdır. Linux tarafında bunu namespaces ve cgroups adlı iki çekirdek özelliği sağlar. Namespaces, süreçlerin neyi görebileceğini sınırlar; cgroups ise ne kadar CPU ve bellek kullanabileceğini belirler.

Yani container aslında sihirli bir kutu değil, sınırlarını çekirdeğin belirlediği sıradan bir Linux sürecidir. Bu ayrım önemli, çünkü container içinde çalışan uygulama ayrı bir işletim sistemi açmaz. Dolayısıyla saniyeler içinde başlar ve az kaynak tüketir.

Konteyner fikri Docker'dan eskidir; chroot, FreeBSD jails ve LXC gibi yaklaşımlar yıllardır vardı. Docker'ın asıl katkısı, bu teknolojiyi paketlenebilir, paylaşılabilir ve tek komutla çalıştırılabilir hâle getirmesi oldu. Üstelik bugün container imajlarının biçimi Open Container Initiative (OCI) standardı belirliyor; bu sayede Docker ile ürettiğiniz imajı Podman gibi başka araçlarla da çalıştırabilirsiniz.

Docker ile sanal makine arasındaki fark nedir?

Sanal makine, donanımı taklit eden bir hipervizör üzerinde kendi çekirdeğiyle eksiksiz bir işletim sistemi çalıştırır. Container ise ana makinenin çekirdeğini paylaşır ve yalnızca uygulamanın ihtiyaç duyduğu dosyaları taşır. Bu farkı boyutta, açılış süresinde ve yalıtım düzeyinde doğrudan görürsünüz.

KriterContainer (Docker)Sanal makine (VM)
ÇekirdekAna makinenin çekirdeğini kullanırHer VM kendi çekirdeğini çalıştırır
Açılış süresiGenellikle saniyelerGenellikle dakikalar
İmaj boyutuOnlarca veya yüzlerce MBÇoğu zaman birkaç GB
YalıtımSüreç düzeyinde, daha inceDonanım düzeyinde, daha güçlü
Tipik kullanımMikro servis, CI, geliştirme ortamıFarklı işletim sistemi, güçlü yalıtım gerektiren iş

Tablodaki süre ve boyutlar kesin ölçüm değil, genel eğilimdir; imajın içeriğine göre değişir. Öte yandan iki teknoloji birbirinin rakibi değil. Pratikte bulut sağlayıcılarında Docker container'ları çoğu zaman bir sanal makinenin içinde çalışır. Kısacası VM altyapıyı bölmek, container ise uygulamayı paketlemek için idealdir.

Docker nasıl çalışır: mimaride hangi parçalar var?

Docker istemci ve sunucu mimarisiyle çalışır. Terminalde yazdığınız docker komutu istemcidir; asıl işi arka planda çalışan Docker daemon (dockerd) yapar. İstemci, daemon ile bir REST API üzerinden konuşur.

  • Docker istemcisi: docker run, docker build gibi komutları alır ve daemon'a iletir.
  • Docker daemon: imajları oluşturur, container'ları başlatır, ağları ve volume'ları yönetir.
  • containerd ve runc: daemon'ın altında container yaşam döngüsünü yöneten ve süreci gerçekten başlatan katmanlardır.
  • Registry: imajların saklandığı depodur; en bilineni Docker Hub, ama kendi özel registry'nizi de kurabilirsiniz.

Mac ve Windows'ta durum biraz farklı. Bu sistemlerin çekirdeği Linux olmadığı için Docker Desktop arka planda hafif bir Linux sanal makinesi açar ve container'ları onun içinde çalıştırır. Bu yüzden Mac'te dosya paylaşımlı volume'lar Linux'a göre daha yavaş hissedilebilir; bunu kendi M serisi makinemde de gözlemledim.

Image ile container arasındaki fark ne?

Image, salt okunur bir şablondur; container ise o şablondan başlatılmış, çalışan bir örnektir. Programlamadaki sınıf ve nesne ilişkisine benzetebilirsiniz. Tek bir image'dan aynı anda onlarca container başlatabilirsiniz.

Image katmanlardan oluşur. Dockerfile içindeki her talimat yeni bir katman üretir ve Docker bu katmanları önbelleğe koyar. Örneğin önce işletim sistemi tabanı, sonra bağımlılıklar, en sonda kodunuz gelir. Kodunuzu değiştirdiğinizde yalnızca son katman yeniden oluşur; böylece derlemeleriniz hızlanır.

Container başladığında imajın üzerine Docker ince, yazılabilir bir katman ekler. Container'ı silerseniz bu katman da gider. Dolayısıyla veritabanı dosyası gibi kalıcı olması gereken veriyi container içinde değil, volume üzerinde tutmanız gerekir. Yeni başlayanların en sık yaşadığı sürpriz budur: container'ı silip yeniden başlatınca verinin kaybolması.

Image'ları etiketle (tag) sürümlersiniz: nginx:1.27 veya uygulamam:v3 gibi. Etiket yazmazsanız Docker latest etiketini varsayar. Ancak latest "en yeni" anlamına garanti vermez, sadece varsayılan etiketin adıdır. Canlı ortamda sabit sürüm etiketi kullanmanızı öneririm.

Docker'ı nasıl kurarsınız, ilk container'ı nasıl çalıştırırsınız?

Mac ve Windows için en kolay yol Docker Desktop kurmaktır; Linux'ta ise Docker Engine'i dağıtımınızın paket deposundan kurabilirsiniz. Kurulum adımları sık değiştiği için resmi kurulum sayfasını takip etmenizi tavsiye ederim.

Kurulumdan sonra şu sırayla ilerleyebilirsiniz:

  1. docker version yazarak istemci ve daemon'ın ikisinin de yanıt verdiğini doğrulayın.
  2. docker run hello-world ile test imajını indirip çalıştırın; ekrana bir karşılama mesajı gelmeli.
  3. docker run -d -p 8080:80 nginx komutuyla bir Nginx sunucusu başlatın ve tarayıcıda localhost:8080 adresini açın.
  4. docker ps ile çalışan container'ları listeleyin.
  5. docker stop ve ardından docker rm ile container'ı durdurup silin.

Buradaki -p 8080:80 parametresi, ana makinenin 8080 portunu container'ın 80 portuna bağlar. -d ise container'ı arka planda çalıştırır. Bu iki parametreyi anladığınızda Docker'ın günlük kullanımının yarısını çözmüş olursunuz.

Dockerfile nedir, nasıl yazarsınız?

Dockerfile, bir imajın nasıl oluşturulacağını adım adım anlatan düz metin dosyasıdır. Basit bir Node.js uygulaması için tipik bir Dockerfile şu satırlardan oluşur:

  • FROM node:20-alpine
  • WORKDIR /app
  • COPY package*.json ./
  • RUN npm ci --omit=dev
  • COPY . .
  • EXPOSE 3000
  • CMD ["node", "server.js"]

FROM taban imajı seçer; alpine sürümlerini küçük oldukları için çoğu ekip tercih eder. WORKDIR çalışma dizinini belirler. Önce yalnızca package dosyalarını kopyalayıp bağımlılıkları kurmamızın nedeni önbellektir: kodunuz değişse bile bağımlılık listesi değişmediyse Docker o katmanı yeniden kurmaz.

Ardından docker build -t uygulamam:1.0 . komutuyla imajı oluşturursunuz. Sondaki nokta, derleme bağlamının içinde bulunduğunuz klasör olduğunu söyler. Ayrıca aynı klasöre bir .dockerignore dosyası koyup node_modules, .git ve .env gibi klasörleri dışarıda bırakmanızı öneririm; hem imajınız küçülür hem de gizli bilgiler imaja sızmaz.

Dockerfile yazarken hangi hatalardan kaçınmalısınız?

Kendi projelerimde ve devraldığım kodlarda en sık gördüğüm hatalar birbirine çok benziyor. Aşağıdaki liste, imajın hem daha küçük hem daha güvenli olmasını sağlar:

  • Gizli bilgiyi imaja gömmek: API anahtarını ENV satırına yazmak onu imajın geçmişine kalıcı olarak kaydeder. Bunun yerine çalışma anında ortam değişkeni veya secret kullanın.
  • Root kullanıcıyla çalışmak: USER talimatıyla yetkisiz bir kullanıcıya geçin.
  • Gereksiz büyük taban imaj: tam Ubuntu yerine slim veya alpine sürümlerini deneyin.
  • Önbelleği bozan sıralama: sık değişen kodu en sona kopyalayın.
  • Sabit olmayan sürüm: FROM satırında latest yerine belirli bir sürüm etiketi yazın.

Bir de çok aşamalı derleme (multi-stage build) var. Birinci aşamada derleyici ve geliştirme araçlarıyla uygulamayı derlersiniz, ikinci aşamada yalnızca çıktıyı küçük bir taban imaja kopyalarsınız. Özellikle Go, Java ve ön yüz projelerinde imaj boyutunu belirgin biçimde düşürür. Ben artık derleme adımı olan her projede bu yöntemi varsayılan olarak kullanıyorum.

Volume ve bind mount ne işe yarar?

Container'ın yazılabilir katmanı geçicidir; bu nedenle kalıcı veriyi dışarıda saklamanız gerekir. Docker bunun için iki temel yol sunar: volume ve bind mount.

  • Volume: Docker'ın yönettiği depolama alanıdır. docker volume create veri komutuyla oluşturur, -v veri:/var/lib/mysql ile bağlarsınız. Veritabanları için ilk tercihtir.
  • Bind mount: ana makinedeki belirli bir klasörü container'a bağlar. Geliştirme sırasında kodu anında container'a yansıtmak için kullanışlıdır.
  • tmpfs: veriyi yalnızca bellekte tutar; container durunca silinir.

Benim pratik kuralım basit: canlı ortamda volume, yerel geliştirmede bind mount. Üstelik volume'ları yedeklemek de kolaydır; geçici bir container açıp volume içeriğini arşivleyebilirsiniz. Veritabanını container'da çalıştırıyorsanız yedek planını ilk gün kurun, sonra değil.

Docker ağları nasıl çalışır?

Her container varsayılan olarak bridge adlı bir sanal ağa katılır. Aynı kullanıcı tanımlı ağdaki container'lar birbirine isimleriyle ulaşabilir; yani uygulamanız veritabanına IP yerine db gibi bir adla ulaşır. Docker bu isim çözümlemesini kendi iç DNS'iyle yapar.

docker network create uygulama-agi komutuyla bir ağ oluşturup container'ları --network parametresiyle bu ağa bağlayabilirsiniz. Ancak dışarıya açmak istediğiniz servisler için mutlaka -p ile port yayınlamanız gerekir. Yayınlamadığınız port yalnızca ağ içinden erişilebilir kalır; bu da veritabanı gibi servisler için istediğimiz durumdur.

Burada bir güvenlik notu düşmem gerek. Linux'ta Docker, port yayınlarken iptables kurallarını kendisi düzenler ve bu, ufw gibi basit güvenlik duvarı kurallarını atlayabilir. Dolayısıyla sunucuda veritabanı portunu -p 3306:3306 ile yayınlamak, onu internete açmak anlamına gelebilir. Sadece yerelde erişmek istiyorsanız -p 127.0.0.1:3306:3306 yazın.

Docker Compose nedir ve ne zaman işinize yarar?

Docker Compose, birden fazla container'dan oluşan bir uygulamayı tek bir YAML dosyasıyla tanımlayıp tek komutla ayağa kaldırmanızı sağlayan araçtır. Örneğin bir web uygulaması, bir veritabanı ve bir önbellek servisi; üçünü ayrı ayrı docker run ile başlatmak yerine compose.yaml dosyasında tarif edersiniz.

Tipik bir dosyada services başlığı altında web ve db adında iki servis yer alır. Web servisi build: . ile kendi Dockerfile'ını kullanır ve 3000 portunu yayınlar. Db servisi ise postgres:16 imajını kullanır, bir volume kullanır ve şifresini ortam değişkeninden alır. depends_on satırı da web servisinin db'den sonra başlamasını söyler.

Sonrasında docker compose up -d ile hepsini başlatır, docker compose logs -f ile günlükleri izler, docker compose down ile kapatırsınız. Eskiden ayrı bir docker-compose aracı vardı; bugün Compose, docker compose alt komutu olarak Docker'ın içinde geliyor. Ayrıntılı başvuru için Compose dokümantasyonu iyi bir kaynak.

Günlük işte en çok kullanacağınız Docker komutları hangileri?

İlk haftalarda aşağıdaki komutlar işinizin büyük kısmını görür. Bunları bir kenara not etmenizi öneririm:

KomutNe yapar?
docker ps -aÇalışan ve durmuş tüm container'ları listeler
docker imagesYereldeki imajları gösterir
docker logs -f adContainer günlüğünü canlı izler
docker exec -it ad shÇalışan container içinde kabuk açar
docker build -t ad:etiket .Dockerfile'dan imaj oluşturur
docker pull / pushRegistry'den imaj indirir veya gönderir
docker system dfDisk kullanımını özetler
docker system pruneKullanılmayan veriyi temizler

Özellikle docker exec ve docker logs, hata ayıklamanın temelidir. Öte yandan docker system prune komutunu dikkatli kullanın; parametrelerine göre durmuş container'ları ve kullanılmayan imajları siler. Disk dolduğunda ilk bakacağım yer docker system df çıktısıdır.

Docker hangi projelerde gerçekten işe yarar?

Docker her derde deva değil, ama bazı senaryolarda farkı çok net hissedersiniz. Bu yüzden benim deneyimimde öne çıkan kullanım alanlarını sıralayayım:

  • Ekibe hızlı katılım: yeni geliştirici depoyu klonlar, docker compose up yazar ve dakikalar içinde çalışan bir ortama sahip olur.
  • Farklı sürümleri yan yana çalıştırmak: bir projede PHP 7.4, diğerinde PHP 8.3 gerekiyorsa ikisini aynı sunucuda çakışmadan tutabilirsiniz.
  • Sürekli entegrasyon (CI): testler her seferinde temiz ve aynı ortamda koşar.
  • Eski uygulamaları yaşatmak: güncellenemeyen eski bir sistemi ayrı bir container'da çalıştırıp ana sunucuyu modern tutabilirsiniz.
  • Mikro servisler: her servis kendi bağımlılıklarıyla ayrı bir pakette yaşar.

Eski uygulama senaryosunu bizzat yaşadım: eski PHP sürümü isteyen bir sistemi ana sunucuyu kirletmeden ayrı bir container'da çalıştırdık. Böylece sunucunun geri kalanını güncel tutabildik. Web projelerinde bu yaklaşım, web tasarım sürecinde canlıya geçişi de sadeleştirir.

Docker nedir sorusunun yanlış anlaşıldığı durumlar hangileri?

Docker nedir diye sorulduğunda en sık duyduğum yanlış cevap "hafif sanal makine" oluyor. Bu benzetme başlangıç için işe yarar ama bazı hatalı kararlara da yol açar. Örneğin container'ın içine SSH sunucusu kurmak, birden fazla servisi tek container'a doldurmak veya container'ı sürekli elle güncellemek bu yanlış zihinsel modelin ürünüdür.

Doğru yaklaşım, container'ı tek sorumluluğu olan ve istendiğinde silinip yeniden oluşturulabilen bir süreç olarak görmektir. Yani bir değişiklik gerekiyorsa container içine girip düzeltmezsiniz; Dockerfile'ı düzeltip yeni imaj oluşturursunuz. Bu disiplin, altyapıyı kod olarak yönetmenin de temelidir.

Ayrıca Docker bir güvenlik duvarı değildir. Container yalıtımı sanal makineye göre daha incedir, çünkü tüm container'lar aynı çekirdeği kullanır. Bu nedenle güvenilmeyen kodu çalıştırmak için tek başına container'a güvenmemek, root olmayan kullanıcı ve güncel imajlarla katman katman önlem almak gerekir.

Docker Desktop ücretli mi, lisans konusunda neye dikkat etmelisiniz?

Docker Engine açık kaynaktır ve Linux sunucularda ücretsiz çalışır. Öte yandan Docker Desktop ayrı bir üründür ve belirli büyüklükteki şirketlerde ticari kullanım için ücretli abonelik gerektirir. Docker'ın fiyatlandırma sayfasında belirttiği koşula göre 250'den fazla çalışanı veya yıllık 10 milyon dolardan fazla geliri olan kurumlar için ücretli plan gerekiyor.

Bireysel geliştiriciler, eğitim ve küçük işletmeler için Personal plan ücretsiz kalıyor. Yine de koşullar zamanla değişebildiği için kurumsal bir ekipte kurulum yapmadan önce güncel sayfayı kontrol etmenizi öneririm. Alternatif olarak Mac'te Colima veya OrbStack, Linux'ta doğrudan Docker Engine ya da Podman kullanan ekipler de var.

Docker'ı canlı ortamda nasıl kullanırsınız, Kubernetes şart mı?

Küçük ve orta ölçekli projelerde tek bir sunucuda Docker Compose ile canlı ortam yönetmek gayet mümkündür. Benim de pek çok projem böyle çalışıyor: bir Compose dosyası, önünde ters vekil olarak Nginx veya Caddy, düzenli yedek ve izleme. Kubernetes ise çok sayıda sunucuya yayılan, otomatik ölçeklenmesi gereken sistemler için anlamlıdır.

Yani Kubernetes'e geçmek için "herkes kullanıyor" yeterli bir neden değildir; beraberinde ciddi bir işletim yükü getirir. Önce şu sorulara dürüstçe cevap verin:

  1. Tek sunucu, trafiğinizi ve kesinti toleransınızı karşılıyor mu?
  2. Ekipte küme yönetecek bilgi ve zaman var mı?
  3. Otomatik ölçekleme gerçekten gerekli mi, yoksa daha güçlü bir sunucu yeter mi?

Cevaplarınız çoğunlukla "tek sunucu yeter" yönündeyse Compose ile başlayın. Ölçek gerçekten büyüdüğünde imajlarınız zaten hazır olacağı için geçiş daha kolay olur.

Docker web sitesi hızını ve SEO'yu etkiler mi?

Docker doğrudan bir sıralama faktörü değildir; Google sitenizin container'da çalışıp çalışmadığını bilmez ve önemsemez. Ancak dolaylı etkileri vardır. Tutarlı ortam, canlıya geçişte yaşanan hataları ve kesintileri azaltır; kesinti ise tarama ve kullanıcı deneyimi açısından sorun yaratır.

Öte yandan container içinde çalışmak, yanlış yapılandırılırsa sunucu yanıt süresini uzatabilir. Örneğin Mac'teki yavaş volume performansını canlıya taşımazsınız ama belleğini fazla kısıtladığınız bir container sayfa üretimini yavaşlatabilir. Hız ölçümü için Google Lighthouse ile performans testi rehberime, hızın sıralamaya etkisi için site hızı ve SEO yazıma göz atabilirsiniz.

Site taşırken Docker'a geçiyorsanız yönlendirmeleri yönlendirme denetleyici ile, DNS kayıtlarını da DNS sorgulama aracıyla kontrol edin. Taşımanın SEO tarafı için site taşıma kontrol listesi işinize yarar.

Docker nedir, hangi dil ve çerçevelerle birlikte kullanılır?

Docker nedir sorusunu dil açısından sorarsanız cevap basit: dilden bağımsızdır. Node.js, Python, PHP, Java, Go, .NET veya Ruby fark etmez; uygulamanız Linux üzerinde çalışabiliyorsa onu container içine alabilirsiniz. Docker Hub'da bu dillerin çoğu için resmi taban imajlar bulunuyor.

Yine de her dilin kendine özgü püf noktaları var. Örneğin Python projelerinde bağımlılık dosyasını ayrı kopyalamak önbelleği korur. PHP tarafında web sunucusu ile PHP-FPM'i ayrı container'lara bölmek yaygın bir kalıptır. Java ve Go gibi derlenen dillerde ise multi-stage build imajı ciddi ölçüde küçültür.

Ön yüz projelerinde durum biraz farklıdır. React veya Vue uygulamanızı bir aşamada derler, çıkan statik dosyaları küçük bir Nginx imajına kopyalarsınız. Böylece canlı ortamda Node.js bile çalıştırmanız gerekmez. Üstelik aynı yaklaşım, statik sitelerde sunucu ayarlarını da sürüm kontrolüne almanızı sağlar.

Dolayısıyla Docker nedir diye merak eden bir ekipte ilk adım, en sık kullandığınız dilin resmi imajını inceleyip onunla küçük bir deneme yapmaktır. Bu deneme, sonraki bütün projeleriniz için bir şablon hâline gelir.

Docker registry nedir, imajınızı nasıl paylaşırsınız?

Registry, imajları sürüm etiketleriyle saklayan ve dağıtan depodur. Docker Hub en bilinen örnektir; bunun yanında GitHub Container Registry, GitLab ve bulut sağlayıcılarının kendi registry hizmetleri de var. Yani kodu Git deposunda, imajı ise registry içinde tutarsınız.

Bir imajı paylaşmak için önce onu registry adresini içeren bir adla etiketlersiniz. Ardından docker login ile oturum açar, docker push ile gönderirsiniz. Sunucu tarafında ise docker pull ile aynı imajı indirip çalıştırırsınız. Böylece derlemeyi bir kez yapar, aynı paketi her ortama taşırsınız.

Burada iki önerim var. İlk olarak şirket içi imajlarınızı herkese açık depoya göndermeyin; özel depo kullanın. İkinci olarak Docker Hub'dan indirdiğiniz imajlarda resmi veya doğrulanmış yayıncı işaretine bakın. Kimin hazırladığını bilmediğiniz bir imaj, sunucunuza kimin kodunu soktuğunuzu bilmemeniz demektir.

Kısacası Docker nedir sorusunun cevabının yarısı paketlemekse, diğer yarısı dağıtmaktır. Registry bu dağıtımın merkezidir ve iyi etiketleme alışkanlığı geri dönüşü de kolaylaştırır: sorunlu sürümde bir önceki etikete dönmeniz dakikalar sürer.

Docker imajlarını nasıl güvende tutarsınız?

İmaj güvenliği tek bir ayardan değil, küçük alışkanlıkların toplamından oluşur. Ben projelerimde şu kontrol listesini uyguluyorum:

  • Taban imajı düzenli olarak güncelleyin ve imajı periyodik olarak yeniden derleyin.
  • docker scout veya Trivy gibi bir tarayıcıyla bilinen açıkları kontrol edin.
  • Container'ı root olmayan bir kullanıcıyla çalıştırın.
  • Yalnızca gerçekten gereken portları yayınlayın.
  • Şifre ve anahtarları imaja değil, çalışma anına verin.

Ayrıca Docker daemon soketini (/var/run/docker.sock) bir container'a bağlamak, o container'a pratikte ana makine üzerinde root yetkisi vermek anlamına gelir. Bazı izleme araçları bunu ister; o zaman aracın kaynağından emin olun. Güvenlik tarafında Docker Engine güvenlik sayfası iyi bir başlangıç noktası.

Öte yandan web sitenizin genel güvenlik ve e-posta altyapısı da en az container kadar önemlidir. Örneğin kurumsal e-posta altyapısı yazımda alan adı düzeyindeki ayarları anlattım.

Docker'da hata ayıklarken nereden başlamalısınız?

Container beklendiği gibi çalışmadığında panik yapmadan sırayla ilerlemek çoğu sorunu hızla çözer. Benim izlediğim sıra şöyle:

  1. docker ps -a ile container'ın durumuna ve çıkış koduna bakın.
  2. docker logs ile uygulamanın son mesajlarını okuyun.
  3. docker inspect ile ortam değişkenlerini, ağları ve bağlı volume'ları kontrol edin.
  4. docker exec -it ile içeri girip dosyaların ve portların beklediğiniz yerde olup olmadığını görün.

En sık gördüğüm üç hata da tahmin edilebilir: uygulamanın 127.0.0.1 yerine 0.0.0.0 adresini dinlememesi, yanlış port eşlemesi ve eksik ortam değişkeni. Özellikle ilki yeni başlayanları çok uğraştırır; uygulama container içinde çalışır ama dışarıdan erişemezsiniz. Çünkü 127.0.0.1 yalnızca container'ın kendi içini temsil eder.

Kısacası loglar, inspect çıktısı ve içeriden bakış çoğu durumda yeterli olur. Sorun hâlâ sürüyorsa aynı imajı yerelde başlatıp adım adım karşılaştırın.

Docker öğrenmek için hangi yol haritasını izlemelisiniz?

Docker nedir sorusundan pratik kullanıma geçmek için şu sırayı öneririm. Her adımda küçük bir projeyle pratik yapın; okumak tek başına yetmez.

  1. Temel Linux komutlarını ve süreç, port, dosya izni kavramlarını tazeleyin.
  2. Hazır imajlarla docker run, ps, logs, exec komutlarını deneyin.
  3. Kendi küçük uygulamanız için Dockerfile yazın ve .dockerignore ekleyin.
  4. Volume ve ağ kavramlarını bir veritabanıyla birlikte test edin.
  5. Uygulama ile veritabanını Docker Compose'la tek dosyada birleştirin.
  6. Multi-stage build ve root olmayan kullanıcıyla imajı küçültüp sertleştirin.
  7. Bir CI hattında imajı otomatik derleyip registry'ye gönderin.

Bu yedi adımı birkaç hafta içinde düzenli çalışarak tamamlamak mümkün, ama bu süre kişiden kişiye değişir; saha tecrübesine dayalı bir tahmin, garanti değil. Kurumsal altyapı tarafında, örneğin micro frontend mimarisi gibi konulara geçtiğinizde container bilgisi temel bir yetkinliğe dönüşür.

Docker nedir sorusuna kısa bir özetle nasıl cevap verilebilir?

Kısacası Docker, uygulamanızı bağımlılıklarıyla birlikte taşınabilir bir paket hâline getiren ve bu paketi her ortamda aynı şekilde çalıştıran bir araçtır. Image şablondur, container çalışan örnektir, Dockerfile tariftir, Compose ise birden çok servisi bir arada yöneten orkestra şefidir.

Benim önerim, ilk gün her şeyi Docker'a taşımaya çalışmamanız. Önce yerel geliştirme ortamınızı container'a alın, faydasını görün, sonra CI ve canlı ortama genişletin. Böylece ekibiniz aracı öğrenirken iş de aksamaz.

Web projenizde altyapı, hız veya taşıma konusunda bir yol haritası istiyorsanız iletişim sayfasından bana yazabilirsiniz. Diğer yazılım yazılarına yazılım kategorisinden ulaşabilirsiniz.

Sıkça Sorulan Sorular

Docker ücretsiz mi?
Docker Engine açık kaynak ve ücretsizdir; Linux sunucularda lisans ücreti ödemezsiniz. Docker Desktop ise bireyler, eğitim ve küçük işletmeler için ücretsizdir, fakat 250 üzeri çalışanı veya 10 milyon dolar üzeri yıllık geliri olan kurumlarda ticari kullanım için ücretli abonelik gerekir. Güncel koşulları Docker'ın fiyat sayfasından kontrol edin.
Docker öğrenmek için Linux bilmek gerekir mi?
Derin Linux bilgisi gerekmez, ama temel komutları bilmek işinizi çok kolaylaştırır. Dosya yolları, izinler, süreçler ve portlar gibi kavramlar container içinde sürekli karşınıza çıkar. Bu yüzden Docker'a başlamadan önce birkaç günlük Linux pratiği yapmanızı öneririm; hata ayıklarken bu temel size ciddi zaman kazandırır.
Container ile sanal makine aynı şey mi?
Hayır, aynı şey değil. Sanal makine kendi çekirdeğiyle tam bir işletim sistemi çalıştırır, container ise ana makinenin çekirdeğini paylaşan yalıtılmış bir süreçtir. Bu yüzden container daha hızlı açılır ve daha az yer kaplar, ancak sanal makine daha güçlü bir yalıtım sağlar. Pratikte ikisi çoğu zaman birlikte kullanılır.
Veritabanını Docker içinde çalıştırmak doğru mu?
Geliştirme ve test için kesinlikle doğru ve pratiktir. Canlı ortamda da çalıştırılabilir, fakat veriyi mutlaka volume üzerinde tutmanız, düzenli yedek almanız ve portu internete açmamanız gerekir. Yüksek trafikli kritik sistemlerde ise yönetilen bir veritabanı hizmeti çoğu zaman daha az risk ve bakım yükü getirir.
Docker Compose ile Kubernetes arasındaki fark nedir?
Docker Compose, çok container'lı bir uygulamayı genellikle tek sunucuda tanımlayıp çalıştırmak için kullanılan basit bir araçtır. Kubernetes ise birçok sunucudan oluşan bir kümede container'ları dağıtan, ölçekleyen ve kendi kendine onaran bir orkestrasyon platformudur. Küçük ve orta projelerde Compose çoğu zaman yeterli olur.
Docker imajı neden bu kadar büyük oluyor?
En sık neden büyük bir taban imaj seçmek ve derleme araçlarını son imajda bırakmaktır. Slim veya alpine taban imajlar kullanmak, multi-stage build ile yalnızca çıktıyı kopyalamak ve .dockerignore dosyasıyla gereksiz klasörleri dışlamak boyutu belirgin biçimde düşürür. Katmanları docker history komutuyla inceleyebilirsiniz.
#Docker#Container#Dockerfile#Docker Compose#DevOps#Yazılım
Paylaş:
Talha Aslan
Talha Aslan

Google Partner dijital pazarlama uzmanı. 2012’den beri SEO, Google Ads, web tasarım ve e-ticaret projelerinde sahada; bu blogda gördüğünüz her yazı o deneyimden çıkar.

Sıradaki proje

Projenizi konuşalım.

Aracı yok, katman yok: doğrudan işi yapacak uzmanla konuşursunuz. İlk istişare ücretsizdir; hedefinizi dinler, net bir yol haritasıyla dönerim.

WhatsApp Hemen Ara