<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Docker: как очистить логи контейнера без перезапуска и просто]]></title><description><![CDATA[<p dir="auto">Логи контейнеров в Docker быстро разрастаются и съедают место на диске. Это приводит к ошибкам, когда заканчивается пространство, и контейнеры начинают глючить. В этой статье разберем, как найти логи, очистить их вручную и настроить автоматическую ротацию - без остановки работы.</p>
<p dir="auto">Зачем это нужно? Представь, что на сервере крутится десяток контейнеров, каждый пишет гигабайты логов за день. Без очистки диск заполняется за неделю, и вся система ложится. Мы пройдем по шагам: от поиска файлов до cron-задач и лимитов в Docker. После этого твои контейнеры будут работать стабильно, а место на диске освободится.</p>
<h2>Где хранятся логи контейнеров Docker</h2>
<p dir="auto">Логи Docker по умолчанию пишутся в JSON-файлы на хосте, обычно в /var/lib/docker/containers/. Каждый контейнер имеет свой файл с суффиксом -json.log. Эти файлы растут без остановки, если не настроено ограничение. Например, популярный веб-сервер Nginx в контейнере может генерировать логи ошибок и доступа, которые за сутки весят сотни мегабайт.</p>
<p dir="auto">Чтобы понять проблему, посмотрим реальный сценарий. Допустим, у тебя контейнер my-app, который пишет логи от Node.js приложения. Без контроля файл разрастается до 10 ГБ, и df -h показывает 95% заполнения диска. Docker не останавливает контейнеры автоматически - он просто падает с ошибками I/O. Теперь логично перейти к командам: сначала найдем путь, потом очистим.</p>
<ul>
<li><strong>docker inspect --format=‘{{.LogPath}}’ &lt;container_id&gt;</strong> - покажет точный путь к файлу лога для конкретного контейнера. Замени &lt;container_id&gt; на ID или имя.</li>
<li><strong>ls -lh /var/lib/docker/containers/<em>/</em>-json.log</strong> - выведет размеры всех лог-файлов сразу, чтобы увидеть, кто жрет место.</li>
<li><strong>docker ps -q | xargs docker inspect --format=‘{{.LogPath}}’</strong> - список путей для всех запущенных контейнеров.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Команда</th>
<th>Что делает</th>
<th>Пример вывода</th>
</tr>
</thead>
<tbody>
<tr>
<td>docker inspect --format=‘{{.LogPath}}’ my-app</td>
<td>Путь к логу одного контейнера</td>
<td>/var/lib/docker/containers/abc123/abc123-json.log</td>
</tr>
<tr>
<td>du -sh /var/lib/docker/containers/<em>/</em>-json.log</td>
<td>Общий размер логов</td>
<td>2.5G /var/lib/docker/containers/xyz/xyz-json.log</td>
</tr>
<tr>
<td>truncate -s 0 /var/lib/docker/containers/<em>/</em>-json.log</td>
<td>Быстрая очистка всех</td>
<td>(файлы обнуляются мгновенно)</td>
</tr>
</tbody>
</table>
<h2>Очистка логов без остановки контейнера</h2>
<p dir="auto">Очистка логов - это не удаление файла, а обнуление его содержимого. Docker продолжает писать в тот же дескриптор, так что контейнер не замечает изменений. Основная команда использует echo или truncate, чтобы записать пустоту в файл. Это работает на запущенных контейнерах, без риска потери данных в памяти.</p>
<p dir="auto">Возьмем пример: контейнер с базой данных PostgreSQL пишет query-логи. Файл вырос до 5 ГБ, диск на исходе. Выполняем очистку - и место освобождается за секунды. Docker logs после этого покажет только новые записи. <em>Важно: выполняй от root или с sudo, иначе права не хватит.</em> Если контейнеров много, автоматизируй через скрипт.</p>
<ol>
<li>Для одного контейнера: <code>sudo sh -c 'echo "" &gt; $(docker inspect --format="{{.LogPath}}" my-app)'</code> - echo пишет пустую строку, файл становится 0 байт.</li>
<li>Для всех: <code>truncate -s 0 /var/lib/docker/containers/*/*-json.log</code> - truncate быстрее, не создает временные файлы.</li>
<li>Проверка: <code>docker logs my-app</code> - вывод пустой, новые логи пишутся нормально.</li>
<li><em>Нюанс: если драйвер логов не json-file, команда не сработает - проверь docker info | grep Logging.</em></li>
</ol>
<p dir="auto"><strong>Преимущества truncate:</strong> быстрее echo на больших файлах, не меняет inode. После очистки контейнер продолжает логировать без перезапусков.</p>
<h2>Автоматическая ротация и лимиты логов</h2>
<p dir="auto">Ручная очистка хороша разово, но для продакшена нужна автоматизация. Docker поддерживает ротацию через параметры --log-opt, а cron-задачи обеспечат ежедневную уборку. Это предотвращает рост логов заранее, а не когда диск полный.</p>
<p dir="auto">Пример: в docker-compose.yml добавь max-size: 10m - логи одного контейнера не превысят 10 МБ. Или настрой cron на truncate каждые 6 утра. В кластерах с Kubernetes это решается через fluentd или ELK, но для простого Docker хватит базовых инструментов. Подведем к настройке шаг за шагом.</p>
<ul>
<li><strong>В docker run:</strong> <code>docker run --log-opt max-size=10m --log-opt max-file=3 my-image</code> - лимит 10 МБ на файл, 3 файла всего.</li>
<li><strong>В docker-compose.yml:</strong><pre><code class="language-yaml">services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
</code></pre>
</li>
<li><strong>Cron для очистки:</strong> <code>crontab -e</code>, добавь <code>10 6 * * * truncate -s 0 /var/lib/docker/containers/*/*-json.log</code> - ежедневно в 06:10.</li>
</ul>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Метод</th>
<th>Плюсы</th>
<th>Минусы</th>
</tr>
</thead>
<tbody>
<tr>
<td>–log-opt max-size</td>
<td>Автоматическая ротация</td>
<td>Нужно перезапускать контейнеры</td>
</tr>
<tr>
<td>Cron truncate</td>
<td>Работает на запущенных</td>
<td>Может потерять свежие логи за минуту</td>
</tr>
<tr>
<td>docker system prune</td>
<td>Очищает все неиспользуемое</td>
<td>Не трогает логи работающих</td>
</tr>
</tbody>
</table>
<h2>Масштабная уборка Docker - что еще чистить</h2>
<p dir="auto">Логи - не единственная проблема. Docker копит образы, volumes и stopped контейнеры, которые жрут гигабайты. Команда docker system prune удаляет висячие ресурсы, но для логов она не подходит. Используй в комбо с очисткой json.log. На сервере с 50 ГБ Docker после prune + truncate освобождается до 20 ГБ.</p>
<p dir="auto">Реальный кейс: после деплоя 10 образов накопилось 15 ГБ. Prune -a удалила неиспользуемое, truncate обнулила логи - диск дышит. <em>Не путай: prune не трогает running контейнеры.</em> Добавь в скрипт для еженедельной уборки.</p>
<ol>
<li><code>docker system prune -a</code> - удалит все неиспользуемое (осторожно на проде!).</li>
<li><code>docker container prune</code> - stopped контейнеры.</li>
<li><code>docker image prune -a</code> - dangling образы.</li>
<li><code>docker volume prune</code> - unused volumes.</li>
</ol>
<p dir="auto"><strong>Комбо-скрипт:</strong></p>
<pre><code class="language-bash">#!/bin/bash
truncate -s 0 /var/lib/docker/containers/*/*-json.log
docker system prune -f
</code></pre>
<h2>Когда логи критичны - мониторинг и альтернативы</h2>
<p dir="auto">Иногда очистка логов - не лучший выход, если нужны исторические данные. Используй docker logs с флагами: --tail 100 для последних строк, --since 1d для дня. Или переключи драйвер на syslog/journald - логи уйдут в системный логгер хоста.</p>
<p dir="auto">В продакшене подключи Prometheus или ELK для хранения логов вне Docker. Это решает проблему места навсегда. <em>Минус: overhead на сетевые запросы.</em> Для малого проекта cron + лимиты - золотая середина. Остается вопрос: а что с контейнерами в overlayfs? Там prune работает иначе.</p>
<p dir="auto">Дополнительные фичи docker logs:</p>
<ul>
<li><code>docker logs --tail 50 my-app</code> - последние 50 строк.</li>
<li><code>docker logs --since "2026-02-25" my-app</code> - логи с даты.</li>
<li><code>docker logs -f my-app</code> - follow в реальном времени.</li>
</ul>
<h2>Логи Docker под контролем - итоги и тонкости</h2>
<p dir="auto">Мы разобрали полный цикл: от поиска логов до автоматизации ротации и общей уборки Docker. Теперь твой сервер не упадет от переполненного диска, а контейнеры будут работать чисто. <strong>Ключ: комбинируй truncate с --log-opt для надежности.</strong></p>
<p dir="auto">Осталось упомянуть edge-кейсы - например, ротацию в Docker Swarm или с внешними драйверами вроде awslogs. Если контейнеры в production, протестируй на staging. Над чем подумать: интегрировать алерты на размер логов через скрипты.</p>
]]></description><link>https://forum.exlends.ru/topic/781/docker-kak-ochistit-logi-kontejnera-bez-perezapuska-i-prosto</link><generator>RSS for Node</generator><lastBuildDate>Wed, 20 May 2026 07:27:23 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/781.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 26 Feb 2026 09:27:06 GMT</pubDate><ttl>60</ttl></channel></rss>