Технология 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)