docker

Docker: Watchtower ile Konteynerleri otomatik olarak güncelleyin

Docker’ı kullanmak, yazılım geliştirme için uygulamaları standart birimlere paketlemenize olanak sağlamak gibi birçok avantaj sağlar. Bu, uygulamalarınızı dağıtmayı ve ölçeklendirmeyi kolaylaştırır.

Ancak, bir sunucudaki Docker görüntülerinin güncellemelerini yönetmek sıkıcı hale gelebilir. Bir görüntünün yeni sürümlerini manuel olarak çekmeniz ve her güncelleme yayınlandığında her kapsayıcıyı yeniden başlatmanız gerekir.

İşte Watchtower tam da bu noktada işe yarıyor! Watchtower, çalışan Docker konteynerlarınızı izleyecek ve bu konteynerların başlangıçta başlatıldığı imajlardaki değişiklikleri izleyecek konteyner tabanlı bir çözümdür.

Watchtower bir görüntünün değiştiğini tespit ettiğinde, yeni görüntüyü çekip en son sürümle çalıştırmak için ilgili kapsayıcıları otomatik olarak yeniden başlatır.

Bu kapsamlı rehberde, Watchtower’ın Ubuntu 20.04/22.04’te nasıl kurulacağını ve kapsayıcıları otomatik olarak güncelleyecek şekilde nasıl yapılandırılacağını ele alacağız.

Ön koşullar

Watchtower kurulumuna başlamadan önce, ihtiyacınız olan birkaç ön koşul bulunmaktadır:

  • Docker yüklü bir Ubuntu 20.04/22.04 sunucusu
  • Docker önyüklemede otomatik olarak başlatılacak şekilde yapılandırıldı (varsayılan olmalıdır)
  • Sunucuda halihazırda çalışan ve güncel tutmak istediğiniz birkaç Docker konteyneri

Ubuntu sunucunuz hazır olduğunda, Docker aktif olduğunda ve bazı konteynerlar çalıştığında, Watchtower’ı yüklemeye geçebiliriz.

Adım 1 – Watchtower’ı yükleyin

Watchtower bir Docker imajı olarak dağıtılır, bu yüzden kurulum o imajdan bir konteyner çalıştırmak kadar basittir. Watchtower imajı Docker Hub’da barındırılır.

En son Watchtower görüntüsünü aşağı çekin:

$ docker pull containrrr/watchtower

Görüntünün indirilmesi tamamlandıktan sonra bir Watchtower konteyneri çalıştırabilirsiniz:

$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower

Docker run komutuna geçirdiğimiz seçeneklere bir göz atalım:

  • -d – Watchtower konteynerini ayrı modda çalıştırır
  • --name watchtower – Konteyneri daha kolay tanımlanabilmesi için "watchtower" olarak adlandırır
  • -v /var/run/docker.sock:/var/run/docker.sock – Docker soketini Watchtower konteynerine bağlar, böylece Docker daemon'uyla iletişim kurabilir
  • containrrr/watchtower – Kullanılacak Watchtower Docker görüntüsü

Bu, arka planda diğer konteynerlerinizi izlemeye hazır bir Watchtower konteyneri oluşturacak ve başlatacaktır.

Adım 2 – Watchtower Bildirim Seçeneklerini Yapılandırın

Varsayılan olarak, Watchtower size bildirimde bulunmadan arka planda konteyner görüntü güncellemelerini sessizce kontrol edecektir. Watchtower’ı başlatırken birkaç ortam değişkeni ayarlayarak bu davranışı değiştirebilirsiniz:

Konteynerler Üzerindeki Bildirimler

Watchtower kapsayıcıları güncellediğinde bildirim almak için -e WATCHTOWER_NOTIFICATIONS=email ortam değişkenini geçirin.

Bildirimler için birkaç seçenek bulunmaktadır:

  • email – E-posta bildirimleri gönderecek. Ek yapılandırma gerektirir.
  • slack –Slack’e bildirim gönderebilirsiniz. Webhook URL’si ve kanal gerektirir.
  • msteams –MS Teams’e bildirimler gönderin. Webhook URL’si gerektirir.
  • gotify – Gotify üzerinden bildirim gönderin. Uygulama belirteci ve sunucu URL’si gerektirir.

Örneğin:

$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock -e WATCHTOWER_NOTIFICATIONS=email containrrr/watchtower

Bu, konteynerler güncellendiğinde e-posta bildirimlerinin gönderilmesini sağlayacaktır.

Watchtower Başlatma/Çıkış Bildirimleri

Ayrıca, -e WATCHTOWER_NOTIFICATIONS_LEVEL=start-exit komutunu vererek Watchtower konteyneri başlatıldığında veya kapatıldığında bildirim alabilirsiniz:

$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock -e WATCHTOWER_NOTIFICATIONS=email -e WATCHTOWER_NOTIFICATIONS_LEVEL=start-exit containrrr/watchtower

Bu, hem konteyner güncellemelerinde hem de Watchtower başladığında/durduğunda bildirim gönderecektir.

Bildirim Hizmetleri Yapılandırması

Bildirimleri etkinleştirirseniz, bildirim hizmetleri için yapılandırma sağlamanız gerekecektir.

Bu, ek ortam değişkenlerini geçirerek veya YAML yapılandırma dosyalarını konteynera bağlayarak yapılır.

E-posta Yapılandırması

E-posta bildirimleri almak için şunları sağlamanız gerekir:

  • WATCHTOWER_EMAIL_FROM – The address to send notification emails from
  • WATCHTOWER_EMAIL_TO – The address to send notifications to
  • WATCHTOWER_EMAIL_SERVER – SMTP server address
  • WATCHTOWER_EMAIL_SERVER_PORT – SMTP server port
  • WATCHTOWER_EMAIL_SERVER_USER – SMTP user name
  • WATCHTOWER_EMAIL_SERVER_PASSWORD – SMTP password

Gmail için şöyle görünecektir:

$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock \
  -e WATCHTOWER_NOTIFICATIONS=email \
  -e WATCHTOWER_EMAIL_FROM=[email protected] \ 
  -e WATCHTOWER_EMAIL_TO=[email protected] \
  -e WATCHTOWER_EMAIL_SERVER=smtp.gmail.com \
  -e WATCHTOWER_EMAIL_SERVER_PORT=587 \
  -e WATCHTOWER_EMAIL_SERVER_USER=[email protected] \
  -e WATCHTOWER_EMAIL_SERVER_PASSWORD=gmail_password \
  containrrr/watchtower 

Slack Yapılandırması

Slack’e gönderi yapmak için şunlara ihtiyacınız var:

  • WATCHTOWER_NOTIFICATIONS_SLACK_WEBHOOK_URL – Your Slack webhook URL
  • WATCHTOWER_NOTIFICATIONS_SLACK_CHANNEL – The Slack channel to post to

Örneğin:

$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock \
  -e WATCHTOWER_NOTIFICATIONS=slack \
  -e WATCHTOWER_NOTIFICATIONS_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxx \
  -e WATCHTOWER_NOTIFICATIONS_SLACK_CHANNEL="#channel-name" \
  containrrr/watchtower

MS Teams Yapılandırması

MS Teams bildirimleri için yalnızca şunları sağlamanız gerekir:

  • WATCHTOWER_NOTIFICATIONS_MSTEAMS_WEBHOOK_URL –  MS Teams webhook URLniz

Örneğin:

$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock \
  -e WATCHTOWER_NOTIFICATIONS=msteams \
  -e WATCHTOWER_NOTIFICATIONS_MSTEAMS_WEBHOOK_URL=https://webhook.teams.microsoft.com/xxx \
  containrrr/watchtower

Yapılandırma Dosyalarını Kullanma

Ortam değişkenlerini geçirmek yerine, bildirim yapılandırmalarınızı YAML dosyalarında tanımlayabilir ve bunları Watchtower konteynerine bağlayabilirsiniz.

Bu, yapılandırmalarınızı harici olarak saklamanızı ve uzun komut dizeleri iletmenize gerek kalmamasını sağlar.

Yapılandırma dosyası yolları:

  • /config/email.yaml – Email configuration
  • /config/slack.yaml – Slack configuration
  • /config/msteams.yaml – MS Teams configuration

Özel YAML dosyalarınızı varsayılan boş dosyaların üzerine yerleştirin.

Örneğin e-posta bildirimleri için:

$ docker run -d --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /path/to/email.yaml:/config/email.yaml \
  containrrr/watchtower

Email.yaml dosyanız şunları içerecektir:

email:
  from: [email protected]
  to: [email protected]
  server: smtp.gmail.com
  port: 587
  user: [email protected]
  password: gmail_password

Bu, bildirim yapılandırmalarınızı Watchtower konteynerinin dışında ve ondan ayrılabilir tutar.

Adım 3 – Hangi Kapsayıcıların Güncelleneceğini Kontrol Edin

Varsayılan olarak, Watchtower Docker daemon’unda çalışan tüm kapsayıcıları izleyecek ve imajın yenilendiği tüm kapsayıcıları güncelleyecektir.

Watchtower’ın bunları otomatik olarak güncellemesini önlemek için kapsayıcıları adlarına veya etiketlerine göre hariç tutabilirsiniz:

Konteyner Adına Göre Hariç Tut

İsimler için –exclude seçeneğini bir regex filtresiyle geçirin:

$ docker run -d --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower --exclude "my-container-name|another-container"

Konteyner Etiketi ile Hariç Tutma

Label containers with com.centurylinklabs.watchtower.enable=false to exclude:

$ docker run -d --label com.centurylinklabs.watchtower.enable=false nginx

Bu etikete sahip konteynerler Watchtower tarafından dikkate alınmayacaktır.

Yalnızca Eşleşen Kapsayıcıları Dahil Etme

Ayrıca –include kullanarak yalnızca bir desenle eşleşen kapsayıcıları güncellemek için kapsayıcıları beyaz listeye alabilirsiniz:

$ docker run -d --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower --include "container-a|container-b"

Artık Watchtower yalnızca container-a veya container-b adlı kapsayıcıları otomatik olarak güncelleyecek, diğerlerini görmezden gelecek.

Adım 4 – Gözcü Kulesi Anket Aralıklarını Değiştirin

Watchtower varsayılan olarak her birkaç dakikada bir yeni görselleri kontrol edecektir. Watchtower’ın yeni görseller için ne sıklıkla anket düzenleyeceğini değiştirebilirsiniz.

Yeni Görüntüleri Kontrol Et

Watchtower’ın yeni görselleri ne sıklıkla kontrol edeceğini değiştirmek için –interval seçeneğini bir süre dizesiyle birlikte geçirin:

$ docker run -d --name watchtower \
  -v /var/run/docker.sock:/var/run/docker.sock \
  containrrr/watchtower --interval 5m

Bu sayede Watchtower her 5 dakikada bir yeni görselleri kontrol edecek.

Konteynerleri Yeniden Başlat

Varsayılan olarak, Watchtower, kapsayıcıları yeniden başlatmadan önce bir görüntü güncellemesinden sonra 10 dakika bekleyecektir. Watchtower’ın yeniden başlatılmadan önce beklediği süreyi –restart-delay ile değiştirebilirsiniz:

$ docker run -d --name watchtower \
 -v /var/run/docker.sock:/var/run/docker.sock \
 containrrr/watchtower --restart-delay 2m

Bu, yeniden başlatma gecikmesini 2 dakikaya ayarlayacaktır.

Adım 5 – Watchtower Başlatma İşlemini Otomatikleştirin

Son adım, Docker daemon başlatıldığında Watchtower’ın otomatik olarak başlatıldığından emin olmaktır. Bu, sunucuyu her yeniden başlattığınızda Watchtower’ı çalıştıracaktır.

Watchtower’ı önyüklemede başlatmak için basit bir systemd birim dosyası oluşturabilirsiniz.

/etc/systemd/system/watchtower.service dizininde şu tanımı içeren bir birim dosyası oluşturun:

[Unit]
Description=Watchtower - Auto update Docker containers
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStart=/usr/bin/docker start -a watchtower
ExecStop=/usr/bin/docker stop -t 2 watchtower
[Install]
WantedBy=multi-user.target

Bu, Docker daemon başlatıldığında oluşturduğumuz Watchtower konteynerini başlatacaktır.

Systemd’yi yeniden yükleyin ve Watchtower hizmetinin önyükleme sırasında başlamasını sağlayın:

$ sudo systemctl daemon-reload
$ sudo systemctl enable watchtower

Gözetleme Kulesi artık sunucuyu her yeniden başlattığınızda otomatik olarak çalışacak.

Adım 6 – Docker Compose’da Watchtower’ı Kurun

Watchtower’ı Docker Compose yığınının bir parçası olarak da çalıştırabilirsiniz.

Docker-compose.yml dosyanıza şu şekilde bir watchtower servisi ekleyin:

version: "3"
services:
  app:
    image: myapp
    ports:
      - "8080:80"
  watchtower:
    image: containrrr/watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --interval 30

Bu, Watchtower’ı, oluşturduğunuz dosyada tanımlanan uygulama/hizmet kapsayıcılarıyla birlikte başlatacaktır.

Watchtower diğer servisleri izleyecek ve yeni sürümler yayınlandıkça tüm görselleri otomatik olarak güncelleyecektir.

Birimler Docker soketini bağlar, böylece Watchtower Docker daemon’ıyla iletişim kurabilir.

Komut kontrol aralığını 30 saniyeye ayarlar. Bu aralığı gerektiği gibi özelleştirebilirsiniz.

Artık docker-compose up komutunu çalıştırdığınızda Watchtower görsellerinizi anında güncel tutacak!

Docker Compose’u kullanmak, Watchtower izlemeyi yeni ve mevcut yığınlara kolayca eklemenizi sağlar. Herhangi bir yeni veya mevcut görüntüyü otomatik olarak güncellemeye başlamak için sadece watchtower hizmetini ve birim bağlantı noktasını ekleyin.

Yazının orijinalini buradan okuyabilirisniz.