Sunucu Yönetimi & Linux

    Docker Nedir? Konteyner Teknolojisine Başlangıç

    Docker'ı sıfırdan öğrenin: konteyner mantığı, temel komutlar, port ve volume yönetimi, kendi imajınızı yazma ve Compose ile çok servisli uygulama kurma.

    11 dk okuma Güncellendi: 1 Temmuz 2026

    Bir uygulama kendi bilgisayarınızda sorunsuz çalışırken sunucuya taşıdığınızda neden bir anda "eksik kütüphane", "yanlış PHP sürümü" ya da "bağımlılık çakışması" hataları verir? Bu klasik "bende çalışıyordu" sorununun en pratik çözümü Docker'dır. Docker, bir uygulamayı ihtiyaç duyduğu her şeyle (kod, çalışma zamanı, kütüphaneler, sistem araçları, ayarlar) birlikte tek bir taşınabilir pakete koyar ve bu paketi hangi sunucuda çalıştırırsanız çalıştırın aynı davranışı garanti eder.

    Bu rehberde konteyner teknolojisinin ne olduğunu, sanal makineden nasıl ayrıldığını, imaj / konteyner / registry kavramlarını, Docker kurulumunu, günlük kullanacağınız temel komutları, port ve veri (volume) yönetimini, kendi imajınızı üreten bir Dockerfile yazmayı ve docker compose ile birden fazla servisi tek komutla ayağa kaldırmayı öğreneceksiniz. Yeni başlıyorsanız da bir sunucu yönetiyorsanız da baştan sona takip edebilirsiniz.

    Konteyner Nedir, Sanal Makineden Farkı Ne?#

    Konteyner, bir uygulamayı ve tüm bağımlılıklarını işletim sisteminden izole edilmiş, hafif bir kutu içinde çalıştıran bir sanallaştırma biçimidir. Buradaki anahtar kelime "hafif"tir. Konteynerleri anlamanın en iyi yolu, uzun süredir kullanılan sanal makinelerle (VM) karşılaştırmaktır.

    Bir sanal makine, fiziksel donanımı taklit eder ve her VM'in kendi tam işletim sistemi çekirdeği (kernel) vardır. Yani üç farklı uygulamayı üç ayrı VM'de çalıştırdığınızda üç ayrı işletim sistemi belleğe yüklenir. Bu güçlü bir izolasyon sağlar ama ağır çalışır: her VM yüzlerce megabayt hatta gigabaytlarca RAM tüketir ve açılması dakikalar sürebilir.

    Konteynerler ise ana makinenin işletim sistemi çekirdeğini paylaşır. Kendi kernel'lerini taşımazlar; yalnızca uygulamanın çalışması için gereken dosyaları ve kütüphaneleri içerirler. Sonuç olarak bir konteyner genellikle saniyeler içinde başlar, çok daha az bellek kullanır ve tek bir sunucuda onlarca hatta yüzlerce konteyner yan yana çalışabilir.

    ÖzellikKonteynerSanal Makine
    İzolasyon seviyesiSüreç düzeyinde (paylaşılan kernel)Donanım düzeyinde (ayrı kernel)
    Başlangıç süresiSaniyelerDakikalar
    BoyutMB mertebesindeGB mertebesinde
    Kaynak tüketimiDüşükYüksek
    Aynı sunucuda çalışan adetOnlarca / yüzlerceBirkaç tane

    Bu karşılaştırma "konteyner her zaman daha iyidir" anlamına gelmez. Farklı işletim sistemi çekirdeklerine ihtiyaç duyduğunuzda ya da tam donanım izolasyonu gerektiğinde sanal makineler hâlâ doğru araçtır. Nitekim bir VDS sunucu ya da sanal sunucu üzerinde Docker çalıştırmak çok yaygın bir senaryodur: alttaki izolasyonu VM sağlar, uygulama dağıtımının esnekliğini ise konteynerler getirir.

    İmaj, Konteyner ve Registry: Üç Temel Kavram#

    Docker'da her şey bu üç kavramın etrafında döner. Bir kere netleştiğinde geri kalanı kolaylaşır.

    İmaj (Image)#

    İmaj, bir uygulamanın çalışması için gereken her şeyi içeren, salt-okunur bir şablondur. İşletim sistemi katmanını, kurulu kütüphaneleri, uygulama kodunu ve varsayılan komutu barındırır. İmajı bir "kalıp" ya da yazılım kurulum dosyası gibi düşünebilirsiniz: kendisi çalışmaz, çalıştırılabilir bir örnek üretmek için kullanılır.

    İmajlar katmanlardan oluşur. Her katman bir öncekinin üzerine eklenir ve Docker bu katmanları önbelleğe alır. Bu sayede küçük bir değişiklik yaptığınızda tüm imajı sıfırdan üretmek yerine yalnızca değişen katman yeniden oluşturulur.

    Konteyner (Container)#

    Konteyner, bir imajın çalışan örneğidir. Aynı imajdan istediğiniz kadar konteyner başlatabilirsiniz; hepsi aynı şablondan doğar ama birbirinden bağımsız çalışır. İmaj kalıpsa, konteyner o kalıptan çıkmış, canlı ve yazılabilir bir kopyadır. Konteyneri durdurabilir, silebilir ve aynı imajdan yenisini saniyeler içinde yeniden oluşturabilirsiniz.

    Registry (Kayıt Deposu)#

    Registry, imajların depolandığı ve paylaşıldığı merkezi bir depodur. En bilinen örnek Docker Hub'dır; nginx, mysql, php, redis gibi binlerce hazır resmi imaj burada bulunur. Kendi imajınızı ürettiğinizde onu bir registry'ye push edip başka sunuculardan pull ile indirebilirsiniz. Bu akış, geliştirdiğiniz uygulamayı tek bir "artifact" olarak sunuculara dağıtmayı çok kolaylaştırır.

    Özetle döngü şudur: bir imajı registry'den çeker, o imajdan bir konteyner çalıştırırsınız; kendi uygulamanız için bir imaj üretir, onu registry'ye gönderirsiniz.

    Docker Kurulumu#

    En yaygın senaryo olan Ubuntu/Debian tabanlı bir sunucuya kurulumu ele alalım. Resmi deponun eklenmesi, dağıtımla gelen eski sürümlerden kaçınmanın en güvenli yoludur. Bir sunucuda sudo yetkisiyle şu adımları izleyin:

    # Gerekli paketleri kur
    sudo apt-get update
    sudo apt-get install -y ca-certificates curl gnupg
    
    # Docker'ın resmi GPG anahtarını ekle
    sudo install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
      sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
    # Docker deposunu ekle
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
      https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    # Docker Engine ve Compose eklentisini kur
    sudo apt-get update
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    

    Kurulumdan sonra Docker'ı sudo olmadan çalıştırmak için kullanıcınızı docker grubuna ekleyin (oturumu kapatıp açmanız gerekir):

    sudo usermod -aG docker $USER
    

    Kurulumun başarılı olduğunu doğrulamak için resmi test imajını çalıştırın:

    docker run hello-world
    

    Bu komut çalıştığında ekranda kurulumun düzgün olduğunu bildiren bir mesaj görürsünüz. Sunucuya terminalden bağlanma ve dosya işlemleri konusunda kendinizi geliştirmek isterseniz Linux temel komutlar rehberi iyi bir başlangıçtır.

    Günlük Kullanacağınız Temel Komutlar#

    Docker'ın gücü, öğrenmesi kolay birkaç komutta yatar. En sık kullanacaklarınızı örneklerle görelim.

    Konteyner çalıştırmak için docker run kullanılır. Örneğin arka planda çalışan bir Nginx web sunucusu başlatalım:

    docker run -d --name web -p 8080:80 nginx
    

    Burada -d konteyneri arka planda (detached) çalıştırır, --name web ona okunabilir bir isim verir, -p 8080:80 ise ana makinenin 8080 portunu konteynerin 80 portuna bağlar. Artık tarayıcıda http://sunucu-ip:8080 adresine giderek Nginx karşılama sayfasını görebilirsiniz.

    Çalışan konteynerleri listelemek için:

    docker ps          # çalışanları göster
    docker ps -a       # durdurulmuş olanlar dahil hepsini göster
    

    İndirilmiş imajları listelemek için:

    docker images
    

    Çalışan bir konteynerin içine girmek ve komut çalıştırmak için docker exec kullanılır. Aşağıdaki komut web konteynerinin içinde bir kabuk (shell) açar:

    docker exec -it web bash
    

    Konteynerin günlüklerini (logları) görmek hata ayıklamanın temel taşıdır:

    docker logs web          # tüm logları göster
    docker logs -f web       # canlı takip et (follow)
    

    Konteyner durdurmak ve silmek için:

    docker stop web          # nazikçe durdur
    docker rm web            # durdurulmuş konteyneri sil
    docker rm -f web         # çalışıyorsa zorla durdurup sil
    

    Artık kullanmadığınız imajları temizlemek isterseniz docker rmi imaj_adi komutunu, sistemdeki tüm atıl kaynakları (durmuş konteynerler, kullanılmayan ağlar, dangling imajlar) tek seferde toplamak için ise docker system prune komutunu kullanabilirsiniz.

    Port ve Volume Yönetimi#

    Bir konteyner varsayılan olarak dış dünyadan izoledir. Onunla iletişim kurmak ve verisini kalıcı kılmak için iki kavram öne çıkar: port yönlendirme ve volume.

    Port Yönlendirme#

    Konteyner içindeki bir servis (web sunucusu, veritabanı vb.) kendi ağ alanında bir portu dinler. Dışarıdan erişmek için bu portu ana makinenin bir portuna eşlemeniz gerekir. Söz dizimi -p <ana_makine_portu>:<konteyner_portu> şeklindedir:

    docker run -d -p 3000:80 nginx
    

    Bu örnekte dışarıdan gelen 3000 portu trafiği, konteynerin 80 portuna yönlendirilir. Aynı sunucuda çakışmayı önlemek için her konteynere farklı bir ana makine portu vermeniz yeterlidir.

    Volume ile Kalıcı Veri#

    Konteyner silindiğinde içindeki dosyalar da kaybolur. Bir veritabanı düşünün: konteyneri güncellemek için silip yeniden oluşturduğunuzda tüm verinizin uçmasını istemezsiniz. Volume, veriyi konteynerin yaşam döngüsünden bağımsız olarak kalıcı kılar.

    İki yaygın yöntem vardır. Birincisi, ana makinedeki bir klasörü konteynere bağlamak (bind mount):

    docker run -d \
      -v /home/user/site:/usr/share/nginx/html \
      -p 8080:80 \
      nginx
    

    İkincisi, Docker'ın yönettiği isimli bir volume kullanmak; bu, veritabanları için önerilen yöntemdir:

    docker volume create db_data
    
    docker run -d \
      --name mysql \
      -e MYSQL_ROOT_PASSWORD=guclu-bir-parola \
      -v db_data:/var/lib/mysql \
      mysql:8
    

    Buradaki -e bayrağı konteynere ortam değişkeni (environment variable) geçirir; birçok imaj yapılandırmasını bu şekilde alır. Örnekteki gibi güçlü parolalar üretmek için şifre üretici aracımızı kullanabilirsiniz. Bu parolayı, imajın açık kaynak koduna değil, güvenli bir yerde tutulan bir yapılandırmaya koymayı unutmayın.

    Kendi İmajınızı Yazmak: Dockerfile#

    Hazır imajlar çoğu senaryoyu karşılar, ama kendi uygulamanızı paketlemek için bir imaj üretmeniz gerekir. Bunu Dockerfile adlı bir metin dosyasıyla, adım adım talimatlar vererek yaparsınız.

    Basit bir Node.js uygulamasını paketleyen örnek bir Dockerfile:

    # Temel imaj olarak resmi Node imajını kullan
    FROM node:20-alpine
    
    # Konteyner içindeki çalışma dizinini belirle
    WORKDIR /app
    
    # Önce bağımlılık dosyalarını kopyala (katman önbelleği için)
    COPY package*.json ./
    RUN npm ci --omit=dev
    
    # Uygulama kodunu kopyala
    COPY . .
    
    # Uygulamanın dinlediği portu belgele
    EXPOSE 3000
    
    # Konteyner başladığında çalışacak komut
    CMD ["node", "server.js"]
    

    Burada gözden kaçmaması gereken bir detay var: bağımlılık dosyalarını (package.json ve package-lock.json) uygulama kodundan önce kopyalayıp kurarız. Böylece yalnızca kodunuz değiştiğinde Docker, değişmeyen bağımlılık katmanını önbellekten alır ve build belirgin biçimde hızlanır. npm install yerine npm ci tercih etmemizin nedeni de bu: npm ci doğrudan package-lock.json dosyasını temel alarak sürümleri birebir sabitler, böylece imaj her ortamda aynı bağımlılıklarla üretilir. --omit=dev bayrağı ise geliştirme bağımlılıklarını (test, linter vb.) dışarıda bırakarak üretim imajını küçültür.

    Bu dosyadan bir imaj üretmek için (. mevcut dizini işaret eder):

    docker build -t benim-uygulamam:1.0 .
    

    Ardından imajınızdan bir konteyner başlatabilirsiniz:

    docker run -d -p 3000:3000 benim-uygulamam:1.0
    

    Bir .dockerignore dosyası eklemeyi de alışkanlık edinin; node_modules, .git gibi klasörleri build bağlamının dışında tutarak imajınızı hem küçültür hem de üretimini hızlandırır.

    Docker Compose ile Çok Servisli Uygulamalar#

    Gerçek dünyadaki uygulamalar tek konteynerden ibaret değildir. Tipik bir web uygulamasında bir uygulama sunucusu, bir veritabanı, belki bir önbellek (Redis) ve bir ters proxy (Nginx) birlikte çalışır. Bunları tek tek docker run ile ayağa kaldırmak yorucu ve hataya açıktır. İşte Docker Compose tam burada devreye girer: tüm servisleri tek bir compose.yaml dosyasında tanımlar ve tek komutla yönetirsiniz.

    WordPress ve MySQL'i birlikte kaldıran örnek bir compose.yaml:

    services:
      db:
        image: mysql:8
        environment:
          MYSQL_ROOT_PASSWORD: root-parola
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wp_user
          MYSQL_PASSWORD: wp-parola
        volumes:
          - db_data:/var/lib/mysql
    
      wordpress:
        image: wordpress:latest
        depends_on:
          - db
        ports:
          - "8080:80"
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_USER: wp_user
          WORDPRESS_DB_PASSWORD: wp-parola
          WORDPRESS_DB_NAME: wordpress
    
    volumes:
      db_data:
    

    Bu dosyada iki servis tanımlıdır. Şu ayrıntıya dikkat edin: WordPress servisi veritabanına IP adresiyle değil, doğrudan db servis adıyla ulaşır. Compose, tanımladığınız servisleri arka planda ortak bir ağa koyar ve her birinin diğerini kendi adıyla bulabilmesi için dahili bir DNS sağlar; ayrıca bir port yayınlamadığınız sürece db yalnızca bu ağın içinden erişilebilir kalır. Tüm yığını başlatmak için dosyanın bulunduğu dizinde şunu çalıştırın:

    docker compose up -d
    

    Servisleri durdurmak ve kaldırmak için:

    docker compose down          # konteynerleri durdur ve sil
    docker compose down -v       # volume'ları da sil (veri gider!)
    

    Bu yaklaşım, bir WordPress geliştirme ortamını saniyeler içinde kurup silmenizi, yapılandırmayı takım arkadaşlarınızla tek dosya olarak paylaşmanızı sağlar. Üretim ortamında ise genellikle web katmanının önüne bir ters proxy koyarsınız; bu noktada Apache mi Nginx mi tercih etmeli sorusu gündeme gelir.

    Docker Ne Zaman Kullanılır, Ne Zaman Kullanılmaz?#

    Docker güçlü bir araçtır ama her problem için doğru çözüm değildir. Karar verirken şu noktaları göz önünde bulundurun.

    Docker'ın parladığı durumlar:

    • Ortam tutarlılığı gerektiğinde: geliştirici makinesi, test ve üretim ortamı arasında birebir aynı davranış istiyorsanız.
    • Mikroservis mimarisi: her servisi bağımsız olarak paketleyip ölçeklemek istediğinizde.
    • Hızlı kurulum ve silme: yeni bir teknolojiyi denemek, geçici bir demo ortamı kurmak istediğinizde.
    • CI/CD hatları: otomatik test ve dağıtım süreçlerinde tekrarlanabilir, izole ortamlar için.

    Docker'ın gereksiz karmaşıklık getirebileceği durumlar:

    • Tek bir statik HTML sitesi ya da basit bir kişisel proje için, hazır bir hosting paketi çoğu zaman daha az bakım ister.
    • Ekipte konteyner deneyimi yoksa ve proje küçükse, öğrenme eğrisi getirişinden ağır basabilir.
    • GPU, özel çekirdek modülleri ya da tam donanım izolasyonu gerektiren yükler için sanal makineler daha uygundur.

    Kısacası Docker, dağıtım ve ortam tutarlılığı sorunlarını çözer; iş yükünüz bu sorunlardan muzdaripse büyük fark yaratır, değilse ek katman getirebilir.

    Sıkça Sorulan Sorular#

    Docker ile sanal makine arasındaki temel fark nedir?#

    Sanal makine, kendi işletim sistemi çekirdeğiyle donanımı tam olarak taklit eder ve ağır çalışır. Docker konteyneri ise ana makinenin çekirdeğini paylaşır, yalnızca uygulama ve bağımlılıklarını içerir; bu yüzden saniyeler içinde başlar ve çok daha az kaynak kullanır.

    Docker'ı Windows veya macOS'ta çalıştırabilir miyim?#

    Evet. Docker Desktop uygulaması hem Windows hem macOS için mevcuttur ve arka planda hafif bir Linux sanal makinesi çalıştırarak Docker'ı kullanmanızı sağlar. Geliştirme için ideal olsa da üretim ortamları genellikle doğrudan Linux sunucular üzerinde çalıştırılır.

    İmaj ile konteyner arasındaki fark nedir?#

    İmaj, uygulamanın çalışması için gereken her şeyi içeren salt-okunur bir şablondur; kendisi çalışmaz. Konteyner ise bu imajdan üretilmiş, çalışan ve yazılabilir bir örnektir. Aynı imajdan birbirinden bağımsız birçok konteyner başlatabilirsiniz.

    Konteyner silinince verilerim kaybolur mu?#

    Konteyner içinde tutulan veriler, konteyner silindiğinde kaybolur. Verinizi kalıcı kılmak için volume kullanmanız gerekir; volume, veriyi konteynerin yaşam döngüsünden bağımsız olarak saklar. Özellikle veritabanları için isimli volume kullanmak önerilir.

    Docker üretim ortamı için güvenli midir?#

    Doğru yapılandırıldığında evet. Güncel imajlar kullanmak, konteynerleri root olmayan kullanıcıyla çalıştırmak, gereksiz portları açmamak ve parolaları imaj içine gömmek yerine güvenli ortam değişkenleriyle geçmek temel güvenlik önlemleridir. Düzenli imaj güncellemesi ve yedekleme de ihmal edilmemelidir.

    Docker öğrenmek için önce Linux bilmek şart mı?#

    Şart değil ama temel Linux komutlarını bilmek işinizi çok kolaylaştırır, çünkü konteynerlerin çoğu Linux tabanlıdır. Dosya işlemleri, dizinler ve terminal kullanımı gibi temelleri öğrenmek, Docker'la çalışırken hata ayıklamayı belirgin şekilde hızlandırır.

    Docker, uygulamalarınızı taşınabilir, tutarlı ve tekrarlanabilir hâle getirerek dağıtım sürecinin en can sıkıcı kısımlarını ortadan kaldırır. Öğrendiklerinizi denemek için ihtiyaç duyacağınız tek şey, root erişimine sahip kendi sunucunuzdur; Docker'ı özgürce kurup deneyimleyebileceğiniz bir ortam için VDS sunucu çözümlerimize göz atabilir, sunucunuza taşıyacağınız uygulamaların kesintisiz çalışması için de yedekleme seçeneklerini değerlendirebilirsiniz.

    DockerKonteynerDevOps

    Uygulamaya geçmeye hazır mısınız?

    NVMe SSD, ücretsiz SSL ve %99.9 uptime garantisiyle Clou.TR hosting ve sunucu çözümleriyle projenizi hayata geçirin.