Docker

Docker Kapsamlı Rehber: Modern Yazılım Geliştirme ve Deployment

Noves TeamNoves Team
20 dk okuma
Docker Kapsamlı Rehber: Modern Yazılım Geliştirme ve Deployment

1. Docker Nedir ve Neden Önemlidir?

Docker, uygulamaları ve bağımlılıklarını standartlaştırılmış birimler olan container'lar içinde paketleyen açık kaynaklı bir platformdur. Geleneksel sanal makinelere kıyasla çok daha hafif ve hızlı çalışan bu teknoloji, "makinemde çalışıyordu" sorununu kökten çözer. Noves Digital olarak İzmir merkezli yazılım projelerimizde Docker'ı, React ve Next.js tabanlı frontend'lerden Node.js backend servislerine kadar tüm modern teknoloji stack'imizde yaygın şekilde kullanıyoruz. Container teknolojisi sayesinde geliştirme, test ve production ortamları arasındaki tutarsızlıkları ortadan kaldırarak CI/CD süreçlerimizi hızlandırıyoruz. Özellikle microservices mimarilerinde ve ölçeklenebilir web uygulamalarında Docker, deployment sürelerini saatlerden dakikalara indiren kritik bir altyapı bileşenidir.

2. Docker Temel Kavramlar

Docker ekosistemi, yazılım geliştirme süreçlerini dönüştüren temel yapı taşları üzerine kuruludur. Bu kavramları doğru anlamak, container tabanlı mimarilerde verimli çalışmanın ilk adımıdır. Noves Digital ekibi olarak, İzmir'deki kurumsal müşterilerimize danışmanlık verirken bu temel kavramların sağlam bir şekilde kavranmasını önemsiyoruz.

2.1. Container ve Image Farkı

Docker image'ı, bir uygulamanın çalışması için gereken tüm dosyaları, kütüphaneleri ve yapılandırmaları içeren salt okunur bir şablondur. Container ise bu image'ın çalışan bir örneğidir; yani image'dan üretilen, izole edilmiş ve çalışan bir süreçtir. Bir image'dan istediğiniz sayıda container oluşturabilirsiniz ve her biri birbirinden bağımsız çalışır. Noves Digital'de geliştirdiğimiz Node.js ve PostgreSQL tabanlı projelerde, aynı image'dan hem geliştirme hem de test container'ları spun ederek tutarlılığı garanti altına alıyoruz. Image'lar katmanlı bir yapıya sahiptir; her değişiklik yeni bir katman ekler. Bu sayede depolama verimliliği artar ve image paylaşımı hızlanır.

2.2. Docker Engine ve Docker Desktop

Docker Engine, container'ları oluşturmak, çalıştırmak ve yönetmekten sorumlu olan temel çalışma zamanıdır (runtime). Linux çekirdeği üzerinde doğrudan çalışır ve container'ları yönetir. Docker Desktop ise macOS ve Windows kullanıcıları için tasarlanmış, Docker Engine'i bir sanal makine içinde çalıştıran, kullanıcı dostu bir arayüzdür. Noves Digital ekibinde geliştiricilerimiz, İzmir ofisimizde hem Linux sunucular üzerinde Docker Engine kullanarak production deployment'ları yönetiyor hem de Docker Desktop ile yerel geliştirme ortamlarını hızla kuruyorlar. Docker Desktop, Kubernetes entegrasyonu, volume yönetimi ve GUI tabanlı container izleme gibi gelişmiş özellikler sunarak geliştirici verimliliğini artırır.

3. Docker Kurulumu ve İlk Adımlar

Docker'ı doğru şekilde kurmak, container tabanlı geliştirme yolculuğunun temel taşıdır. İşletim sistemine göre farklı kurulum adımları bulunur ve her biri kendine özgü dikkat edilmesi gereken noktalar içerir.

3.1. Linux (Ubuntu) Üzerinde Docker Kurulumu

Ubuntu üzerinde Docker kurulumu, resmi repository'leri kullanarak oldukça basittir. Öncelikle mevcut paketler güncellenir, ardından gerekli bağımlılıklar yüklenir. Docker'ın resmi GPG anahtarı eklenip repository tanımlandıktan sonra apt paket yöneticisi ile Docker Engine kurulur. Kurulum sonrası kullanıcıyı docker grubuna eklemek, her komut için sudo kullanma zorunluluğunu ortadan kaldırır. Noves Digital olarak, İzmir'deki bulut sunucularımızda Ubuntu tabanlı Docker kurulumları yaparken unattended-upgrades ile Docker'ın otomatik güncellenmesini sağlıyor, böylece güvenlik yamaları anında uygulanıyor. docker --version ve docker run hello-world komutlarıyla kurulumun başarılı olduğu doğrulanmalıdır.

3.2. macOS ve Windows İçin Docker Desktop Kurulumu

macOS ve Windows kullanıcıları için Docker Desktop, en pratik kurulum yöntemidir. Resmi web sitesinden indirilen DMG (macOS) veya MSI (Windows) dosyası çalıştırılarak kurulum tamamlanır. Docker Desktop, arka planda hafif bir Linux sanal makinesi çalıştırarak container'ları bu ortamda yönetir. Noves Digital ekibinde frontend geliştiricilerimiz React ve Next.js projelerini macOS üzerinde Docker Desktop ile containerize ederek, Linux production ortamıyla birebir tutarlı yerel geliştirme ortamları oluşturuyorlar. Kurulum sonrası Docker Desktop ayarlarından kaynak limitleri (CPU, RAM, disk) optimize edilmeli ve WSL2 entegrasyonu (Windows) etkinleştirilmelidir.

3.2.1. Sistem Gereksinimleri ve İzinler

Docker Desktop'ın sorunsuz çalışması için minimum sistem gereksinimlerinin karşılanması gerekir. macOS'te macOS 11 veya üzeri, Apple Silicon için Rosetta 2 önerilir. Windows'ta ise Windows 10/11 64-bit, WSL2 özelliğinin etkin olması ve BIOS'ta sanallaştırma desteğinin açık olması zorunludur. En az 4 GB RAM önerilirken, Noves Digital'de geliştirme ortamları için 8 GB ve üzeri RAM tavsiye ediyoruz. İzinler açısından, Docker Desktop kurulumu yönetici yetkisi gerektirir. Windows'ta Hyper-V veya WSL2 backend seçeneği kurulum sırasında belirlenmelidir. Şirket bilgisayarlarında grup politikaları veya antivirüs yazılımlarının Docker servislerini engellememesine dikkat edilmelidir.

3.2.2. İzmir/Türkiye için Ağ ve Proxy Ayarları (Yerel Dikkat Noktaları)

Türkiye'de, özellikle İzmir merkezli yazılım ekipleri için Docker image pull işlemlerinde yaşanan yavaşlamalar veya erişim sorunları bilinen bir durumdur. Docker Hub'dan image indirirken, yerel İSS kaynaklı DNS veya bant genişliği kısıtlamaları yaşanabilir. Noves Digital olarak, İzmir ofisimizde bu sorunu aşmak için registry mirror yapılandırması kullanıyoruz; daemon.json dosyasına Türkiye'ye yakın mirror adresleri eklenerek image çekme hızları önemli ölçüde artırılabilir. Kurumsal ağlarda proxy arkasında çalışılıyorsa, Docker Desktop ayarlarında HTTP/HTTPS proxy bilgilerinin girilmesi gerekir. Ayrıca, Türkiye'den bazı resmi image'lara erişimde yaşanan geçici sorunlar için docker pull komutuna --registry-mirror flag'i ile alternatif kaynaklar belirtilebilir.

4. Dockerfile ile İmaj Oluşturma

Dockerfile, container image'larını otomatik olarak oluşturmak için kullanılan metinsel bir yapılandırma dosyasıdır. Doğru yazılmış bir Dockerfile, tekrarlanabilir, güvenli ve optimize edilmiş image'lar üretmenin anahtarıdır.

4.1. Dockerfile Temel Direktifleri (FROM, RUN, COPY, CMD)

Dockerfile'da en sık kullanılan direktifler, image oluşturma sürecinin temelini oluşturur. FROM direktifi, temel image'ı belirler; örneğin FROM node:18-alpine komutuyla hafif bir Node.js tabanı seçilir. RUN direktifi, image oluşturulurken çalıştırılacak komutları içerir; bağımlılıkların yüklenmesi (npm install) bu aşamada yapılır. COPY direktifi, yerel dosyaları container içine kopyalar; uygulama kodunun image'a eklenmesi burada gerçekleşir. CMD veya ENTRYPOINT ise container çalışmaya başladığında çalıştırılacak varsayılan komutu tanımlar. Noves Digital'de React ve Next.js projelerimiz için multi-stage Dockerfile'lar yazarak, build aşamasında gereken ancak production'da ihtiyaç duyulmayan dosyaları son image'dan hariç tutuyoruz.

4.2. Katman Optimizasyonu ve Küçük İmajlar

Docker image'ları katmanlı bir yapıya sahiptir ve her Dockerfile direktifi yeni bir katman oluşturur. Katman sayısını minimize etmek, image boyutunu küçültmek ve build süresini kısaltmak için optimizasyon kritik öneme sahiptir. Noves Digital olarak, Node.js projelerimizde npm ci yerine npm install kullanarak bağımlılık katmanını önbelleğe alıyor, böylece kod değişikliklerinde sadece uygulama katmanı yeniden build ediliyor. Alpine Linux tabanlı image'lar (node:18-alpine, python:3.11-alpine) kullanarak image boyutlarını %80'lere varan oranlarda küçültüyoruz. .dockerignore dosyası ile node_modules, .git ve log dosyalarının image'a dahil olmasını engelliyoruz. Multi-stage build tekniği ile build araçlarını ve kaynak kodunu son production image'ından ayırarak hem güvenliği hem de performansı artırıyoruz.

5. Docker Komutları ve Günlük İş Akışları

Docker CLI, container ekosisteminin günlük yönetiminde vazgeçilmez bir araçtır. Temel komutları bilmek, geliştirme ve operasyon süreçlerinde verimliliği doğrudan etkiler.

5.1. İmaj Yönetimi (pull, build, push)

Image yönetimi, Docker kullanımının temel taşlarından biridir. docker pull <image:tag> komutu, Docker Hub veya özel registry'den image çeker. docker build -t <image-name>:<tag> . komutu, mevcut dizindeki Dockerfile'dan yeni bir image oluşturur. docker push <image-name>:<tag> ise oluşturulan image'ı registry'e gönderir. Noves Digital'de, geliştirdiğimiz özel Node.js ve PostgreSQL tabanlı image'ları GitLab Container Registry'de versiyonlayarak saklıyoruz. docker images komutuyla yerel image listesini görüntüleyebilir, docker rmi <image-id> ile kullanılmayan image'ları silebilirsiniz. Image'ları anlamlı tag'lerle (v1.0.0, latest, production) etiketlemek, deployment süreçlerinde karışıklığı önler ve rollback işlemlerini kolaylaştırır.

5.2. Container Yönetimi (run, ps, exec, stop, rm)

Container yaşam döngüsü, Docker'ın en sık kullanılan işlevlerini oluşturur. docker run -d -p 3000:3000 --name my-app <image> komutu, belirtilen image'dan arka planda çalışan bir container oluşturur ve 3000 portunu host'a map eder. docker ps çalışan container'ları listelerken, docker ps -a durdurulmuş olanları da gösterir. docker exec -it <container-id> /bin/sh komutu, çalışan bir container içinde interaktif shell açar; bu, hata ayıklama için kritik öneme sahiptir. docker stop <container-id> container'ı gracefully durdurur, docker rm <container-id> ise silmek için kullanılır. Noves Digital ekibinde, İzmir'deki geliştirme sunucularında bu komutları kullanarak onlarca microservice container'ını günlük olarak yönetiyoruz.

5.2.1. Hata Ayıklama ve Log İncelemesi

Container'ların içinde ne olduğunu anlamak, production sorunlarını çözmek için elzemdir. docker logs <container-id> komutu, container'ın stdout ve stderr çıktılarını görüntüler. -f flag'i ile log'ları real-time takip edebilir, --tail 100 ile son 100 satırı görebilirsiniz. docker exec -it <container-id> /bin/sh komutuyla container içine girerek dosya sistemini inceleyebilir, çevre değişkenlerini kontrol edebilir veya süreçleri ps aux ile listeleyebilirsiniz. Noves Digital'de, React ve Node.js tabanlı uygulamalarımızda docker logs çıktısını merkezi log toplama sistemlerine (ELK Stack) yönlendirerek, İzmir ofisimizden tüm production container'larının durumunu izliyoruz. Hata ayıklama sırasında container'ı --entrypoint /bin/sh ile başlatarak uygulama yerine shell ile başlamasını sağlayabilirsiniz.

5.2.2. Performans İzleme Temel Komutları

Container performansını izlemek, kaynak kullanımını optimize etmek ve darboğazları tespit etmek için Docker yerleşik araçlarını kullanabilirsiniz. docker stats komutu, çalışan tüm container'ların CPU, RAM, ağ ve disk I/O kullanımını real-time tabloda gösterir. docker top <container-id> komutu, container içindeki süreçleri host PID'leriyle birlikte listeler. docker system df komutu ise image, container ve volume'lerin toplam disk kullanımını raporlar. Noves Digital olarak, İzmir merkezli projelerimizde docker stats çıktısını Prometheus ve Grafana ile entegre ederek görselleştirilmiş performans dashboard'ları oluşturuyoruz. Yüksek CPU kullanımı gösteren container'lar için docker update --cpus="1.5" <container-id> komutuyla CPU limitleri dinamik olarak ayarlanabilir.

6. Docker Compose ile Çoklu Servis Yönetimi

Modern uygulamalar nadiren tek bir container ile çalışır; genellikle web sunucusu, veritabanı, cache katmanı ve API servisleri gibi birden fazla bileşeni bir arada yönetmek gerekir.

6.1. docker-compose.yml Yapısı ve Örnekler

Docker Compose, çoklu container uygulamalarını tek bir YAML dosyasıyla tanımlayıp yönetmenizi sağlar. docker-compose.yml dosyasında services, networks ve volumes anahtarları bulunur. Her servis için image, port map'lemeleri, çevre değişkenleri ve bağımlılıklar tanımlanır. Noves Digital'de tipik bir Laravel veya Node.js projesi için docker-compose.yml dosyamızda app (Node.js), db (PostgreSQL) ve redis (cache) servisleri yer alır. depends_on direktifi ile servislerin başlangıç sırası kontrol edilir. docker-compose up -d komutu tüm servisleri arka planda başlatırken, docker-compose down ile tüm altyapı temizlenir. Bu yaklaşım, geliştirme ekibimizin İzmir ofisinde aynı anda aynı projeyi çalıştırmasını ve tutarlı ortamlar kullanmasını garanti altına alır.

6.2. Ortam Değişkenleri ve Gizli Bilgiler Yönetimi

Docker Compose'da çevre değişkenleri, .env dosyaları veya environment bölümü ile yönetilir. Ancak şifreler, API anahtarları ve veritabanı credential'ları gibi hassas bilgilerin doğrudan docker-compose.yml veya .env dosyalarında saklanması güvenlik riski oluşturur. Noves Digital olarak, İzmir merkezli kurumsal projelerimizde Docker Secrets veya harici secret yönetim araçları (HashiCorp Vault, AWS Secrets Manager) kullanıyoruz. env_file direktifi ile ortam değişkenlerini harici dosyadan yükleyebilir, böylece kod repository'sinde hassas veriler bulunmaz. Production ortamlarında, docker-compose yerine Docker Swarm veya Kubernetes secret'ları kullanılarak gizli bilgilerin şifrelenmiş şekilde yönetilmesi sağlanmalıdır. Ayrıca, .env dosyalarının .gitignore'a eklenmesi kritik öneme sahiptir.

7. Veri Kalıcılığı: Volumes ve Bind Mounts

Container'lar doğası gereği geçicidir; silindiğinde içindeki veriler de kaybolur. Kalıcı veri depolama ihtiyacı, production uygulamalarında kritik bir konudur.

7.1. Volume Türleri ve Kullanım Senaryoları

Docker üç temel veri depolama yöntemi sunar: volumes, bind mounts ve tmpfs mounts. Volume'lar, Docker tarafından yönetilen ve host dosya sisteminden izole edilmiş depolama alanlarıdır; docker volume create <name> ile oluşturulur ve container'lar arasında paylaşılabilir. Bind mount'lar, host üzerindeki belirli bir dizini container içindeki bir dizine map eder; geliştirme sırasında kod değişikliklerinin anında container'a yansıması için idealdir. Noves Digital'de, İzmir'deki geliştirme ortamlarında React ve Next.js projeleri için bind mount kullanarak hot-reload özelliğini aktif tutarken, PostgreSQL veritabanı verileri için named volume'lar kullanarak veri kalıcılığını sağlıyoruz. Tmpfs mount'lar ise RAM üzerinde geçici veri depolamak için kullanılır ve hassas verilerin diskte iz bırakmaması gereken senaryolarda tercih edilir.

7.2. Yedekleme ve Geri Yükleme Stratejileri

Container tabanlı uygulamalarda veri yedekleme, volume'ların düzenli olarak dışa aktarılması veya snapshot'larının alınmasıyla gerçekleştirilir. docker run --rm -v <volume-name>:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /data . komutuyla bir volume'ın sıkıştırılmış yedeği alınabilir. Geri yükleme için benzer şekilde tar xzf komutu kullanılır. Noves Digital olarak, İzmir merkezli müşteri projelerimizde PostgreSQL volume'larını günlük olarak otomatik yedekleyerek AWS S3'e aktarıyoruz. Ayrıca, veritabanı seviyesinde pg_dump ve pg_restore kullanarak mantıksal yedekler alıyoruz. Docker volume'ları için docker volume ls ve docker volume inspect <name> komutlarıyla mevcut durumu kontrol edebilir, gereksiz volume'ları docker volume prune ile temizleyebilirsiniz. Production ortamlarında 3-2-1 yedekleme stratejisi (3 kopya, 2 farklı ortam, 1 off-site) uygulanmalıdır.

8. Docker Networking Temelleri

Container'ların birbiriyle ve dış dünya ile iletişimi, Docker networking altyapısı üzerinden yönetilir. Doğru network yapılandırması, uygulama güvenliği ve performansı için kritiktir.

8.1. Bridge, Host ve Overlay Ağ Modları

Docker varsayılan olarak bridge ağ modunu kullanır; bu modda container'lar izole bir sanal ağda çalışır ve port map'lemeleri üzerinden dış dünya ile iletişim kurar. docker network create <name> ile özel bridge ağları oluşturularak container'lar arası DNS tabanlı iletişim sağlanabilir. Host modunda, container doğrudan host'un ağ arayüzünü kullanır ve port map'lemesine gerek kalmaz; ancak izolasyon azalır. Overlay ağı, Docker Swarm veya Kubernetes gibi çoklu-host ortamlarında container'ların farklı sunucularda birbirini bulmasını sağlar. Noves Digital'de, İzmir ofisimizdeki tek sunuculu geliştirme ortamlarında bridge ağları kullanırken, müşteri projelerinin production ortamlarında overlay ağlar ile multi-host container iletişimini yönetiyoruz. Her modun kendi güvenlik ve performans karakteristikleri vardır; bridge modu genel amaçlı kullanım için en dengeli seçenektir.

8.2. Servis Keşfi ve DNS Yapılandırması

Docker'ın gömülü DNS sunucusu, aynı custom bridge ağındaki container'ların birbirlerine container adıyla erişmesini sağlar. Örneğin, web adlı container db adlı container'a postgres://db:5432 şeklinde bağlanabilir. Bu özellik, microservices mimarilerinde servis keşfi (service discovery) için temel bir mekanizma sunar. Noves Digital'de, Node.js backend container'larımız PostgreSQL ve Redis container'larına bu DNS mekanizması ile bağlanır; böylece IP adresleri değişse bile bağlantılar kesilmez. docker network inspect <network-name> komutuyla ağdaki container'ların IP adresleri ve bağlantı durumları incelenebilir. Daha karmaşık senaryolar için Docker Compose'da networks bölümü ile özel ağ segmentasyonu yapılabilir; örneğin frontend ve backend container'ları farklı ağlarda izole edilerek sadece API gateway üzerinden iletişim kurmaları sağlanabilir.

9. Güvenlik ve En İyi Uygulamalar

Container teknolojisi, güvenlik avantajları sunarken yanlış yapılandırmalar ciddi risklere yol açabilir. Güvenlik odaklı yaklaşım, Docker kullanımının ayrılmaz bir parçasıdır.

9.1. İmaj Güvenliği ve Tarama

Container image'ları, uygulama güvenliğinin ilk savunma hattıdır. Resmi ve güvenilir kaynaklardan (library/, bitnami/, node: official) image çekmek, bilinen güvenlik açıklarını minimize eder. docker scan <image> komutu veya Trivy, Clair gibi araçlarla image'lar düzenli olarak taranmalıdır. Noves Digital olarak, CI/CD pipeline'ımıza entegre ettiğimiz Trivy ile her build sonrası image'ları otomatik tarıyor; kritik CVE'ler bulunduğunda deployment'ı engelliyoruz. Image'ların düzenli olarak güncellenmesi, temel image'daki güvenlik yamalarının uygulanması için zorunludur. docker history <image> komutuyla image'ın katman geçmişi incelenebilir ve şüpheli katmanlar tespit edilebilir. Ayrıca, image imzalama (Docker Content Trust) etkinleştirilerek, yalnızca doğrulanmış image'ların çalıştırılması sağlanmalıdır.

9.2. Container İzolasyonu ve Yetkilendirme

Container'lar, host sisteminden izole edilmiş olmalı ancak bu izolasyon varsayılan ayarlarla tam güvenlik sağlamaz. --read-only flag'i ile container dosya sistemini salt okunur yapmak, yetkisiz değişiklikleri engeller. --security-opt parametreleri ile seccomp, AppArmor ve SELinux profilleri uygulanabilir. Capability'ler (--cap-drop, --cap-add) ile container'a verilen ayrıcalıklar granüler şekilde kontrol edilir. Noves Digital'de, İzmir merkezli kurumsal projelerimizde container'ları mümkün olan en düşük yetki setiyle çalıştırıyor, gereksiz capability'leri devre dışı bırakıyoruz. Ayrıca, --pids-limit ile süreç sayısı sınırlandırılarak fork bombası gibi kaynak tüketim saldırılarına karşı önlem alınır. Container'ların host ağını (--net=host) veya PID namespace'ini (--pid=host) kullanması, güvenlik duvarını aşan bir davranıştır ve yalnızca debugging amaçlı kısa süreli kullanılmalıdır.

9.2.1. Root Olmadan Çalıştırma Yaklaşımları

Varsayılan olarak Docker container'ları root kullanıcısıyla çalışır; bu, container'ın dışına sıkışması durumunda host sistem üzerinde tam yetkiyle hareket edebileceği anlamına gelir. Güvenlik açısından, container'ları non-root kullanıcıyla çalıştırmak temel bir gerekliliktir. Dockerfile'da USER <uid> direktifi ile veya runtime'da --user $(id -u):$(id -g) flag'i ile farklı bir kullanıcı belirlenebilir. Noves Digital olarak, geliştirdiğimiz tüm Node.js tabanlı container image'larında node kullanıcısını varsayılan yapıyoruz. RUN addgroup -g 1001 -S nodejs && adduser -S nextjs -u 1001 komutuyla özel kullanıcı ve grup oluşturarak, uygulama dosyalarının sahipliğini bu kullanıcıya devrediyoruz. Bu yaklaşım, özellikle multi-tenant ortamlarda ve Kubernetes cluster'larında container güvenliğini önemli ölçüde artırır.

9.2.2. Secrets Yönetimi ve Güvenli Depolama

Hassas verilerin container içinde güvenli şekilde yönetilmesi, modern uygulama güvenliğinin olmazsa olmazıdır. Docker Secrets, Docker Swarm modunda şifrelenmiş şekilde secret saklamayı sağlar; ancak standalone Docker'da kullanılamaz. Bu durumda, harici secret yönetim araçları (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault) entegre edilmelidir. Noves Digital'de, İzmir'deki projelerimizde Vault kullanarak uygulama başlangıcında secret'ları dinamik olarak çekiyor ve container'a environment variable olarak enjekte ediyoruz. Dockerfile'da ARG ile geçilen build-time secret'lar, image katmanlarında kalıcı olarak saklanır; bu nedenle RUN --mount=type=secret (BuildKit) kullanılarak build sırasında geçici erişim sağlanmalıdır. Log dosyalarında ve hata mesajlarında secret'ların sızdırılmaması için merkezi log filtreleme uygulanmalıdır.

10. CI/CD ile Docker Entegrasyonu

Docker, sürekli entegrasyon ve sürekli deployment (CI/CD) pipeline'larının vazgeçilmez bir parçası haline gelmiştir. Container tabanlı deployment'lar, tutarlı ve tekrarlanabilir yazılım teslimatı sağlar.

10.1. Pipeline Örnekleri (GitHub Actions, GitLab CI)

Modern CI/CD araçları, Docker ile yerel entegrasyon sunar. GitHub Actions'da docker/build-push-action kullanılarak, kod push'landığında otomatik image build edilip registry'e gönderilebilir. GitLab CI'da ise docker-in-docker (dind) servisi ile GitLab Runner içinde Docker komutları çalıştırılır. Noves Digital olarak, İzmir merkezli geliştirme süreçlerimizde GitLab CI kullanıyoruz; .gitlab-ci.yml dosyasında build, test ve deploy stage'leri tanımlayarak, her merge request'te otomatik testler çalıştırıyor ve başarılı build'leri staging ortamına deploy ediyoruz. GitHub Actions örneğinde, on: push: branches: [main] trigger'ı ile main branch'e push yapıldığında multi-stage Dockerfile build edilir, Trivy ile taranır ve AWS ECR'e pushlanır. Bu otomasyon, deployment sürelerini 2 saatten 15 dakikaya indirmemizi sağlamıştır.

10.2. İmaj Versiyonlama ve Tag Stratejileri

İmaj versiyonlama, rollback yeteneği ve deployment takibi açısından kritik öneme sahiptir. Anlamlı tag stratejileri kullanmak, karışıklığı önler. Semantic versioning (v1.2.3) en yaygın yaklaşımdır; ayrıca latest, stable, production gibi ortam bazlı tag'ler ve commit SHA'sı (sha-abc123) gibi benzersiz tanımlayıcılar kullanılabilir. Noves Digital'de, her başarılı build için hem semantic version tag'i hem de Git commit SHA tag'i atıyoruz. Böylece production'da bir sorun tespit edildiğinde, docker pull <image>:<eski-sha> komutuyla anında önceki çalışan versiyona dönebiliyoruz. Image'ları silmeden önce eski versiyonların referanslarını saklamak, olası geri dönüşler için registry'de yeterli geçmiş tutulmasını sağlar. Ayrıca, docker tag <source> <target> komutuyla mevcut image'lara ek tag'ler atanabilir.

11. Docker ve Kubernetes İlişkisi

Docker container teknolojisinin popülerleşmesi, container orchestration araçlarının da gelişmesine yol açmıştır. Kubernetes, bu alanın en güçlü ve yaygın kullanılan çözümüdür.

11.1. Ne Zaman Kubernetes'e Geçilmeli

Kubernetes, container'ların otomatik deployment'ını, ölçeklendirmesini ve yönetimini sağlayan açık kaynaklı bir orchestration platformudur. Ancak her projeye Kubernetes gereksizdir. Tek sunucuda çalışan basit uygulamalar için Docker Compose veya Docker Swarm yeterlidir. Kubernetes'e geçiş, şu senaryolarda anlamlıdır: birden fazla sunucu gerektiren yüksek erişilebilirlik ihtiyacı, otomatik ölçeklendirme (auto-scaling), karmaşık deployment stratejileri (canary, blue-green) ve multi-tenant ortamlar. Noves Digital olarak, İzmir'deki orta ölçekli projelerimizde başlangıçta Docker Swarm kullanıp, kullanıcı sayısı ve trafik arttıkça Kubernetes'e geçiş planlıyoruz. Kubernetes'in öğrenme ekrisi diktir; bu nedenle ekip yetkinliği ve operasyonel kapasite de geçiş kararında değerlendirilmelidir. Cloud provider managed Kubernetes servisleri (EKS, AKS, GKE) operasyonel yükü azaltır.

11.2. Minikube ve Kind ile Yerel Testler

Kubernetes öğrenme ve test sürecinde, yerel ortamda cluster kurmak için Minikube ve Kind (Kubernetes IN Docker) en popüler araçlardır. Minikube, tek node'lu bir Kubernetes cluster'ı sanal makine veya container içinde çalıştırır. Kind ise Docker container'ları Kubernetes node'ları olarak kullanır ve multi-node cluster'ları bile yerel makinede simüle edebilir. Noves Digital ekibinde, yeni Kubernetes konfigürasyonlarını ve Helm chart'larını canlı ortama taşımadan önce Kind ile test ediyoruz. kind create cluster --name test komutuyla saniyeler içinde cluster oluşturulabilir. kubectl apply -f deployment.yaml komutuyla uygulamalar deploy edilir ve kubectl get pods, kubectl logs komutlarıyla izlenir. Yerel test ortamları, production'da yaşanabilecek networking ve storage sorunlarını erken tespit etme imkanı sunar.

12. Yaygın Hatalar ve Çözüm Rehberi

Docker kullanımında karşılaşılan yaygın sorunlar, genellikle yapılandırma hatalarından veya kaynak kısıtlamalarından kaynaklanır. Bu sorunları hızlıca teşhis etmek ve çözmek, operasyonel verimliliği artırır.

12.1. Bağlantı Sorunları ve Port Çakışmaları

"Port is already allocated" hatası, host üzerinde başka bir sürecin aynı portu kullandığını gösterir. netstat -tulpn | grep <port> veya lsof -i :<port> komutlarıyla çakışan süreç tespit edilip sonlandırılabilir. Container'lar arası iletişim sorunlarında, container'ların aynı Docker network'ünde olup olmadığı kontrol edilmelidir. Noves Digital'de, İzmir ofisimizde geliştirme yaparken sıkça karşılaştığımız bir diğer sorun, container'ın başlamasından önce bağımlı servisin (örneğin PostgreSQL) hazır olmamasıdır. Bunun için Docker Compose'da healthcheck ve depends_on condition'ları kullanılarak servis başlangıç sırası düzgün şekilde yönetilir. Ayrıca, firewall ve güvenlik gruplarının container portlarına izin verdiğinden emin olunmalıdır.

12.2. Disk Doluluğu ve İmaj Temizleme

Uzun süreli Docker kullanımı, kullanılmayan image, container ve volume'ların diskte birikmesine yol açar. docker system df komutuyla toplam kullanım görüntülenebilir. docker image prune -a kullanılmayan image'ları, docker container prune durdurulmuş container'ları, docker volume prune kullanılmayan volume'ları siler. docker system prune -a --volumes komutu ise tüm bu bileşenleri tek seferde temizler. Noves Digital'de, haftalık olarak cron job ile docker system prune -f çalıştırarak geliştirme sunucularımızın disk alanını optimize ediyoruz. Build cache'in de disk tükettiğini unutmamak gerekir; docker builder prune komutuyla build cache temizlenebilir. Production sunucularında otomatik prune dikkatli kullanılmalıdır; kritik image'ların yanlışlıkla silinmesini önlemek için gerekli image'lar önceden whitelist'e alınmalıdır.

13. Gerçek Dünya Senaryoları ve Örnek Projeler

Teorik bilgiyi pratik senaryolarla pekiştirmek, Docker öğrenim sürecinin en etkili yöntemidir. Gerçek dünya projeleri, container teknolojisinin gücünü somut şekilde gösterir.

13.1. Laravel/Node.js Uygulaması Dockerize Etme

Bir Laravel veya Node.js uygulamasını Dockerize etmek, tutarlı geliştirme ortamları oluşturmanın temel adımıdır. Node.js projesi için multi-stage Dockerfile yazılır: ilk stage'de node:18 image'ı ile bağımlılıklar yüklenir ve build alınır, ikinci stage'de node:18-alpine ile sadece production dosyaları ve node_modules kopyalanır. Noves Digital olarak, İzmir'deki React ve Next.js projelerimizde bu yaklaşımı kullanarak image boyutlarını 1 GB'dan 150 MB'a düşürüyoruz. Laravel projelerinde ise php:8.2-fpm, nginx ve mysql servislerini içeren bir docker-compose.yml yapılandırması kullanılır. php artisan migrate ve npm run build komutları, container entrypoint script'leri ile otomatikleştirilebilir. Böylece yeni geliştirici, projeyi klonladıktan sonra sadece docker-compose up -d komutuyla çalışan bir ortama sahip olur.

13.2. PostgreSQL ve Redis ile Çoklu Servis Kurulumu

Modern web uygulamaları genellikle veritabanı ve cache katmanı ile birlikte çalışır. Docker Compose ile bu altyapıyı tek bir komutla ayağa kaldırmak mümkündür. docker-compose.yml dosyasında db servisi için postgres:15-alpine image'ı, redis servisi için redis:7-alpine image'ı tanımlanır. PostgreSQL verileri için named volume, Redis için ise tmpfs veya persistence volume kullanılabilir. Noves Digital'de, İzmir merkezli SaaS projelerimizde bu yapılandırmayı temel alıyor; app servisini depends_on ile db ve redis'e bağlayarak servis başlangıç sırasını yönetiyoruz. Ortam değişkenleri .env dosyasından yüklenerek, veritabanı şifreleri ve bağlantı bilgileri güvenli şekilde yönetilir. docker-compose logs -f db komutuyla veritabanı log'ları real-time izlenebilir. Bu kurulum, geliştirme ekibinin her üyesinin aynı PostgreSQL ve Redis versiyonlarını kullanmasını garanti altına alır.

14. Performans İyileştirme ve Ölçeklendirme

Container tabanlı uygulamaların performansını optimize etmek, hem kullanıcı deneyimi hem de altyapı maliyetleri açısından kritik öneme sahiptir.

14.1. İmaj Boyutu Azaltma Teknikleri

Küçük image boyutları, daha hızlı deployment, daha az disk kullanımı ve daha küçük attack surface anlamına gelir. Alpine Linux tabanlı image'lar kullanmak, en etkili boyut azaltma tekniğidir. Multi-stage build ile build araçları ve kaynak kodu production image'ından çıkarılır. Noves Digital olarak, Next.js projelerimizde node:18-alpine kullanarak ve sadece .next/standalone dizinini kopyalayarak image boyutlarını minimize ediyoruz. npm prune --production komutuyla development bağımlılıkları kaldırılır. .dockerignore dosyası ile gereksiz dosyalar (.git, node_modules, *.md) image'a dahil edilmez. Ayrıca, dive aracı ile image katmanlarını analiz ederek gereksiz büyük katmanları tespit ediyoruz. Sıkıştırılmış image'lar, CI/CD pipeline'larında build ve push sürelerini de önemli ölçüde kısaltır.

14.2. Auto-scaling ve Load Balancer Entegrasyonu

Yüksek trafikli uygulamalarda, container sayısının otomatik olarak artırılıp azaltılması (auto-scaling) gereklidir. Docker Swarm'da docker service update --replicas=5 <service> komutuyla manuel ölçeklendirme yapılırken, Kubernetes'te Horizontal Pod Autoscaler (HPA) ile CPU/memory kullanımına göre otomatik ölçeklendirme sağlanır. Noves Digital'de, İzmir merkezli e-ticaret projelerimizde AWS Application Load Balancer (ALB) ile ECS (Elastic Container Service) entegre ederek, trafik arttıkça otomatik olarak yeni container'ların başlamasını sağlıyoruz. Load balancer, gelen istekleri sağlıklı container'lara dağıtır ve unhealthy instance'ları devre dışı bırakır. docker-compose ile yerel ortamda nginx veya traefik kullanarak reverse proxy ve load balancing yapılandırması test edilebilir. Ölçeklendirme stratejilerinde, container'ların stateless olması ve veri kalıcılığının dış volume'larla sağlanması kritik öneme sahiptir.

15. Kaynaklar ve İleri Okuma

Docker ekosistemi sürekli gelişmektedir; güncel kalmak ve derinlemesine bilgi edinmek için güvenilir kaynaklara başvurmak önemlidir.

15.1. Resmi Docker Dokümantasyonu ve Kılavuzlar

Docker'ın resmi dokümantasyonu (), en kapsamlı ve güncel kaynaktır. "Dockerfile reference", "Compose file reference" ve "Docker CLI reference" sayfaları, teknik detaylar için vazgeçilmezdir. Docker'ın resmi blogu ve topluluk forumları, yeni özellikler ve en iyi uygulamalar hakkında bilgi sunar. Noves Digital ekibi olarak, İzmir merkezli yazılım geliştirme süreçlerimizde Docker'ın resmi kılavuzlarını referans alıyor, ekibimizin düzenli olarak bu kaynakları takip etmesini teşvik ediyoruz. Ayrıca, "Docker Deep Dive" (Nigel Poulton) ve "The Docker Book" (James Turnbull) gibi yayınlar, konseptleri derinlemesine anlamak için önerilir. Docker Certified Associate (DCA) sertifikasyon programı, Docker bilgisini resmi olarak doğrulamak isteyen profesyoneller için ideal bir hedeftir. Topluluk tarafından sürdürülen Awesome Docker listesi, faydalı araç ve kaynakların derlenmiş bir koleksiyonunu sunar.

Noves Team

Noves Team

Noves Digital: 2020'den beri İzmir merkezli, 3 kişilik tutkulu yazılım ekibi. Web & mobil uygulama, özel yazılım çözümleri. React, Node.js, Python uzmanlığı. Agile çalışma, şeffaf iletişim, %100 zamanında teslimat. Sizin teknoloji partneriniz.