Урок 9. Обновление и очистка места
Контейнеры работают годами, а образы тем временем обновляются: выходят исправления ошибок и уязвимостей. Старые образы, остановленные контейнеры и кэш сборки при этом копятся на диске. В этом уроке — как обновлять и как чистить, ничего не потеряв.
Обновить сам Docker
Docker из официального репозитория обновляется вместе с системой:
sudo apt update
sudo apt upgradeПри обновлении служба Docker перезапускается, а с ней — контейнеры. Контейнеры с политикой unless-stopped или always поднимутся сами; остальные придётся запустить вручную. Обновлять сервер лучше в спокойное время.
Обновить контейнер до нового образа
Работающий контейнер привязан к тому образу, из которого создан, и сам не обновится. Порядок всегда один: скачать новый образ, удалить контейнер, создать его заново с теми же ключами.
docker pull nginx:alpine
docker stop web
docker rm web
docker run -d --name web -p 8080:80 --restart unless-stopped nginx:alpineВсё, что лежит в томах и подключённых папках, сохраняется. Всё, что было в слое контейнера, — нет; поэтому данные и держат в томах.
С Docker Compose то же самое — две команды в папке проекта:
docker compose pull
docker compose up -dpull скачивает свежие образы для всех сервисов, up -d пересоздаёт только те контейнеры, чей образ изменился.
Обновление в пределах тега (nginx:alpine, postgres:18) обычно безопасно: это исправления той же версии. Смена основной версии базы данных (postgres:17 → postgres:18) — отдельная работа: файлы базы новой версии часто несовместимы со старыми. Перед ней делают копию и читают инструкцию к образу.
Сколько места занимает Docker
Всё хранится в /var/lib/docker. Разбивку показывает команда:
docker system dfСтолбцы: TYPE (образы, контейнеры, тома, кэш сборки), TOTAL, ACTIVE (сколько используется), SIZE (сколько занято) и RECLAIMABLE — сколько можно освободить. С ключом -v — подробно по каждому образу, контейнеру и тому.
Не удаляйте файлы в /var/lib/docker вручную. Docker ведёт им учёт, и ручное удаление ломает образы и контейнеры. Чистить нужно командами docker … prune и docker rm/rmi.
Очистка по шагам
От безопасного к опасному:
| Команда | Что удаляет |
|---|---|
docker container prune | все остановленные контейнеры |
docker image prune | «висячие» образы — без тега и без контейнеров (остаются после обновлений и пересборок) |
docker builder prune | неиспользуемый кэш сборки образов (с -a — весь кэш) |
docker image prune -a | все образы, из которых не создан ни один контейнер |
docker network prune | сети без контейнеров |
docker volume prune | тома без контейнеров (по умолчанию только анонимные) |
Каждая команда сначала спрашивает подтверждение (y — да); ключ -f убирает вопрос — в скриптах осторожнее с ним.
Обычная уборка после обновлений:
docker image prune
docker builder pruneУдалённый образ не страшен: при следующем docker run или docker compose up он скачается снова. Остановленный контейнер — другое дело: вместе с ним пропадают данные из его слоя.
docker container prune удаляет все остановленные контейнеры, в том числе те, что вы остановили на время и собирались запустить снова. Перед ним посмотрите список: docker ps -a --filter status=exited.
Всё сразу: docker system prune
docker system pruneУдаляет остановленные контейнеры, неиспользуемые сети, висячие образы и кэш сборки — перед этим показывает список и спрашивает подтверждение. Тома не трогает.
Более сильные варианты:
docker system prune -a— ещё и все образы, из которых не создано ни одного контейнера;docker system prune --volumes— ещё и неиспользуемые анонимные тома.
Если сервис сейчас остановлен, его контейнер считается неиспользуемым: system prune удалит контейнер, а с -a — и образ. Ещё опаснее docker volume prune -a: он удалит все тома, к которым не подключён ни один контейнер, — например, базу данных проекта, для которого вы только что выполнили docker compose down. Перед любым prune смотрите docker ps -a и docker volume ls.
Логи растут
По умолчанию Docker хранит вывод контейнера в JSON-файле без ограничения размера. У разговорчивого сервиса за месяцы набегают гигабайты. Ограничение для всех новых контейнеров задаётся в файле /etc/docker/daemon.json (создайте его, если нет):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}Каждый контейнер будет хранить не больше трёх файлов по 10 МБ. Примените настройку:
sudo systemctl restart dockerНастройка действует только на контейнеры, созданные после неё. Уже работающие нужно пересоздать (для Compose — docker compose up -d --force-recreate). Одному контейнеру лимит можно задать при запуске: docker run --log-opt max-size=10m --log-opt max-file=3 ….
Ошибка в daemon.json (лишняя запятая, кавычки) не даст Docker запуститься после перезапуска — вместе со всеми контейнерами. Проверьте файл перед перезапуском, например python3 -m json.tool /etc/docker/daemon.json, а после — sudo systemctl status docker.
Коротко
- Docker обновляется через
apt upgrade; контейнеры с политикой перезапуска поднимаются сами. - Контейнер обновляют пересозданием:
pull,rm,run— илиdocker compose pullиup -d. - Смена основной версии базы данных — только с копией и по инструкции образа.
docker system dfпоказывает, что занимает место; файлы в/var/lib/dockerруками не трогают.- Безопасная уборка —
docker image pruneиdocker builder prune;system prune -aиvolume prune -a— только после проверки списков. - Рост логов ограничивают
max-sizeиmax-fileвdaemon.json; действует на новые контейнеры.