Thank you for reading this post, don't forget to subscribe!
Технология Docker позволяет упаковать приложение или сервис в контейнер, который легко может быть запущен в любом окружении. Однако при активной работе с Docker жесткий диск быстро засоряется неиспользуемыми образами, контейнерами и томами данных.
Давайте разберемся с набором инструментов для чистки системы, предоставляемым Docker и рассмотрим несколько примеров!
Для очистки неиспользуемых данных можно воспользоваться командой:
1 2 |
docker system prune |
Однако данная команда появилась в docker-engine
начиная с версии 1.13.0, а в предыдущих версиях приходилось исхитряться самостоятельно. Например, чтобы удалить недействительные образы (у которых нет метки), я вводил в консоли:
1 2 |
docker images --no-trunc | grep <span class="hljs-string">''</span> | awk <span class="hljs-string">'{ print $3 }'</span> | xargs -r docker rmi |
Как оказалось, все можно было сделать намного проще. Для поиска недействительных образов используется команда:
1 2 |
docker images <span class="hljs-_">-f</span> dangling=<span class="hljs-literal">true</span> |
Тогда для удаления ненужных образов можем использовать конструкцию:
1 2 |
docker rmi $(docker images <span class="hljs-_">-f</span> dangling=<span class="hljs-literal">true</span> -q) |
Примечание. Недействительные образы – это уровень образов, которые больше не имеют никакого отношения к образам с метками — они впустую потребляют дисковое пространство.
Для удаления остановленных контейнеров ранее я использовал команду:
1 2 |
docker ps --filter status=exited -aq | xargs docker rm -v |
Но гораздо проще воспользоваться ввести в консоли:
1 2 |
docker rm $(docker ps <span class="hljs-_">-a</span> <span class="hljs-_">-f</span> status=exited -q) |
В идеологии docker том хранения данных должен существовать независимо от контейнера. Следовательно, когда контейнер удаляется, том не удаляется автоматически. Он остаётся в системе, хотя больше не обслуживает ни один контейнер. Для удаления неиспользуемых томов в ранних версиях docker можно было использовать следующий скрипт:
1 2 3 4 5 6 |
<span class="hljs-meta">#!/usr/bin/bash </span> find <span class="hljs-string">'/var/lib/docker/volumes/'</span> -mindepth 1 -maxdepth 1 -type d | grep -vFf <( docker ps -aq | xargs docker inspect | jq -r <span class="hljs-string">'.[]|.Mounts|.[]|.Name|select(.)'</span> ) |
Начиная с версии docker-engine
1.9 все неиспользуемые (недействительные) тома можно найти с помощь такой командой:
1 2 |
docker volume ls <span class="hljs-_">-f</span> dangling=<span class="hljs-literal">true</span> |
а удалить с помощью такой:
1 |
docker volume rm $(docker volume ls <span class="hljs-_">-f</span> dangling=<span class="hljs-literal">true</span> -q) |