Docker'da Çalışmayan Containerları Silmek - Peptr Blog
Container, DevOps, Docker peptr 30 Kasım 2019 0 0
Docker ve containerlar ile çalışırken çoğu zaman sistemde birçok kapalı/durmuş durumda olan container bulunuyor. Bazı durumlarda container komut satırından oluşturulurken yanlış bir parametre verilmiş olabiliyor ve container arkaplanda hata vermiş ve kapanmış şekilde duruyor. Bazen de tek seferlik, belirli bir işi yapması amacıyla oluşturduğumuz containerlar arka tarafta işini bitirmiş olarak durabiliyor.
Kapalı containerların bulunduğu neredeyse tüm durumlarda sadece çalışmayan containerları bulup sorgulayabilmek, istediklerimizi veya hepsini silmek sistemin karmaşıklaşmaması ve orta/uzun vadede oluşabilecek performans/sistem sorunlarının önlenmesi için önem taşıyor. Docker ise bize containerları listelerken o anki durumlarına göre filtreleme imkanı sağlıyor.
Containerlar Nasıl Sorgulanır?
Docker’da o an çalışan containerları sorgulamak için, muhtemelen sıkça kullandığınız 2 komut var:
Bu komut aslında “eski” versiyon. Yenisi ise şu şekilde:
Bu komutlar, alışık olduğumuz gibi çalışanları listeliyor. Yazının başında da bahsettiğimiz gibi sadece çalışan containerları görmek esas amacımızı karşılamıyor.
Şimdi de, çalışan ve kapalı tüm containerları görelim. Bunun için de aynı iki komutu birer parametre ekleyerek kullanabiliriz. Sık şekilde Docker’ı komut satırından kullanıyorsanız buna da aşina olabilirsiniz:
Ve yeni hali olan:
Örnek bir çıktıyı ele alalım:
9c9eaec9cd59        alpine              "sleep 3000"        5 seconds ago       Up 4 seconds                                    frosty_ganguly
0356b1f53452        alpine              "sleep 1"           12 seconds ago      Exited (0) 10 seconds ago                       brave_turing
Çıktıya bakacak olursak, bir çalışan, bir de kapanmış ve işini başarıyla tamamlamış container görüyoruz.
İlk olarak, sadece kapalı containerı nasıl bulabileceğimize bakalım:
$ docker ps -f 'status=exited'
0356b1f53452        alpine              "sleep 1"           About a minute ago   Exited (0) About a minute ago                       brave_turing
Örnekte de gördüğümüz gibi, -f ‘status=exited’ ile o anki containerlar içinde filtreleme yapmış oluyoruz.
Sadece ID veya isimleri alabilirsek, docker rm komutuna onları parametre olarak verip, tamamını tek seferde silebiliriz. Bunun için awk ve head komutlarını yan yana kullanmak bir çözüm gibi gözükse de, aslında Docker’dan bizi bununla uğraşmaktan kurtarıp direkt container ID’lerini döndürmesini isteme şansımız var. Onun için de -q parametresini kullanıyoruz. Bu parametre quiet, yani sessiz anlamına geliyor. Yani uzun çıktı yerine sessizce sadece ID’leri almak istediğimizi söylüyoruz. Örneğin:
$ docker ps -f 'status=exited' -q
Artık ID elimizde olduğuna göre, bunu docker rm ile nasıl birleştireceğimize bakabiliriz:
$ docker rm $(docker ps -f 'status=exited' -q)
Çıktıda silinen containerın ID’sinin kısa hali gözüktü. Birden fazla container silmiş olsaydık, alt alta diğerlerini de görecektik.
Sonuç & Kontrol & Hata Çözümü
Kontrol için tekrardan Docker’a kapalı containerları sorabiliriz:
Bu komutun çıktısında farklı containerlar görüyorsanız, Kubernetes, Docker Swarm gibi bir orkestrasyon aracı containerları başlatıyor, ancak containerlar kapandığı için sürekli yenilerini açmak zorunda kalıyor olabilir. Bu durumda orkestrasyon aracının kendisine çalışan deploymentlar, servisler hakkında sorular sorarak fikir edilebiliriz.