Docker’da Çalışmayan Containerları Silmek

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:

docker ps

Bu komut aslında “eski” versiyon. Yenisi ise şu şekilde:

docker container ls

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:

docker ps -a

Ve yeni hali olan:

docker container ls -a

Örnek bir çıktıyı ele alalım:

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
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'
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
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
0356b1f53452

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)
0356b1f53452

Çı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:

$ docker ps -f 'status=exited' 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

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.

Leave a comment