Гид по технологиям

Анализ изменений файловой системы контейнера Docker

• 6 min read • DevOps • Обновлено 30 Nov 2025
Анализ изменений файловой системы контейнера Docker
Анализ изменений файловой системы контейнера Docker

Логотип Docker

Docker предоставляет утилиту docker diff для перечисления добавленных, изменённых и удалённых путей внутри файловой системы конкретного контейнера. Это помогает находить случайные записи в корневой файловой системе контейнера, отличающие его от исходного образа. Для полного сравнения можно использовать docker export, копирование файлов из образа или инструменты для анализа слоёв образа.

Быстрые ссылки

  • Использование docker diff
  • Интерпретация вывода docker diff
  • Просмотр содержимого в исходном образе
  • Сравнение двух контейнеров
  • Когда docker diff не показывает изменения
  • Альтернативные подходы и рекомендации
  • Чек-листы для ролей
  • Краткая методология расследования
  • Глоссарий
  • Итог

Введение

Контейнеры Docker при создании получают файловую систему из образа. После создания есть верхний изменяемый слой, куда попадают записи во время выполнения контейнера. Если процессы внутри контейнера записывают данные в этот слой, его файловая система перестаёт совпадать с содержимым образа.

Отслеживание таких изменений полезно для отладки, расследования потерянных данных или проверки, что всё пишется в ожидаемые тома (volumes) вместо временной файловой системы контейнера.

Важно: файлы, записанные в изменяемый слой контейнера, будут потеряны при удалении контейнера, если они не смонтированы в том или не скопированы наружу.

Использование docker diff

Команда docker diff показывает список путей внутри контейнера, которые были добавлены (A), изменены (C) или удалены (D) относительно исходного образа. Она принимает имя или ID контейнера.

Пример запуска демонстрационного контейнера:

$ docker run -it --name alpine alpine:latest sh

Этот запуск создаёт интерактивную оболочку в новом контейнере на базе образа alpine:latest. В отдельном терминале выполните:

$ docker diff alpine

Для свежесозданного контейнера обычно нет вывода — файловая система совпадает с образом.

В первом терминале внутри контейнера создадим файлы и изменим историю шелла:

/ # touch demo
/ # touch example

После этого повторите docker diff во втором терминале:

$ docker diff alpine

Пример возможного вывода:

A /example C /root C /root/.ash_history A /demo

Пояснение: были добавлены файлы /example и /demo, а также изменён файл истории команд /root/.ash_history — это отражается как изменение каталога /root.

Интерпретация вывода docker diff

Каждая строка в выводе начинается с одного из префиксов:

  • A — путь был добавлен в файловую систему контейнера и отсутствовал в образе.
  • C — содержимое файла или каталога отличается от версии в образе.
  • D — путь, присутствовавший в образе, был удалён в контейнере.

Это даёт оперативный список подозрительных изменений, которые могут объяснить неправильное поведение приложения или отсутствие данных.

Важно:

Изменения в путях, которые смонтированы в Docker volume, не показываются через docker diff. Файлы в томах хранятся вне изменяемого уровня контейнера и не отображаются как A/C/D.

Просмотр содержимого в исходном образе

Иногда нужно сравнить файл в контейнере с тем, что было в образе при создании контейнера. Для этого можно создать контейнер, не запуская его, с помощью docker create, затем скопировать файл наружу:

$ docker create --name temp-container my-image:latest
$ docker cp temp-container:/path/to/file copied-file
$ docker rm temp-container

Альтернативный вариант — запустить контейнер с новым entrypoint, который выведет содержимое файла в stdout. Флаг –rm удалит контейнер после выполнения команды:

$ docker run --rm --entrypoint cat alpine:latest /path/to/file > copied-file

Обе техники позволяют получить «чистую» копию файла из образа без влияния entrypoint-скриптов инициализированного контейнера.

Сравнение двух контейнеров

Если нужно понять, чем отличаются два запущенных контейнера одного образа, сначала сохраните их списки изменений:

$ docker diff first-container > first
$ docker diff second-container > second

Затем воспользуйтесь стандартной утилитой diff:

$ diff first second

Пример фрагмента вывода diff:

3c3
< A /a-new-file
---
> A /demo

Это показывает, что в первом контейнере был файл /a-new-file, а во втором — /demo.

Для более полного сравнения можно экспортировать контейнеры и посмотреть список файлов через tar:

$ docker export demo-container | tar tv

Вывод tar даст подробности о правах доступа, владельцах и времени изменения, что помогает понять, когда и как менялся файл.

Когда docker diff не показывает изменения

  • Путь смонтирован как том (volume) или bind mount: тогда записи находятся вне изменяемого слоя контейнера и не видны docker diff.
  • Если процесс записывает данные в tmpfs, т.е. в память, они не будут учтены после перезапуска контейнера.
  • Некоторые изменения внутри слоёв образа до создания контейнера не покажутся: docker diff сравнивает именно текущий контейнер с его родительским образом.

Если вы подозреваете, что изменения находятся в томах, проверьте список томов и точки монтирования:

$ docker inspect --format '{{ json .Mounts }}' 

Альтернативные подходы и инструменты

  • docker export + tar — полный снимок файловой системы контейнера; удобен для сравнения списков файлов и прав.
  • docker commit — создаёт новый образ из текущего состояния контейнера, затем docker history и анализ слоёв помогут понять, какие изменения оказались в новом образе.
  • docker history — показывает историю слоёв образа, но не изменения в изменяемом слое контейнера.
  • Dive (https://github.com/wagoodman/dive) — визуальный анализатор слоёв образа; полезен для поиска, на каком слое был добавлен файл.
  • rsync или tar через docker cp — копирование подозрительных файлов наружу для детального анализа.

Когда уместно использовать тот или иной инструмент:

  • Быстрый осмотр изменённых путей: docker diff.
  • Получение полного каталога для сравнения: docker export | tar tv.
  • Поиск источника изменения внутри образа: docker history + Dive.

Чек-лист для ролей

Инженер разработки:

  • Проверить, не записывает ли приложение данные в корневой FS.
  • Убедиться, что пользователей нет случайных команд через docker exec.
  • Переместить персистентные данные в volume и проверить конфигурацию пути хранения.

Операции/DevOps:

  • Сравнить контейнер с образцом staging/production.
  • Проверить точки монтирования через docker inspect.
  • При необходимости экспортировать контейнеры и сравнить tar-списки.

Инженер безопасности:

  • Проверить изменения в /root и /home на наличие неожиданных ключей или скриптов.
  • Убедиться, что SSH-ключи и секреты не были записаны в изменяемый слой.
  • Просмотреть права доступа и владельцев файлов в экспортированной версии.

Краткая методология расследования

  1. Запустите docker diff для подозрительного контейнера и сохраните вывод.
  2. Проверьте, не смонтирован ли путь как volume (docker inspect).
  3. Если путь не в volume, сравните файл с версией в исходном образе (docker create + docker cp или docker run –entrypoint cat).
  4. При необходимости экспортируйте контейнер и сравните списки файлов через tar и diff.
  5. Проанализируйте логи приложения и историю команд (например, /root/.ash_history).
  6. Внедрите исправления: перенаправьте записи в volume, измените конфигурацию или обновите образ.

Шпаргалка: полезные команды

docker diff 
docker inspect --format '{{ json .Mounts }}' 
docker create --name tmp 
docker cp tmp:/path/to/file ./file
docker rm tmp
docker run --rm --entrypoint cat  /path/to/file > file
docker export  | tar tv > list.txt
diff first-list.txt second-list.txt

Глоссарий — 1 строка на термин

  • Образ (image): неизменяемый набор слоёв, откуда создаётся контейнер.
  • Контейнер: запущенная копия образа с добавленным изменяемым верхним слоём.
  • Изменяемый слой (writable layer): слой, в который пишутся все изменения контейнера.
  • Том (volume): место хранения вне изменяемого слоя контейнера для персистентных данных.
  • A/C/D: обозначения в выводе docker diff — добавлено/изменено/удалено.

Риски и рекомендации по безопасности

  • Не храните секреты или приватные ключи в изменяемом слое контейнера. Они будут утеряны при пересоздании контейнера и могут быть доступны тем, у кого есть доступ к образам/экспортам.
  • Используйте тома для персистентных данных и ограничьте права доступа к ним.
  • Регулярно проверяйте контейнеры на неожиданные изменённые пути, особенно в production.

Примеры случаев, когда метод может не помочь

  • Если изменения происходят только в привязанном томе — docker diff их не покажет.
  • Если запись в контейнере происходит эпизодически и контейнер перезапускается, следы могут исчезнуть.
  • Если у вас нет доступа к API Docker на хосте, команды не выполнятся — используйте удалённые инструменты логирования.

Итог

docker diff — простой и быстрый инструмент для выявления различий между текущим состоянием контейнера и его исходным образом. В сочетании с docker export, docker cp и инструментами анализа слоёв (например, Dive) вы получаете рабочий набор методов для расследования причин несоответствий и поиска утечек данных в файловой системе контейнера.

Ключевые рекомендации:

  • Используйте тома для персистентных данных.
  • Регулярно проверяйте изменения в контейнерах на production-серверах.
  • Экспортируйте и сравнивайте контейнеры, если нужен детальный анализ.

Примечание: docker diff не укажет причину изменения (какой процесс записал файл), но даёт хороший отправной список для дальнейшего расследования.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро