Диск на сервері з Docker закінчується швидше, ніж здається логічним: контейнери зупинені, образи начебто не використовуються, а місця все одно не вистачає. Проблема не в самому Docker, а в тому, що він за замовчуванням нічого не видаляє сам — старі образи, зупинені контейнери і невикористані томи накопичуються, доки адміністратор не втрутиться вручну. Ця стаття розбирає, куди йде місце і як його звільнити, не пошкодивши робочі сервіси.
З чого складається зайняте Docker місце на диску
Docker зберігає дані у кількох окремих категоріях, і кожна з них росте зі своєї причини. Образи (images) займають місце шарами: кожен крок у Dockerfile додає новий шар, і навіть застарілі версії образу лишаються на диску, доки їх явно не видалять. Контейнери (containers), включно із зупиненими, зберігають змінений поверх образу шар і логи. Томи (volumes) містять дані застосунків і не видаляються разом із контейнером за замовчуванням — це зроблено навмисно, щоб не втратити базу даних під час перестворення контейнера. Кеш збірки (build cache) накопичується під час кожної збірки образу і може займати істотну частину диска незалежно від того, скільки образів реально використовується.
Як подивитися, що саме займає місце
Перш ніж щось видаляти, варто побачити реальну картину по кожній категорії даних Docker:
docker system df
docker system df -v
Перша команда показує зведення по образах, контейнерах, томах і кеші збірки. Друга додає докладний список по кожному об'єкту, включно з тим, чи використовується він зараз активним контейнером, чи просто займає місце без діла. Якщо сервер уже налаштований за інструкцією зі статті «Налаштування Docker на VDS», ці команди доступні одразу після встановлення без додаткових кроків.
Порівняння способів очищення диска від Docker-даних
| Команда | Що видаляє | Ризик для робочих сервісів |
|---|---|---|
| docker container prune | Зупинені контейнери | Низький — робочі контейнери не чіпає |
| docker image prune | Образи без тегів, не пов'язані з жодним контейнером | Низький за використання без прапорця -a |
| docker image prune -a | Усі образи, не використовувані жодним контейнером | Середній — видалить і потрібні образи про запас |
| docker system prune --volumes | Контейнери, образи, кеш збірки і невикористані томи | Високий — томи можуть містити дані застосунків |
Якщо частина сервісів описана через docker-compose, після очищення корисно звіритися з файлом конфігурації — порядок перезбирання описаний у статті «Налаштування docker-compose».
Чому місце зникає знову після очищення
Через деякий час після прунінгу диск знову починає заповнюватися, і зазвичай причина одна з трьох:
- Логи контейнерів ростуть без обмеження, якщо в конфігурації Docker не задано ліміт на розмір лог-файлу
- CI/CD збирає нові образи на тому самому сервері, додаючи шари швидше, ніж старі встигають застаріти
- Томи з даними баз даних чи черг ростуть разом із навантаженням на сервіс і не є «сміттям», яке можна просто видалити
Відстежити момент, коли місце знову починає закінчуватися, простіше через постійний контроль зайнятості диска — як його налаштувати, описано у статті «Моніторинг VDS».
Що робити: порядок безпечного очищення диска
Щоб не видалити дані робочого застосунку разом зі сміттям, варто діяти за кроками, а не однією загальною командою.
- Подивитися зведення через docker system df і визначити, яка категорія даних займає найбільше місця
- Видалити зупинені контейнери командою docker container prune, якщо вони вже не потрібні для налагодження
- Видалити невикористані образи без прапорця -a першого разу, щоб не зачепити образи, які ще можуть знадобитися
- Обмежити розмір логів контейнерів у конфігурації Docker, щоб місце не закінчувалося знову тим самим способом
- Налаштувати регулярну перевірку вільного місця на диску, а не разове ручне очищення
Часті питання
Чому Docker займає так багато місця на диску?
Основна причина — шарувата структура образів і відсутність автоматичного очищення за замовчуванням: кожна збірка додає дані, а старі образи, контейнери і кеш лишаються на диску, доки їх явно не видалять командами prune.
Скільки місця на диску зазвичай займає Docker?
Точний обсяг залежить від кількості образів, частоти збірок і розміру томів конкретного проєкту, тому загального числа не існує — надійніше один раз подивитися реальну картину командою docker system df на своєму сервері.
Чи безпечно виконувати docker system prune на робочому сервері?
Сама команда без прапорця --volumes не чіпає дані в томах і не зупиняє робочі контейнери, тому в базовому вигляді вона достатньо безпечна. Прапорець --volumes варто додавати лише після перевірки, які томи реально не використовуються.