docker system prune

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

Посмотреть все образы можно так

docker images

А можно вывести список всех образов по их размерам в порядке убывания

docker images --format '{{.Size}}\t{{.Repository}}' | sort -rh

Так уже лучше.

Что провести очистку системы

docker system prune

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N]

Система будет очищена в консервативном варианте.

Если нужны более радикальные действия

docker system prune --all

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] 
  • all stoped containers - все остановленные контейнеры
  • all networks not used... - все сети, которые не используются хотя бы одним контейнером
  • all images without at least ... - все образы которые не связаны хотя бы с одним контейнером.
  • all build cache - весь кеш, используемый при сборке

Дальше больше, если контейнеры не настроены на работы с syslog, а работают с stdout, то для веб-приложений могут накапливаться gigaнтские лог файлы, это можно посмотреть  так:

du -sh /var/lib/docker/containers/**/*.log | sort -rh

Если есть "проблемы", надо перенастроить логирование. Если же логи не нужны, как это часто бывает при тестировании или дублировании информации. То можно просто "обнулить" все или отдельные логи. Например:

sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

--volumes

Если добавить опцию --volumes, то хранилища также будут включены в список очистки. Это потенциально опасная операция. Почему? Если рабочий контейнер, с ассоциированными хранилищами остановлен или удален, например командой docker-compose down, то при запуске docker system prune --volumes, связанные с сервисами/контейнерами хранилища будут удалены, безвозвратно! Но часто, особенно для  сервисов баз данных это не то, что мы ожидаем. Следует помнить об этом и точно понимать ожидается от выполнения команды, какова конфигурация приложения или сервиса. Это касается только volumes, но не примонтированных директорий.

Бонус

На рабочей станции, где используются только эфемерные, временные контейнеры и нет критически важных данных, все образы можно скачать заново и т.д. Можно просто напросто время от времени переустановить docker. Удалить пакет, удалить /var/lib/docker и затем установить заново. Такой подход освобождает от рутины, за 5 минут мы получаем чистую платформу. Это сильно  помогает когда идет тестирование и работа с большим количество образов ( image), когда накапливаются десятки и сотни гигабайт образов разных версий. Но, конечно нужно понимать, что и зачем мы делаем, быть уверенным, что никакие важные данные не будут утеряны.