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
), когда накапливаются десятки и сотни гигабайт образов разных версий. Но, конечно нужно понимать, что и зачем мы делаем, быть уверенным, что никакие важные данные не будут утеряны.