Docker & DevOps

    Watchtower ile Otomatik Konteyner Güncelleme

    Konteyner imajlarını otomatik güncelleyen Watchtower kurulumu ve üretimde güvenli kullanım biçimi.

    10 dk okuma Güncellendi: 25 Ağustos 2026

    Bir sunucuda on beş konteyner çalışıyorsa, her birinin temel imajında düzenli olarak güvenlik yamaları yayınlanır ve hiçbiri size haber vermez. Aylar sonra bir zafiyet taraması yaptığınızda, yamalanalı yarım yıl olmuş bir kütüphaneyle çalıştığınızı öğrenirsiniz. Elle güncelleme teoride basittir — docker pull ve docker compose up -d — ama pratikte kimse on beş servisi haftalık olarak tek tek gezmez. Sonuç, "sonra yaparım" ile geçen aylardır.

    Watchtower bu işi otomatikleştiren küçük bir konteynerdir: çalışan konteynerlerinizin imajlarını düzenli olarak kontrol eder, registry'de yeni bir sürüm varsa indirir, konteyneri aynı ayarlarla yeniden oluşturur ve isterseniz eski imajı temizler. Kulağa harika geliyor ve gerçekten de doğru yerde kullanıldığında büyük kolaylık. Ama otomatik güncellemenin gerçek bir maliyeti vardır ve bu rehberde onu da açıkça konuşacağım. Kurulumu, zamanlamayı, etiketle seçici güncellemeyi, bildirimleri, özel registry kimlik doğrulamasını ve en önemlisi üretimde hangi kipte çalıştırmanız gerektiğini ele alacağız.

    Watchtower Tam Olarak Ne Yapar#

    Watchtower, Docker soketine bağlanır ve şu döngüyü çalıştırır: çalışan konteynerlerin listesini alır, her birinin kullandığı imaj etiketini registry'de sorgular, yerel imajın sindirim değeriyle uzaktakini karşılaştırır ve fark varsa yeni imajı çeker. Ardından konteyneri durdurur, aynı yapılandırmayla (ortam değişkenleri, hacimler, portlar, ağ, restart politikası) yeniden oluşturur ve başlatır.

    Yapmadığı şeyleri de bilmek gerekir. Güncelleme öncesi yedek almaz. Yeni sürümün çalıştığını doğrulamaz. Bir şey ters giderse geri almaz. Veritabanı şema geçişi çalıştırmaz. Sürüm notlarını okuyup "bu sürümde kırıcı değişiklik var mı" diye bakmaz. Yani Watchtower bir güncelleme taşıyıcısıdır, bir dağıtım hattı değil.

    Bu ayrım, aracı nerede kullanacağınızı doğrudan belirler: kendi ev laboratuvarınızda, dahili araçlarda ve kesintiye toleranslı yardımcı servislerde mükemmel iş görür; müşteriye hizmet veren kritik uygulamada ise izleme kipinde kullanılması çok daha doğrudur. Aşağıda ikisinin de yapılandırmasını göstereceğim.

    Kurulum ve Temel Yapılandırma#

    Watchtower tek konteynerdir ve Docker soketine erişmesi gerekir:

    docker run -d \
      --name watchtower \
      --restart unless-stopped \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -e WATCHTOWER_CLEANUP=true \
      -e WATCHTOWER_POLL_INTERVAL=86400 \
      containrrr/watchtower
    

    Compose karşılığı daha okunabilirdir ve ayarları tek yerde tutar:

    services:
      watchtower:
        image: containrrr/watchtower
        restart: unless-stopped
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        environment:
          WATCHTOWER_CLEANUP: "true"          # eski imajlari sil
          WATCHTOWER_LABEL_ENABLE: "true"     # sadece etiketli konteynerler
          WATCHTOWER_ROLLING_RESTART: "true"  # hepsini ayni anda durdurma
          WATCHTOWER_TIMEOUT: 60s             # durdurma icin bekleme suresi
          TZ: Europe/Istanbul
    

    WATCHTOWER_CLEANUP ayarını açmanızı öneririm; kapalıyken her güncellemede eski imaj diskte kalır ve aylar içinde ciddi yer tutar. Disk dolduğunda ne temizleneceğini Docker diski doldurdu yazısında bulabilirsiniz.

    Kurulumu doğrudan üretime almadan önce tek seferlik çalıştırıp ne yapacağını görmek iyi bir alışkanlıktır:

    # Bir kez tara, isini yap ve cik - loglara bakin
    docker run --rm \
      -v /var/run/docker.sock:/var/run/docker.sock \
      containrrr/watchtower --run-once --debug
    

    Zamanlama: Aralık mı, Cron mu#

    İki seçenek vardır. WATCHTOWER_POLL_INTERVAL saniye cinsinden basit bir aralık verir; 86400 günde bir demektir ve sayaç konteynerin başladığı andan itibaren işler. Bu, güncellemenin her gün farklı bir saatte olabileceği anlamına gelir; sunucu yeniden başladığında saat kayar.

    WATCHTOWER_SCHEDULE ise cron ifadesi alır ve güncellemenin ne zaman olacağını kesin belirler. Dikkat edilmesi gereken nokta, buradaki cron biçiminin altı alanlı olmasıdır: en başa saniye alanı eklenir.

        environment:
          # Her gun sabah 04:30'da - ilk alan SANIYE
          WATCHTOWER_SCHEDULE: "0 30 4 * * *"
          TZ: Europe/Istanbul
    

    Cron kullanmanızı öneririm ve saati düşük trafikli bir zamana koyun. TZ değişkenini vermeyi de unutmayın; aksi hâlde konteyner UTC'ye göre çalışır ve "sabah 4'e ayarladım ama 7'de güncelledi" şaşkınlığını yaşarsınız. Cron ifadelerinin genel mantığına yabancıysanız Linux cron görevleri yazısı temel biçimi anlatıyor.

    Etiketle Seçici Güncelleme#

    Varsayılan davranışta Watchtower tüm konteynerleri günceller ve bu, üretimde neredeyse hiçbir zaman istediğiniz şey değildir. Veritabanınızın ana sürümünün gece yarısı kendiliğinden atlaması, uyanmak istemeyeceğiniz bir sabah demektir.

    Doğru yaklaşım, WATCHTOWER_LABEL_ENABLE=true ile davranışı tersine çevirmektir: artık yalnızca açıkça etiketlediğiniz konteynerler güncellenir.

    services:
      app:
        image: registry.firmaniz.com/firmaniz/web:1.4
        labels:
          com.centurylinklabs.watchtower.enable: "true"    # bunu guncelle
    
      db:
        image: postgres:16-alpine
        # etiket yok => LABEL_ENABLE aciksa hic dokunulmaz
    
      proxy:
        image: nginx:1.27-alpine
        labels:
          com.centurylinklabs.watchtower.enable: "false"   # asla guncelleme
    

    Kural basit: veritabanları, mesaj kuyrukları ve durum tutan her şey listede olmasın. Bunların güncellemesi elle, sürüm notları okunarak ve yedek alınarak yapılmalıdır. Durum tutmayan uygulama konteynerleri, yardımcı servisler ve dahili araçlar ise otomatik güncelleme için uygun adaylardır.

    Bir de imaj etiketi seçimi meselesi var. Watchtower, konteynerin kullandığı etiketin arkasındaki imajın değişip değişmediğine bakar. nginx:latest kullanıyorsanız her ana sürüm atlaması otomatik gelir; nginx:1.27 kullanıyorsanız yalnızca o dalın yamaları gelir. İkincisi üretimde çok daha öngörülebilirdir.

    Bildirimler#

    Otomatik güncellemenin en tehlikeli hâli sessiz olanıdır. Bir şey değiştiyse haberiniz olmalı; bu yüzden bildirimleri kurulumun zorunlu parçası sayın.

        environment:
          WATCHTOWER_NOTIFICATIONS: shoutrrr
          # Telegram ornegi - token ve sohbet kimligi kendi botunuzdan
          WATCHTOWER_NOTIFICATION_URL: "telegram://BOT_TOKEN@telegram/?chats=SOHBET_ID"
          WATCHTOWER_NOTIFICATION_REPORT: "true"
          WATCHTOWER_NOTIFICATIONS_LEVEL: info
    

    Bildirim adresi olarak Telegram, Slack, Discord, e-posta ve genel web kancası desteklenir. Hangisini seçerseniz seçin, iki şeye dikkat edin: bildirim adresinde bir bot token'ı ya da web kancası anahtarı bulunur ve bu bir gizli bilgidir, doğrudan Compose dosyasına yazıp depoya göndermeyin. Gizli değerleri dosyadan besleme yöntemleri için Docker'da gizli bilgi yönetimi yazısına bakın.

    İkincisi, WATCHTOWER_NOTIFICATION_REPORT ayarı her taramada değil, yalnızca bir değişiklik olduğunda özet rapor gönderir. Aksi hâlde günde bir "hiçbir şey güncellenmedi" mesajı alırsınız ve iki hafta içinde bildirimleri sessize alırsınız — ki bu, alarm kurmamış olmakla aynı kapıya çıkar.

    Özel Registry ile Kimlik Doğrulama#

    Kendi registry'nizden çekiyorsanız Watchtower'ın da kimlik doğrulaması gerekir. En temiz yol, sunucuda docker login ile oluşan kimlik dosyasını konteynere salt okunur bağlamaktır:

    services:
      watchtower:
        image: containrrr/watchtower
        restart: unless-stopped
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /root/.docker/config.json:/config.json:ro
        environment:
          WATCHTOWER_LABEL_ENABLE: "true"
          WATCHTOWER_SCHEDULE: "0 30 4 * * *"
    

    Bu dosyada kimlik bilgileri şifrelenmemiş biçimde durur, dolayısıyla izinlerini 600 tutun. Registry tarafında ise Watchtower için yalnızca çekme yetkisi olan ayrı bir hesap ya da robot token'ı kullanın; güncelleme yapan bir bileşene gönderme yetkisi vermenin hiçbir gerekçesi yoktur. Kendi registry'nizi kurmadıysanız kendi Docker registry kurulumu yazısı adım adım anlatıyor.

    Üretimde Güvenli Desen: İzleme Kipi#

    Şimdi en önemli tavsiyeye geldim. Müşteriye hizmet veren bir sistemde Watchtower'ı doğrudan güncelleme kipinde çalıştırmanızı önermiyorum. Sebebi teknik bir kusur değil, süreçle ilgilidir: güncelleme kararını hiç kimse vermemiş olur, doğrulama yapılmaz ve bir sorun çıktığında geri dönüş yolu tanımlı değildir.

    Bunun yerine WATCHTOWER_MONITOR_ONLY=true ile izleme kipinde çalıştırın. Watchtower yeni sürümü tespit eder, size bildirim gönderir ama hiçbir şeye dokunmaz. Siz sürüm notlarına bakar, uygun bir zaman seçer ve güncellemeyi kendiniz tetiklersiniz.

        environment:
          WATCHTOWER_MONITOR_ONLY: "true"     # sadece haber ver, guncelleme
          WATCHTOWER_NOTIFICATIONS: shoutrrr
          WATCHTOWER_NOTIFICATION_URL: "telegram://BOT_TOKEN@telegram/?chats=SOHBET_ID"
    

    Kritik olmayan servisler için otomatik güncellemeyi açtığınızda ise şu üç güvenlik ağını birlikte kurun: sağlık kontrolü tanımlayın ki bozuk bir sürüm en azından unhealthy olarak görünsün, restart politikası verin ki çöken konteyner tekrar denesin ve bildirimlerin gerçekten ulaştığını bir kez test edin. Sağlık kontrolü yazımı için Docker healthcheck kullanımı, restart politikası seçimi için Docker restart politikaları yazılarına bakabilirsiniz.

    Bir alternatif de şudur: Watchtower yerine dağıtımı kendi hattınızdan yapmak. docker compose pull && docker compose up -d komutunu çalıştıran zamanlanmış bir görev ya da CI hattınızın sonundaki bir adım, aynı sonucu verir ama kararı sizin kontrolünüzde bırakır ve Compose dosyanızla çelişmez.

    Compose ile Birlikte Kullanımın İncelikleri#

    Watchtower bir konteyneri güncellediğinde onu Docker seviyesinde yeniden oluşturur, Compose dosyanızı okumaz. Konteyner üzerindeki Compose etiketleri korunduğu için docker compose ps çıktısı genellikle tutarlı görünür; ancak dosyada yazan imaj etiketi ile çalışan konteynerin gerçek imajı arasında bir fark oluşabilir.

    Pratikteki sonucu şudur: bir sonraki docker compose up -d komutu, dosyadaki tanımı esas alarak konteyneri yeniden oluşturabilir. Bu bir veri kaybı yaratmaz ama beklenmedik bir yeniden başlatma anlamına gelir. Bu karışıklığı azaltmanın iki yolu var: ya Watchtower'ı yalnızca Compose ile yönetilmeyen konteynerler için kullanın, ya da Compose ile yönetilen yığınlarda otomatik güncelleme yerine pull ve up -d çalıştıran bir zamanlanmış görev tercih edin.

    Bir de Docker soketi meselesi var ve bunu geçiştirmemek gerekiyor: Watchtower'a soketi bağlamak, o konteynere sunucu üzerinde kök yetkisine eşdeğer güç verir. Çalıştırdığınız imajın güvenilir olması ve düzenli güncellenmesi bu yüzden önemlidir. Watchtower'ın kaynak projesinin bakım durumunu ve alternatif çatallarını kurulumdan önce bir kez kontrol etmenizi öneririm; ihtiyacınız yalnızca bildirimse, güncelleme yapmayan ve sadece haber veren daha dar kapsamlı araçlar da mevcuttur.

    Sık Yapılan Hatalar#

    Etiket filtresi kullanmadan çalıştırmak. Varsayılan davranış her şeyi günceller; veritabanınızın ana sürüm atlaması bir gecede gelir. WATCHTOWER_LABEL_ENABLE=true ile tersine çevirin.

    latest etiketiyle üretim çalıştırmak. Otomatik güncelleme ile latest birleşince, hangi sürümün ne zaman geldiğini kimse bilmez. Ana sürüm dalını sabitleyen etiketler kullanın.

    Bildirimleri kurmamak. Sessiz bir otomasyon, bir sorun çıktığında sizi tamamen kör bırakır. Kurulumu bildirim testi yapmadan tamamlanmış saymayın.

    WATCHTOWER_CLEANUP ayarını kapalı bırakmak. Her güncellemede bir eski imaj birikir; aylar sonra diskin nereye gittiğini araştırırsınız.

    TZ vermemek. Konteyner UTC'ye göre çalışır ve zamanlanmış güncelleme beklediğiniz saatte olmaz.

    Yedek almadan otomatik güncellemeye güvenmek. Watchtower geri alma yapmaz. Kalıcı verisi olan hiçbir servisi, düzenli yedeği olmadan otomatik güncellemeye bırakmayın.

    Sıkça Sorulan Sorular#

    Watchtower üretim ortamında güvenli mi#

    Aracın kendisi işini yapar, ama üretimde doğrudan güncelleme kipinde çalıştırmak süreç açısından risklidir: güncelleme kararını kimse vermez, yeni sürüm doğrulanmaz ve geri alma yolu yoktur. Üretimde WATCHTOWER_MONITOR_ONLY=true ile izleme kipini kullanmanızı, güncellemeyi ise kendi kontrolünüzde tetiklemenizi öneririm. Kritik olmayan iç araçlarda otomatik kip gayet makul çalışır.

    Watchtower veritabanı konteynerini de günceller mi#

    Varsayılan ayarlarda evet ve bu tam olarak kaçınmanız gereken şeydir. Veritabanı ana sürüm atlamaları genellikle veri dizini geçişi gerektirir; habersiz bir güncelleme, konteynerin açılmaması ya da daha kötüsü uyumsuz bir veri dizini ile sonuçlanabilir. WATCHTOWER_LABEL_ENABLE=true kullanarak yalnızca etiketlediğiniz konteynerleri güncelleyin ve veritabanlarını bu listeye asla eklemeyin.

    Güncelleme sonrası uygulama bozulursa ne olur#

    Watchtower geri alma yapmaz; bozuk sürüm çalışmaya devam eder. Bu yüzden en azından bir sağlık kontrolü tanımlayın, böylece konteyner unhealthy olarak görünür ve bildirimlerden fark edersiniz. Elle geri dönmek için önceki imaj etiketini biliyor olmanız gerekir; WATCHTOWER_CLEANUP açıksa eski imaj silinmiş olabilir, o durumda registry'den eski sürümü tekrar çekersiniz. Sürüm etiketlerini not almak bu senaryoda hayat kurtarır.

    Watchtower kendi kendini günceller mi#

    Evet, Watchtower kendi imajının da yeni sürümünü bulursa kendini yeniden oluşturur. Bu kolaylık gibi görünse de Docker soketine erişimi olan bir bileşenin kendini otomatik güncellemesi, güven zincirini tamamen imaj kaynağına bağlar. Kritik ortamlarda Watchtower'ın kendisini etiket filtresi dışında bırakıp elle güncellemeyi tercih edebilirsiniz.

    Ne sıklıkla kontrol etmeli#

    Günde bir kez çoğu kurulum için yeterlidir ve registry'ye gereksiz yük bindirmez. Saatte bir kontrol, güvenlik yamalarını daha hızlı almanızı sağlar ama Docker Hub gibi limitleri olan kaynaklardan çekiyorsanız istek bütçenizi tüketebilir. Cron ifadesiyle düşük trafikli bir saati seçmek, sıklığı artırmaktan daha değerlidir.

    Watchtower yerine ne kullanabilirim#

    En basit alternatif, docker compose pull && docker compose up -d komutunu çalıştıran zamanlanmış bir görevdir; kararı sizde bırakır ve Compose dosyanızla çelişmez. Yalnızca haberdar olmak istiyorsanız, güncelleme yapmadan sadece bildirim gönderen daha dar kapsamlı araçlar vardır. Daha yapısal bir çözüm ise güncellemeyi CI hattınızın bir adımı hâline getirmek; test edilmiş bir imajı bilinçli olarak dağıtmak her zaman en sağlamıdır.

    Özel registry'den çekerken kimlik doğrulama nasıl yapılır#

    Sunucuda docker login yaptıktan sonra oluşan kimlik dosyasını Watchtower konteynerine salt okunur olarak bağlamanız yeterlidir. Bu dosyada kimlik bilgileri şifrelenmemiş durur, bu yüzden izinlerini 600 tutun ve Watchtower için yalnızca çekme yetkisi olan ayrı bir hesap ya da robot token'ı üretin. Kimlik bilgisi geçersizse Watchtower sessizce güncelleme yapamaz; kurulumdan sonra loglara bakıp doğrulayın.

    Kapanış#

    Watchtower, doğru yerde kullanıldığında güncelleme borcunuzu ciddi biçimde azaltan pratik bir araçtır; yanlış yerde kullanıldığında ise gece yarısı gelen sürprizlerin kaynağı olur. Aklınızda kalması gereken dört alışkanlık şunlar: etiket filtresini açıp yalnızca durum tutmayan servisleri otomatik güncelleyin, latest yerine ana sürümü sabitleyen etiketler kullanın, bildirimleri kurulumun zorunlu parçası sayın ve üretimde izleme kipini tercih ederek güncelleme kararını insanda bırakın. Watchtower'a Docker soketi verdiğinizi, yani ona sunucunuz üzerinde kök yetkisine eşdeğer güç tanıdığınızı da unutmayın.

    Güncelleme otomasyonu, sağlam bir yedekleme ve izlenebilir bir altyapıyla birlikte anlam kazanır. Kendi Docker yığınınız için tam root erişimli VDS ve esnek bulut sunucu paketlerimize göz atabilir, güncelleme ve bakım süreçlerini devretmek isterseniz sunucu yönetimi hizmetimizden yararlanabilirsiniz. Otomatik güncellemeden önce alınacak kopyalar için yedekleme çözümümüz, konteyner verilerinizi güvenceye almanın en doğrudan yoludur.

    WatchtowerDockerOtomasyon

    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.