Очистка места на диске после docker

Технология Docker позволяет упаковать приложение или сервис в контейнер, который легко может быть запущен в любом окружении. Однако при активной работе с Docker жесткий диск быстро засоряется неиспользуемыми образами, контейнерами и томами данных.

Давайте разберемся с набором инструментов для чистки системы, предоставляемым Docker и рассмотрим несколько примеров!

Как мы уже упоминали ранее, для очистки неиспользуемых данных можно воспользоваться командой:

docker system prune

Однако данная команда появилась в docker-engine начиная с версии 1.13.0, а в предыдущих версиях приходилось исхитряться самостоятельно. Например, чтобы удалить недействительные образы (у которых нет метки), я вводил в консоли:

docker images --no-trunc | grep '' | awk '{ print $3 }' | xargs -r docker rmi

Как оказалось, все можно было сделать намного проще. Для поиска недействительных образов используется команда:

docker images -f dangling=true

Тогда для удаления ненужных образов можем использовать конструкцию:

docker rmi $(docker images -f dangling=true -q)

Примечание. Недействительные образы – это уровень образов, которые больше не имеют никакого отношения к образам с метками — они впустую потребляют дисковое пространство.

Для удаления остановленных контейнеров ранее я использовал команду:

docker ps --filter status=exited -aq | xargs docker rm -v

Но гораздо проще воспользоваться ввести в консоли:

docker rm $(docker ps -a -f status=exited -q)

В идеологии docker том хранения данных должен существовать независимо от контейнера. Следовательно, когда контейнер удаляется, том не удаляется автоматически. Он остаётся в системе, хотя больше не обслуживает ни один контейнер. Для удаления неиспользуемых томов в ранних версиях docker можно было использовать следующий скрипт:

#!/usr/bin/bash
find '/var/lib/docker/volumes/' -mindepth 1 -maxdepth 1 -type d | grep -vFf <(
  docker ps -aq | xargs docker inspect | jq -r '.[]|.Mounts|.[]|.Name|select(.)'
)

Начиная с версии docker-engine 1.9 все неиспользуемые (недействительные) тома можно найти с помощь такой командой:

docker volume ls -f dangling=true

а удалить с помощью такой:

docker volume rm $(docker volume ls -f dangling=true -q)