Container teknolojileriyle çalışırken, ideal şartlarda sistemin kendi kendini idare etmesini isteriz. Bir sorun olduğunda da otomatik olarak container’ın silinip, yeni bir tanesinin oluşturulması tercihimiz olur. Ancak bazı zamanlarda bu çalışma yöntemi tercih edilmeyebilir. Container, beklediğimiz kadar kısa ömürlü veya tek seferlik planlanmamış olabilir. Bazen de tek sunucuda çalıştığımızda ihtiyacımız, sadece elle container açıp onu yayında tutmaktan ibaret olabilir.

</figure>

Nerede Kullanabiliriz?

Statik bir web sitesini yayına almak istediğinizi düşünün. Bunun için object storage ve CDN ikilisini kullanmak çoğu zaman ideal bir çözüm olsa da, bunu yapamadığımızda ihtiyacımız, bir sanal makine açarak üzerinde siteyi yayına almak olabiliyor. Böyle durumlarda, Docker ile Nginx’i ayağa kaldırıp web sitesini birkaç dakikada yayına alabiliyoruz{.rank-math-link}. Tek ihtiyacımız ise, herhangi bir sebepten dolayı container kapanırsa, Docker’ı restart edersek, güncelleme olduğunda Docker restart edilirse, sunucu kapanıp açılır ve Docker başlarsa v.b. gibi durumlarda bizim istediğimiz container’ların otomatik olarak tekrar başlatılması.

Benzer şekilde, session tutmak için Redis kullandığımızı düşünelim. Redis’i de kendi geliştirme ortamımızda tek makine olarak çalıştırmak istiyorsak, bu makineye kurulumu yapıp bir sorun olduğunda baştan başlamasını isteriz. Dolayısıyla aynı oto-restart özelliği, bu bölümde de bir ihtiyaç haline geliyor.

Bazen de çok daha temel ihtiyaçlarda, yazdığımız bir scriptin her durumda çalışır halde durmasını, bir sebepten hata verip kapanırsa da otomatik olarak yeniden başlatılmasını istiyoruz. Bunu yapmanın çok farklı yöntemleri olsa da, Docker dünyasının kolaylıklarından faydalanıp yapmak genelde çok daha kısa sürüyor. Ekosistemin kalan tüm avantajlarını da kullanmamızı sağlıyor.

Otomatik Yeniden Başlatma

İhtiyaç listesi uzayıp gitmeye müsait. Örneklerle kullanım alanları hakkında ana fikri oluşturmaya çalıştık. Şimdi ise nasıl yapacağımıza bakalım. Docker’da bunun yöntemi yeniden başlatma politikası yani İngilizce tabiriyle restart policy vermekle mümkün oluyor. Bu yöntemin benzerlerini Kubernetes ve Docker Swarm gibi diğer orkestrasyon araçlarında da kullanıyoruz.

Restart policy ile container kapandığında ne yapılacağını belirliyoruz. Bunu yaparken de söyleyebileceğimiz birkaç aksiyon mevcut. Biz bunların arasından otomatik başlatma kısmıyla ilgileneceğiz. Bunun için, container’ı oluştururken ekleyeceğimiz –restart parametresi ile Docker’a derdimizi anlatıyoruz. Örneğin:

docker run -d -p 80:80 --restart always nginx

Örnek komuta baktığımızda; detached modda, yani arkaplanda çalışan bir container açtığımızı görüyoruz. Bu örnekte nginx imajını kullandık. Ayrıca container’ın 80 portunu da, çalıştığımız sunucunun 80 portu olarak dışarıya açtık.

Esas ilgilendiğimiz kısım ise —restart bölümü. Yanına yazdığımız always argümanı ile container hangi sebepten kapanırsa kapansın otomatik olarak yeniden başlasın demiş olduk. Böylece;

  • Bilgisayar/sunucu kapanıp açılırsa (Docker otomatik yeniden başlıyorsa)
  • Güncelleme sırasında Docker baştan başlatılırsa
  • Bir Docker’ı yeniden başlatırsak (systemctl restart docker gibi bir komutla)
  • Uygulama çökerse
  • Uygulama başarılı bir şekilde kendi isteğiyle kapanırsa
  • Uygulama çok fazla RAM kullanır da OOM tarafından kapatılırsa

ve diğer tüm ihtimallerde, Docker otomatik olarak tekrar başlatmak için elinden geleni yapacaktır.

Çalışan Container’ı Otomatik Yeniden Başlamaya Ayarlamak

Biraz önceki örnek komutta, yeni bir container oluşturduğumuzda ne yapabileceğimizden bahsettik. Çalışmakta olan bir container üzerinde işlem yapmak istersek biraz daha farklı bir süreç bizi bekliyor. Container’ı kill ile kapatıp yeni bir tanesini —restart ile açmak bir çözüm olsa da bu yöntem pek istenmeyebiliyor. Bu durumda, container’a dokunmadan, hatta kapatıp açmaya bile gerek duymadan güncellememiz mümkün. Bunun için docker container update komutunu kullanıyoruz.

Uygulama üzerinden görmek için, bir container oluşturalım ve otomatik olarak baştan başlatacak parametreyi unuttuğumuzu varsayalım. Container’a da web ismini verelim:

docker run -d --name web nginx

Bu container’ı şimdi otomatik olarak yeniden başlayacak şekilde ayarlamak istersek, ismi veya ID’sini kullanarak güncelleyebiliriz. Biz kendi verdiğimiz ismi, yani web‘i kullanacağız:

docker container update --restart always web

Artık otomatik restart özelliğini aktifleştirmiş olduk.

Çalışan Container’ın Restart Policy’sini Öğrenmek

Var olan bir container’ı veya yeni oluşturulacak bir container’ı nasıl otomatik olarak baştan başlayacak şekilde ayarladığımızı gördük. Bazen de sadece bilgi edinme amaçlı veya yaptığımız değişiklikleri doğrulama amaçlı olarak kontrol etmemiz gerekebiliyor. Böyle bir durumda Docker’dan bilgi alabiliyoruz. Ancak Docker’a bir container hakkında bilgi sorduğumuzda kullanabileceğimiz inspect alt komutu, çok uzun ve detaylı bir çıktı veriyor. Sadece restart policy’yi almak için şu komutu kullanabiliriz:

docker container inspect web -f ''

Sondaki -f parametresi ve yanındaki değer ile, JSON formatındaki uzun çıktı içerisinde almak istediğimiz field’ın yerini söylemiş olduk.